diff --git a/changelog.d/875-cgt-observation-year.fixed.md b/changelog.d/875-cgt-observation-year.fixed.md new file mode 100644 index 000000000..4803b7929 --- /dev/null +++ b/changelog.d/875-cgt-observation-year.fixed.md @@ -0,0 +1,9 @@ +Measure CGT in FY2024–25 while retaining the 2025 calibration index and 2024 +exported data. Pin individual HMRC gains, taxpayer count and liability facts; +retain the replaced OBR cash forecast as optional diagnostic provenance with +explicit availability. Retire its obsolete fit exemption, preserve its signed +history, update live compile-parity receipts and publish aggregate fit evidence. + +Retain the merged upstream claimant-role graph prerequisite without duplicate +commits. Compose the retired fit exemptions and document that the recorded +national comparison predates main's changed fitting surface and gate disposition. diff --git a/docs/evidence/uk-cgt-889/calibration-comparison.json b/docs/evidence/uk-cgt-889/calibration-comparison.json new file mode 100644 index 000000000..6886bd603 --- /dev/null +++ b/docs/evidence/uk-cgt-889/calibration-comparison.json @@ -0,0 +1,5128 @@ +{ + "scope": "Held-source year/scope/liability-target correction; no source or tail adjustment; not dataset certification.", + "runtime": { + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0" + }, + "calibration_index": 2025, + "output_base_period": 2024, + "household_ids_and_initial_weights_exact": true, + "base_export_audit": { + "control": { + "base_period": 2024, + "original_columns_preserved_exactly": { + "person": { + "rows": 113590, + "unchanged_columns": 125 + }, + "benunit": { + "rows": 61213, + "unchanged_columns": 21 + }, + "household": { + "rows": 52846, + "unchanged_columns": 72 + } + }, + "fitted_weights_match_capture_exactly": true + }, + "candidate": { + "base_period": 2024, + "original_columns_preserved_exactly": { + "person": { + "rows": 113590, + "unchanged_columns": 125 + }, + "benunit": { + "rows": 61213, + "unchanged_columns": 21 + }, + "household": { + "rows": 52846, + "unchanged_columns": 72 + } + }, + "fitted_weights_match_capture_exactly": true + } + }, + "taxpayer_support_and_concentration": { + "definition": "Base-2024 net gains after float32 engine input conversion, strictly above the 2024 \u00a33,000 AEA; reconstructed household rows match the captured candidate matrix.", + "source_skeleton_key": [ + "source_year", + "source_household_id" + ], + "lineage_limit": "Distinct FRS skeleton keys do not prove independent statistical CGT donors.", + "physical_taxpayer_people": 707, + "physical_taxpayer_households": 707, + "physical_taxpayer_source_skeletons": 692, + "stages": { + "initial": { + "represented_taxpayer_people": 357787.8291737345, + "represented_taxpayer_gains_gbp": 63762165051.802, + "person_weight_ess": 506.8020824429911, + "household_weight_ess": 506.8020824429911, + "source_skeleton_weight_ess": 494.6479785803121, + "largest_household_gain_share": 0.11424813227010697, + "top_10_household_gain_share": 0.37361221282517243, + "largest_source_skeleton_gain_share": 0.11475931361315242, + "top_10_source_skeleton_gain_share": 0.38297052806738463 + }, + "control": { + "represented_taxpayer_people": 583538.7092819214, + "represented_taxpayer_gains_gbp": 127484859973.90018, + "person_weight_ess": 490.703897372952, + "household_weight_ess": 490.703897372952, + "source_skeleton_weight_ess": 478.8726044141506, + "largest_household_gain_share": 0.12386301344701703, + "top_10_household_gain_share": 0.4028749122411472, + "largest_source_skeleton_gain_share": 0.12439481028703797, + "top_10_source_skeleton_gain_share": 0.4129461030071929 + }, + "candidate": { + "represented_taxpayer_people": 551037.2955932617, + "represented_taxpayer_gains_gbp": 108031570316.76562, + "person_weight_ess": 384.5861125064382, + "household_weight_ess": 384.5861125064382, + "source_skeleton_weight_ess": 377.5010420553707, + "largest_household_gain_share": 0.11512850660541973, + "top_10_household_gain_share": 0.3687724230339357, + "largest_source_skeleton_gain_share": 0.11565982289260121, + "top_10_source_skeleton_gain_share": 0.3782094766996847 + } + } + }, + "non_cgt_coefficients_and_targets_exact": 363, + "cgt_matched_observed_year_comparison": [ + { + "name": "hmrc.cgt.gains_total@2025", + "matched_observed_2024_individual_target": 119258000000.0, + "measurement_2024_under_control_weights": 127484859973.9001, + "matched_error_under_control_weights": 0.06898371575827289, + "measurement_2024_under_candidate_weights": 108031570316.76561, + "matched_error_under_candidate_weights": -0.09413565281351684, + "candidate_source_metadata": { + "ledger_source": "policyengine-ledger-data", + "ledger_fact_key": "ledger.aggregate_fact.v2:12060d20a417d85d67cf24e8", + "ledger_source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.individuals_gains", + "ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:12060d20a417d85d67cf24e8", + "ledger_semantic_fact_key": "ledger.semantic_fact.v2:1c1a1339fa42073bcb95e119", + "ledger_legacy_fact_key": "ledger.fact.v1:81f33d75ccbf5ee5117b3c7c", + "ledger_observed_measure_key": "ledger.observed_measure.v2:eefc11e7f0292ad4350062e8", + "ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", + "ledger_measure_concept": "hmrc.cgt_gains_individuals", + "ledger_measure_unit": "gbp", + "ledger_source_concept": "hmrc.cgt_gains_individuals", + "ledger_concept_relation": "source_label", + "ledger_concept_authority": "hmrc", + "ledger_period_type": "tax_year", + "ledger_fact_period": "2024", + "ledger_assertion": "observation", + "ledger_geography_level": "country", + "ledger_geography_id": "K02000001", + "ledger_geography_vintage": "current", + "ledger_entity_name": "tax_unit", + "ledger_entity_role": "taxpayer", + "ledger_domain": "capital_gains_tax", + "ledger_layout_record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", + "ledger_layout_record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", + "ledger_layout_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_layout_groupby_value_id": "ty2024", + "ledger_layout_measure_id": "individuals_gains", + "ledger_aggregation_method": "sum", + "ledger_resolved_assertion": "observation", + "contract_target_id": "hmrc.cgt.gains_total", + "measure_kind": "prepared_column", + "observation_basis": "individuals_observed_disposal_year_2024_net_gains_and_aea", + "measurement_period": "2024", + "source_period_policy": "exact_observation", + "ledger_value_operation": "identity", + "ledger_assertion_policy": "observed_only", + "ledger_period_match_policy": "latest_not_after", + "ledger_selector_aggregate_fact_key": "ledger.aggregate_fact.v2:12060d20a417d85d67cf24e8", + "ledger_selector_entity_name": "tax_unit", + "ledger_selector_geography_id": "K02000001", + "ledger_selector_geography_level": "country", + "ledger_selector_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_selector_period_type": "tax_year", + "ledger_selector_period_value": "2024", + "ledger_selector_source_concept": "hmrc.cgt_gains_individuals", + "ledger_selector_source_name": "hmrc", + "uprating_from_period": "2024", + "uprating_to_period": "2025" + } + }, + { + "name": "hmrc.cgt.taxpayers_total@2025", + "matched_observed_2024_individual_target": 551000.0, + "measurement_2024_under_control_weights": 583538.7092819214, + "matched_error_under_control_weights": 0.05905391884196254, + "measurement_2024_under_candidate_weights": 551037.2955932617, + "matched_error_under_candidate_weights": 6.768710210838249e-05, + "candidate_source_metadata": { + "ledger_source": "policyengine-ledger-data", + "ledger_fact_key": "ledger.aggregate_fact.v2:31d709fc393c2bf4d04efca5", + "ledger_source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.individuals_count", + "ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:31d709fc393c2bf4d04efca5", + "ledger_semantic_fact_key": "ledger.semantic_fact.v2:813226f79ce5af29f274cef7", + "ledger_legacy_fact_key": "ledger.fact.v1:2944e255963210efe631cbb3", + "ledger_observed_measure_key": "ledger.observed_measure.v2:4cc22757ebd4fd8bdb5b45ad", + "ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", + "ledger_measure_concept": "hmrc.cgt_taxpayers_individuals", + "ledger_measure_unit": "count", + "ledger_source_concept": "hmrc.cgt_taxpayers_individuals", + "ledger_concept_relation": "source_label", + "ledger_concept_authority": "hmrc", + "ledger_period_type": "tax_year", + "ledger_fact_period": "2024", + "ledger_assertion": "observation", + "ledger_geography_level": "country", + "ledger_geography_id": "K02000001", + "ledger_geography_vintage": "current", + "ledger_entity_name": "tax_unit", + "ledger_entity_role": "taxpayer", + "ledger_domain": "capital_gains_tax", + "ledger_layout_record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", + "ledger_layout_record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", + "ledger_layout_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_layout_groupby_value_id": "ty2024", + "ledger_layout_measure_id": "individuals_count", + "ledger_aggregation_method": "sum", + "ledger_resolved_assertion": "observation", + "contract_target_id": "hmrc.cgt.taxpayers_total", + "measure_kind": "prepared_column", + "observation_basis": "individuals_observed_disposal_year_2024_net_gains_and_aea", + "measurement_period": "2024", + "source_period_policy": "exact_observation", + "ledger_value_operation": "identity", + "ledger_assertion_policy": "observed_only", + "ledger_period_match_policy": "latest_not_after", + "ledger_selector_aggregate_fact_key": "ledger.aggregate_fact.v2:31d709fc393c2bf4d04efca5", + "ledger_selector_entity_name": "tax_unit", + "ledger_selector_geography_id": "K02000001", + "ledger_selector_geography_level": "country", + "ledger_selector_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_selector_period_type": "tax_year", + "ledger_selector_period_value": "2024", + "ledger_selector_source_concept": "hmrc.cgt_taxpayers_individuals", + "ledger_selector_source_name": "hmrc", + "uprating_from_period": "2024", + "uprating_to_period": "2025" + } + }, + { + "name": "hmrc.cgt.liability_total@2025", + "matched_observed_2024_individual_target": 22503000000.0, + "measurement_2024_under_control_weights": 26986389383.858234, + "matched_error_under_control_weights": 0.19923518570227228, + "measurement_2024_under_candidate_weights": 22653870443.41538, + "matched_error_under_candidate_weights": 0.006704459112801785, + "candidate_source_metadata": { + "ledger_source": "policyengine-ledger-data", + "ledger_fact_key": "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7", + "ledger_source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.individuals_tax", + "ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7", + "ledger_semantic_fact_key": "ledger.semantic_fact.v2:9bcc5d8064b3b8a364fb8093", + "ledger_legacy_fact_key": "ledger.fact.v1:e3a856b99a58164c4ee798dc", + "ledger_observed_measure_key": "ledger.observed_measure.v2:bf19586c602a63e134a08e54", + "ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", + "ledger_measure_concept": "hmrc.cgt_tax_individuals", + "ledger_measure_unit": "gbp", + "ledger_source_concept": "hmrc.cgt_tax_individuals", + "ledger_concept_relation": "source_label", + "ledger_concept_authority": "hmrc", + "ledger_period_type": "tax_year", + "ledger_fact_period": "2024", + "ledger_assertion": "observation", + "ledger_geography_level": "country", + "ledger_geography_id": "K02000001", + "ledger_geography_vintage": "current", + "ledger_entity_name": "tax_unit", + "ledger_entity_role": "taxpayer", + "ledger_domain": "capital_gains_tax", + "ledger_layout_record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", + "ledger_layout_record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", + "ledger_layout_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_layout_groupby_value_id": "ty2024", + "ledger_layout_measure_id": "individuals_tax", + "ledger_aggregation_method": "sum", + "ledger_resolved_assertion": "observation", + "contract_target_id": "hmrc.cgt.liability_total", + "measure_kind": "prepared_column", + "observation_basis": "individuals_observed_disposal_year_2024_liability", + "measurement_period": "2024", + "source_period_policy": "exact_observation", + "ledger_value_operation": "identity", + "ledger_assertion_policy": "observed_only", + "ledger_period_match_policy": "latest_not_after", + "ledger_selector_aggregate_fact_key": "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7", + "ledger_selector_entity_name": "tax_unit", + "ledger_selector_geography_id": "K02000001", + "ledger_selector_geography_level": "country", + "ledger_selector_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_selector_period_type": "tax_year", + "ledger_selector_period_value": "2024", + "ledger_selector_source_concept": "hmrc.cgt_tax_individuals", + "ledger_selector_source_name": "hmrc", + "uprating_from_period": "2024", + "uprating_to_period": "2025", + "cgt_cash_diagnostic_role": "diagnostic_only_not_in_fit", + "cgt_cash_reconciliation_status": "unresolved", + "cgt_cash_diagnostic_value_gbp": "21801546197.09165", + "cgt_cash_diagnostic_period": "2025", + "cgt_cash_diagnostic_source": "obr | EFO March 2026 detailed forecast tables: receipts | efo_receipts.xlsx | efo_march_2026 | https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", + "cgt_cash_diagnostic_ledger_source": "policyengine-ledger-data", + "cgt_cash_diagnostic_ledger_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420", + "cgt_cash_diagnostic_ledger_source_record_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025.capital_gains_tax.amount", + "cgt_cash_diagnostic_ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420", + "cgt_cash_diagnostic_ledger_semantic_fact_key": "ledger.semantic_fact.v2:543340b7e41c1c5d710aafde", + "cgt_cash_diagnostic_ledger_legacy_fact_key": "ledger.fact.v1:4ae0218b8aabc16818fee69b", + "cgt_cash_diagnostic_ledger_observed_measure_key": "ledger.observed_measure.v2:6bdb8644c98a705e2c4d4d26", + "cgt_cash_diagnostic_ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "cgt_cash_diagnostic_ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:ecb00e907376ba856934e4ad", + "cgt_cash_diagnostic_ledger_measure_concept": "obr.capital_gains_tax", + "cgt_cash_diagnostic_ledger_measure_unit": "gbp", + "cgt_cash_diagnostic_ledger_source_concept": "obr.capital_gains_tax", + "cgt_cash_diagnostic_ledger_concept_relation": "source_label", + "cgt_cash_diagnostic_ledger_concept_authority": "obr", + "cgt_cash_diagnostic_ledger_period_type": "fiscal_year", + "cgt_cash_diagnostic_ledger_fact_period": "2025", + "cgt_cash_diagnostic_ledger_assertion": "source_projection", + "cgt_cash_diagnostic_ledger_geography_level": "country", + "cgt_cash_diagnostic_ledger_geography_id": "K02000001", + "cgt_cash_diagnostic_ledger_geography_vintage": "current", + "cgt_cash_diagnostic_ledger_entity_name": "person", + "cgt_cash_diagnostic_ledger_entity_role": "resident_population", + "cgt_cash_diagnostic_ledger_domain": "public_sector_finances", + "cgt_cash_diagnostic_ledger_layout_record_set_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025", + "cgt_cash_diagnostic_ledger_layout_record_set_spec_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025.v1", + "cgt_cash_diagnostic_ledger_layout_groupby_dimension": "obr.efo_line", + "cgt_cash_diagnostic_ledger_layout_groupby_value_id": "capital_gains_tax", + "cgt_cash_diagnostic_ledger_layout_measure_id": "amount", + "cgt_cash_diagnostic_ledger_aggregation_method": "sum", + "cgt_cash_diagnostic_ledger_resolved_assertion": "source_projection", + "cgt_cash_diagnostic_diagnostic_role": "cash_receipts_forecast_unreconciled", + "cgt_cash_diagnostic_ledger_value_operation": "identity", + "cgt_cash_diagnostic_ledger_assertion_policy": "allow_source_projection", + "cgt_cash_diagnostic_ledger_period_match_policy": "exact", + "cgt_cash_diagnostic_ledger_selector_entity_name": "person", + "cgt_cash_diagnostic_ledger_selector_geography_id": "K02000001", + "cgt_cash_diagnostic_ledger_selector_geography_level": "country", + "cgt_cash_diagnostic_ledger_selector_source_concept": "obr.capital_gains_tax", + "cgt_cash_diagnostic_ledger_selector_source_name": "obr" + } + } + ], + "non_cgt_thresholds": { + "0.1": { + "control_within": 347, + "candidate_within": 348, + "new_misses": [], + "recoveries": [ + "obr.esa@2025" + ] + }, + "0.25": { + "control_within": 361, + "candidate_within": 361, + "new_misses": [], + "recoveries": [] + } + }, + "non_cgt_rows": [ + { + "name": "dfe.funded_childcare.early_learning_2_year_olds@2025", + "family": "dfe_funded_childcare", + "target": 95031.0, + "control_estimate": 94926.19609069824, + "candidate_estimate": 94730.13942718506, + "control_relative_error": -0.001102839171446768, + "candidate_relative_error": -0.0031659203082672117, + "absolute_error_change_pp": 0.20630811368204435 + }, + { + "name": "dfe.funded_childcare.universal_only_children@2025", + "family": "dfe_funded_childcare", + "target": 396965.0, + "control_estimate": 398097.26737213135, + "candidate_estimate": 396970.9009170532, + "control_relative_error": 0.0028523103349951447, + "candidate_relative_error": 1.486508143847104e-05, + "absolute_error_change_pp": -0.28374452535566735 + }, + { + "name": "dfe.funded_childcare.working_parent_children_2_to_4@2025", + "family": "dfe_funded_childcare", + "target": 621482.0, + "control_estimate": 620693.0394058228, + "candidate_estimate": 620743.5235671997, + "control_relative_error": -0.0012694826144236616, + "candidate_relative_error": -0.0011882507181226374, + "absolute_error_change_pp": -0.008123189630102425 + }, + { + "name": "dft.bus_fare_receipts.england@2025", + "family": "dft_local_bus", + "target": 3417388656.43538, + "control_estimate": 3413014982.893592, + "candidate_estimate": 3420703193.9844637, + "control_relative_error": -0.001279829127293413, + "candidate_relative_error": 0.0009699035966664229, + "absolute_error_change_pp": -0.030992553062699 + }, + { + "name": "dft.bus_net_support.england@2025", + "family": "dft_local_bus", + "target": 3024904320.8399997, + "control_estimate": 3024788486.4766355, + "candidate_estimate": 3025547465.1661716, + "control_relative_error": -3.829356273062319e-05, + "candidate_relative_error": 0.00021261641954786764, + "absolute_error_change_pp": 0.017432285681724446 + }, + { + "name": "dwp.benefit_cap.capped_households@2025", + "family": "dwp_benefit_cap", + "target": 110637.0, + "control_estimate": 110695.21670913696, + "candidate_estimate": 110722.17761993408, + "control_relative_error": 0.0005261956591100888, + "candidate_relative_error": 0.0007698836730395983, + "absolute_error_change_pp": 0.02436880139295095 + }, + { + "name": "dwp.esa_claimants@2025", + "family": "dwp_legacy_benefits", + "target": 1000000.0, + "control_estimate": 800905.8603649139, + "candidate_estimate": 801054.7412891388, + "control_relative_error": -0.19909413963508607, + "candidate_relative_error": -0.19894525871086122, + "absolute_error_change_pp": -0.014888092422485344 + }, + { + "name": "dwp.esa_contrib_claimants@2025", + "family": "dwp_legacy_benefits", + "target": 620000.0, + "control_estimate": 620819.2523536682, + "candidate_estimate": 621533.8441810608, + "control_relative_error": 0.0013213747639809884, + "candidate_relative_error": 0.002473942227517405, + "absolute_error_change_pp": 0.11525674635364165 + }, + { + "name": "dwp.esa_income_claimants@2025", + "family": "dwp_legacy_benefits", + "target": 180000.0, + "control_estimate": 180348.33646202087, + "candidate_estimate": 179757.01635742188, + "control_relative_error": 0.0019352025667826334, + "candidate_relative_error": -0.0013499091254340278, + "absolute_error_change_pp": -0.058529344134860564 + }, + { + "name": "dwp.uc.households@2025", + "family": "dwp_universal_credit", + "target": 6197311.0, + "control_estimate": 5905355.915781509, + "candidate_estimate": 5921636.7649006955, + "control_relative_error": -0.04710996175897754, + "candidate_relative_error": -0.04448287896142447, + "absolute_error_change_pp": -0.2627082797553068 + }, + { + "name": "dwp.uc.households_children_1@2025", + "family": "dwp_universal_credit", + "target": 1190123.8333333333, + "control_estimate": 958658.2978921045, + "candidate_estimate": 970143.6153588403, + "control_relative_error": -0.19448861451075508, + "candidate_relative_error": -0.1848380914768894, + "absolute_error_change_pp": -0.9650523033865682 + }, + { + "name": "dwp.uc.households_children_2@2025", + "family": "dwp_universal_credit", + "target": 1049895.5, + "control_estimate": 982488.795085907, + "candidate_estimate": 988014.1006622314, + "control_relative_error": -0.0642032515751263, + "candidate_relative_error": -0.058940532022252266, + "absolute_error_change_pp": -0.526271955287403 + }, + { + "name": "dwp.uc.households_children_3@2025", + "family": "dwp_universal_credit", + "target": 477887.6666666667, + "control_estimate": 477891.95067596436, + "candidate_estimate": 477592.3685569763, + "control_relative_error": 8.964469260215405e-06, + "candidate_relative_error": -0.0006179236885314771, + "absolute_error_change_pp": 0.060895921927126166 + }, + { + "name": "dwp.uc.households_children_4@2025", + "family": "dwp_universal_credit", + "target": 170713.66666666666, + "control_estimate": 170759.3681640625, + "candidate_estimate": 169877.8620147705, + "control_relative_error": 0.0002677084868962436, + "candidate_relative_error": -0.004895944584964781, + "absolute_error_change_pp": 0.46282360980685366 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "family": "dwp_universal_credit", + "target": 76320.08333333333, + "control_estimate": 76415.20346069336, + "candidate_estimate": 76266.9966430664, + "control_relative_error": 0.00124633154479912, + "candidate_relative_error": -0.0006955795637049082, + "absolute_error_change_pp": -0.05507519810942118 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "family": "dwp_universal_credit", + "target": 241130.91666666666, + "control_estimate": 246619.82132911682, + "candidate_estimate": 246801.37789154053, + "control_relative_error": 0.022763172546794937, + "candidate_relative_error": 0.023516110265995354, + "absolute_error_change_pp": 0.07529377192004166 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "family": "dwp_universal_credit", + "target": 826160.8333333334, + "control_estimate": 826999.3626594543, + "candidate_estimate": 825913.004535675, + "control_relative_error": 0.0010149710471479708, + "candidate_relative_error": -0.0002999764545341635, + "absolute_error_change_pp": -0.07149945926138072 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "family": "dwp_universal_credit", + "target": 2990070.1666666665, + "control_estimate": 2992522.4791736603, + "candidate_estimate": 2992940.4437732697, + "control_relative_error": 0.0008201521604182311, + "candidate_relative_error": 0.0009599363715945602, + "absolute_error_change_pp": 0.013978421117632913 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "family": "dwp_universal_credit", + "target": 2138780.1666666665, + "control_estimate": 1839214.2526192775, + "candidate_estimate": 1855981.93870021, + "control_relative_error": -0.14006391059548154, + "candidate_relative_error": -0.13222407443921802, + "absolute_error_change_pp": -0.7839836156263519 + }, + { + "name": "dwp.uc.scotland_households_child_under_1@2025", + "family": "dwp_universal_credit", + "target": 14333.222222222223, + "control_estimate": 14293.698974609375, + "candidate_estimate": 14339.822967529297, + "control_relative_error": -0.002757457255603754, + "candidate_relative_error": 0.0004605206843748264, + "absolute_error_change_pp": -0.22969365712289272 + }, + { + "name": "dwp.uc.two_child_limit.children_affected@2025", + "family": "dwp_two_child_limit", + "target": 597920.0, + "control_estimate": 598350.1328811646, + "candidate_estimate": 597142.075630188, + "control_relative_error": 0.0007193819928494627, + "candidate_relative_error": -0.0013010509262309535, + "absolute_error_change_pp": 0.058166893338149075 + }, + { + "name": "dwp.uc.two_child_limit.children_claimant_pip@2025", + "family": "dwp_two_child_limit", + "target": 235270.0, + "control_estimate": 234708.7303161621, + "candidate_estimate": 234948.0887451172, + "control_relative_error": -0.0023856406844811944, + "candidate_relative_error": -0.0013682630802176754, + "absolute_error_change_pp": -0.10173776042635191 + }, + { + "name": "dwp.uc.two_child_limit.children_disabled_child_element@2025", + "family": "dwp_two_child_limit", + "target": 479460.0, + "control_estimate": 479984.01042175293, + "candidate_estimate": 478389.86698913574, + "control_relative_error": 0.0010929179113021517, + "candidate_relative_error": -0.002231954721695778, + "absolute_error_change_pp": 0.11390368103936264 + }, + { + "name": "dwp.uc.two_child_limit.children_in_3_children_households@2025", + "family": "dwp_two_child_limit", + "target": 891930.0, + "control_estimate": 892681.7881393433, + "candidate_estimate": 892009.286064148, + "control_relative_error": 0.0008428779605386765, + "candidate_relative_error": 8.889269802333054e-05, + "absolute_error_change_pp": -0.07539852625153459 + }, + { + "name": "dwp.uc.two_child_limit.children_in_4_children_households@2025", + "family": "dwp_two_child_limit", + "target": 468760.0, + "control_estimate": 469047.0302734375, + "candidate_estimate": 466136.40002441406, + "control_relative_error": 0.0006123181872120061, + "candidate_relative_error": -0.005596893880847209, + "absolute_error_change_pp": 0.49845756936352026 + }, + { + "name": "dwp.uc.two_child_limit.children_in_5_children_households@2025", + "family": "dwp_two_child_limit", + "target": 185120.0, + "control_estimate": 185491.82815551758, + "candidate_estimate": 185846.0726928711, + "control_relative_error": 0.0020085790596239095, + "candidate_relative_error": 0.003922173146451457, + "absolute_error_change_pp": 0.19135940868275475 + }, + { + "name": "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025", + "family": "dwp_two_child_limit", + "target": 119720.0, + "control_estimate": 119755.16040039062, + "candidate_estimate": 119474.77746582031, + "control_relative_error": 0.00029368861001190276, + "candidate_relative_error": -0.002048300485964647, + "absolute_error_change_pp": 0.1754611875952744 + }, + { + "name": "dwp.uc.two_child_limit.children_in_affected_households@2025", + "family": "dwp_two_child_limit", + "target": 1665540.0, + "control_estimate": 1666975.806968689, + "candidate_estimate": 1663466.5362472534, + "control_relative_error": 0.0008620669384637804, + "candidate_relative_error": -0.0012449198174445417, + "absolute_error_change_pp": 0.03828528789807613 + }, + { + "name": "dwp.uc.two_child_limit.households_3_children@2025", + "family": "dwp_two_child_limit", + "target": 297310.0, + "control_estimate": 297560.59604644775, + "candidate_estimate": 297336.4286880493, + "control_relative_error": 0.0008428779605386765, + "candidate_relative_error": 8.889269802333054e-05, + "absolute_error_change_pp": -0.07539852625153459 + }, + { + "name": "dwp.uc.two_child_limit.households_4_children@2025", + "family": "dwp_two_child_limit", + "target": 117190.0, + "control_estimate": 117261.75756835938, + "candidate_estimate": 116534.10000610352, + "control_relative_error": 0.0006123181872120061, + "candidate_relative_error": -0.005596893880847209, + "absolute_error_change_pp": 0.49845756936352026 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "family": "dwp_two_child_limit", + "target": 37020.0, + "control_estimate": 37098.365631103516, + "candidate_estimate": 37169.21453857422, + "control_relative_error": 0.0021168457888577964, + "candidate_relative_error": 0.0040306466389578265, + "absolute_error_change_pp": 0.191380085010003 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "family": "dwp_two_child_limit", + "target": 18260.0, + "control_estimate": 18265.482360839844, + "candidate_estimate": 18224.869018554688, + "control_relative_error": 0.00030023881926855147, + "candidate_relative_error": -0.001923931075865964, + "absolute_error_change_pp": 0.16236922565974124 + }, + { + "name": "dwp.uc.two_child_limit.households_affected@2025", + "family": "dwp_two_child_limit", + "target": 469780.0, + "control_estimate": 470186.2016067505, + "candidate_estimate": 469264.61225128174, + "control_relative_error": 0.0008646634738611441, + "candidate_relative_error": -0.0010970832064333554, + "absolute_error_change_pp": 0.023241973257221132 + }, + { + "name": "dwp.uc.two_child_limit.households_claimant_pip@2025", + "family": "dwp_two_child_limit", + "target": 65280.0, + "control_estimate": 65115.01516723633, + "candidate_estimate": 65189.623779296875, + "control_relative_error": -0.002527341188168993, + "candidate_relative_error": -0.0013844396553787531, + "absolute_error_change_pp": -0.114290153279024 + }, + { + "name": "dwp.uc.two_child_limit.households_disabled_child_element@2025", + "family": "dwp_two_child_limit", + "target": 129630.0, + "control_estimate": 129779.48835754395, + "candidate_estimate": 129387.85597229004, + "control_relative_error": 0.0011531926062172747, + "candidate_relative_error": -0.0018679628767257653, + "absolute_error_change_pp": 0.07147702705084906 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025", + "family": "dwp_universal_credit", + "target": 7506.333333333333, + "control_estimate": 7549.726631164551, + "candidate_estimate": 7501.908332824707, + "control_relative_error": 0.005780891402533561, + "candidate_relative_error": -0.0005895022659033704, + "absolute_error_change_pp": -0.5191389136630191 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025", + "family": "dwp_universal_credit", + "target": 13313.333333333334, + "control_estimate": 13278.288986206055, + "candidate_estimate": 13292.263534545898, + "control_relative_error": -0.0026322744462152665, + "candidate_relative_error": -0.0015826088222910992, + "absolute_error_change_pp": -0.10496656239241672 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025", + "family": "dwp_universal_credit", + "target": 16121.444444444445, + "control_estimate": 16067.063690185547, + "candidate_estimate": 16020.69204711914, + "control_relative_error": -0.003373193664271091, + "candidate_relative_error": -0.006249588718461549, + "absolute_error_change_pp": 0.28763950541904587 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025", + "family": "dwp_universal_credit", + "target": 13317.333333333334, + "control_estimate": 13265.290328979492, + "candidate_estimate": 13211.862380981445, + "control_relative_error": -0.003907914824327324, + "candidate_relative_error": -0.007919825216651629, + "absolute_error_change_pp": 0.40119103923243055 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025", + "family": "dwp_universal_credit", + "target": 19657.333333333332, + "control_estimate": 19646.632431030273, + "candidate_estimate": 19775.19612121582, + "control_relative_error": -0.0005443720224712754, + "candidate_relative_error": 0.005995868609636176, + "absolute_error_change_pp": 0.5451496587164901 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025", + "family": "dwp_universal_credit", + "target": 16443.222222222223, + "control_estimate": 16378.710571289062, + "candidate_estimate": 16507.149322509766, + "control_relative_error": -0.003923297396417579, + "candidate_relative_error": 0.003887747755494577, + "absolute_error_change_pp": -0.003554964092300234 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025", + "family": "dwp_universal_credit", + "target": 13441.111111111111, + "control_estimate": 13433.922409057617, + "candidate_estimate": 13407.74967956543, + "control_relative_error": -0.0005348294492969094, + "candidate_relative_error": -0.002482044175507437, + "absolute_error_change_pp": 0.19472147262105274 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025", + "family": "dwp_universal_credit", + "target": 10728.555555555555, + "control_estimate": 10777.996124267578, + "candidate_estimate": 10733.342819213867, + "control_relative_error": 0.004608315486274536, + "candidate_relative_error": 0.000446216979864867, + "absolute_error_change_pp": -0.4162098506409669 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025", + "family": "dwp_universal_credit", + "target": 9653.222222222223, + "control_estimate": 9725.134979248047, + "candidate_estimate": 9676.722259521484, + "control_relative_error": 0.007449611680986409, + "candidate_relative_error": 0.002434424149602962, + "absolute_error_change_pp": -0.5015187531383447 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025", + "family": "dwp_universal_credit", + "target": 8797.0, + "control_estimate": 8813.124504089355, + "candidate_estimate": 8721.069076538086, + "control_relative_error": 0.0018329548811362362, + "candidate_relative_error": -0.008631456571776067, + "absolute_error_change_pp": 0.679850169063983 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025", + "family": "dwp_universal_credit", + "target": 6486.888888888889, + "control_estimate": 6539.253356933594, + "candidate_estimate": 6485.8262939453125, + "control_relative_error": 0.008072354705257538, + "candidate_relative_error": -0.00016380655839446544, + "absolute_error_change_pp": -0.7908548146863074 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025", + "family": "dwp_universal_credit", + "target": 3981.8888888888887, + "control_estimate": 3994.9493408203125, + "candidate_estimate": 3966.171630859375, + "control_relative_error": 0.003279963930653077, + "candidate_relative_error": -0.003947186490655557, + "absolute_error_change_pp": 0.066722256000248 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025", + "family": "dwp_universal_credit", + "target": 2761.4444444444443, + "control_estimate": 2750.487060546875, + "candidate_estimate": 2756.07861328125, + "control_relative_error": -0.003967989984232249, + "candidate_relative_error": -0.0019431247925300404, + "absolute_error_change_pp": -0.2024865191702209 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025", + "family": "dwp_universal_credit", + "target": 2131.222222222222, + "control_estimate": 2131.5609130859375, + "candidate_estimate": 2143.7354125976562, + "control_relative_error": 0.0001589186055699888, + "candidate_relative_error": 0.005871368196595939, + "absolute_error_change_pp": 0.571244959102595 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025", + "family": "dwp_universal_credit", + "target": 1475.3333333333333, + "control_estimate": 1468.1308288574219, + "candidate_estimate": 1486.83203125, + "control_relative_error": -0.0048819506162978196, + "candidate_relative_error": 0.00779396605286946, + "absolute_error_change_pp": 0.29120154365716405 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "family": "dwp_universal_credit", + "target": 746.3333333333334, + "control_estimate": 0.0, + "candidate_estimate": 0.0, + "control_relative_error": -1.0, + "candidate_relative_error": -1.0, + "absolute_error_change_pp": 0.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "family": "dwp_universal_credit", + "target": 605.7777777777778, + "control_estimate": 0.0, + "candidate_estimate": 0.0, + "control_relative_error": -1.0, + "candidate_relative_error": -1.0, + "absolute_error_change_pp": 0.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025", + "family": "dwp_universal_credit", + "target": 12256.0, + "control_estimate": 12192.001091003418, + "candidate_estimate": 12349.63419342041, + "control_relative_error": -0.005221843096979604, + "candidate_relative_error": 0.007639865651143126, + "absolute_error_change_pp": 0.2418022554163522 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025", + "family": "dwp_universal_credit", + "target": 10945.444444444445, + "control_estimate": 10940.92593383789, + "candidate_estimate": 10989.354064941406, + "control_relative_error": -0.0004128211174511126, + "candidate_relative_error": 0.0040116799934285085, + "absolute_error_change_pp": 0.3598858875977396 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025", + "family": "dwp_universal_credit", + "target": 12492.444444444445, + "control_estimate": 12473.312881469727, + "candidate_estimate": 12511.995803833008, + "control_relative_error": -0.0015314507148540292, + "candidate_relative_error": 0.0015650547397276845, + "absolute_error_change_pp": 0.003360402487365523 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025", + "family": "dwp_universal_credit", + "target": 12979.666666666666, + "control_estimate": 12898.599021911621, + "candidate_estimate": 13017.202606201172, + "control_relative_error": -0.006245741654000742, + "candidate_relative_error": 0.002891903197398943, + "absolute_error_change_pp": -0.3353838456601799 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025", + "family": "dwp_universal_credit", + "target": 16484.444444444445, + "control_estimate": 16494.63247680664, + "candidate_estimate": 16533.905548095703, + "control_relative_error": 0.0006180391699902827, + "candidate_relative_error": 0.003000471372750882, + "absolute_error_change_pp": 0.23824322027605993 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025", + "family": "dwp_universal_credit", + "target": 15272.444444444445, + "control_estimate": 15259.45620727539, + "candidate_estimate": 15277.932632446289, + "control_relative_error": -0.0008504360396465068, + "candidate_relative_error": 0.0003593522976500472, + "absolute_error_change_pp": -0.04910837419964595 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025", + "family": "dwp_universal_credit", + "target": 19142.333333333332, + "control_estimate": 19168.387908935547, + "candidate_estimate": 19196.922943115234, + "control_relative_error": 0.0013610971634709155, + "candidate_relative_error": 0.0028517740670017024, + "absolute_error_change_pp": 0.14906769035307868 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025", + "family": "dwp_universal_credit", + "target": 19073.555555555555, + "control_estimate": 19080.001777648926, + "candidate_estimate": 19014.604873657227, + "control_relative_error": 0.00033796646223590145, + "candidate_relative_error": -0.003090702293372754, + "absolute_error_change_pp": 0.27527358311368527 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025", + "family": "dwp_universal_credit", + "target": 40805.444444444445, + "control_estimate": 40726.661712646484, + "candidate_estimate": 40755.253967285156, + "control_relative_error": -0.001930691672902167, + "candidate_relative_error": -0.0012299946206350487, + "absolute_error_change_pp": -0.07006970522671183 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025", + "family": "dwp_universal_credit", + "target": 40009.555555555555, + "control_estimate": 39959.461517333984, + "candidate_estimate": 39975.60674285889, + "control_relative_error": -0.0012520518542629632, + "candidate_relative_error": -0.0008485176159862152, + "absolute_error_change_pp": -0.0403534238276748 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025", + "family": "dwp_universal_credit", + "target": 39972.555555555555, + "control_estimate": 40084.38185119629, + "candidate_estimate": 39974.25108337402, + "control_relative_error": 0.0027975768395721756, + "candidate_relative_error": 4.2417298441481276e-05, + "absolute_error_change_pp": -0.2755159541130694 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025", + "family": "dwp_universal_credit", + "target": 40518.77777777778, + "control_estimate": 40631.55555725098, + "candidate_estimate": 40520.024978637695, + "control_relative_error": 0.0027833460350585324, + "candidate_relative_error": 3.078081147349708e-05, + "absolute_error_change_pp": -0.2752565223585035 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025", + "family": "dwp_universal_credit", + "target": 37118.0, + "control_estimate": 37138.967376708984, + "candidate_estimate": 37159.76266479492, + "control_relative_error": 0.0005648843339884793, + "candidate_relative_error": 0.0011251324100145987, + "absolute_error_change_pp": 0.056024807602611935 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025", + "family": "dwp_universal_credit", + "target": 37177.77777777778, + "control_estimate": 37149.302505493164, + "candidate_estimate": 37114.09118652344, + "control_relative_error": -0.0007659218486597505, + "candidate_relative_error": -0.0017130284557354799, + "absolute_error_change_pp": 0.09471066070757293 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025", + "family": "dwp_universal_credit", + "target": 37164.555555555555, + "control_estimate": 37318.567932128906, + "candidate_estimate": 37192.609283447266, + "control_relative_error": 0.0041440661477338435, + "candidate_relative_error": 0.0007548516986776466, + "absolute_error_change_pp": -0.3389214449056197 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025", + "family": "dwp_universal_credit", + "target": 33309.555555555555, + "control_estimate": 33282.195220947266, + "candidate_estimate": 33317.78674316406, + "control_relative_error": -0.0008213959673720657, + "candidate_relative_error": 0.0002471119014115728, + "absolute_error_change_pp": -0.057428406596049295 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025", + "family": "dwp_universal_credit", + "target": 22775.777777777777, + "control_estimate": 22835.179355621338, + "candidate_estimate": 22688.353755950928, + "control_relative_error": 0.00260810315340881, + "candidate_relative_error": -0.0038384648234559464, + "absolute_error_change_pp": 0.12303616700471363 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025", + "family": "dwp_universal_credit", + "target": 29102.555555555555, + "control_estimate": 29132.563507080078, + "candidate_estimate": 29020.713439941406, + "control_relative_error": 0.0010311105314184338, + "candidate_relative_error": -0.002812196869031496, + "absolute_error_change_pp": 0.17810863376130623 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025", + "family": "dwp_universal_credit", + "target": 27534.666666666668, + "control_estimate": 27392.065307617188, + "candidate_estimate": 27365.25164794922, + "control_relative_error": -0.005178975317762349, + "candidate_relative_error": -0.006152789890953796, + "absolute_error_change_pp": 0.09738145731914465 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025", + "family": "dwp_universal_credit", + "target": 25584.777777777777, + "control_estimate": 25543.960021972656, + "candidate_estimate": 25539.38427734375, + "control_relative_error": -0.0015953922351662668, + "candidate_relative_error": -0.0017742386050135991, + "absolute_error_change_pp": 0.01788463698473323 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025", + "family": "dwp_universal_credit", + "target": 22927.777777777777, + "control_estimate": 22907.781677246094, + "candidate_estimate": 23015.901306152344, + "control_relative_error": -0.0008721342611347352, + "candidate_relative_error": 0.003843526800926084, + "absolute_error_change_pp": 0.2971392539791349 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025", + "family": "dwp_universal_credit", + "target": 20334.666666666668, + "control_estimate": 20316.6142578125, + "candidate_estimate": 20311.510681152344, + "control_relative_error": -0.0008877651721609015, + "candidate_relative_error": -0.0011387442879642708, + "absolute_error_change_pp": 0.025097911580336932 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025", + "family": "dwp_universal_credit", + "target": 17535.0, + "control_estimate": 17451.72442626953, + "candidate_estimate": 17474.560791015625, + "control_relative_error": -0.004749106001167308, + "candidate_relative_error": -0.003446775533753921, + "absolute_error_change_pp": -0.1302330467413387 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025", + "family": "dwp_universal_credit", + "target": 15399.888888888889, + "control_estimate": 15438.156677246094, + "candidate_estimate": 15288.900451660156, + "control_relative_error": 0.0024849392507510556, + "candidate_relative_error": -0.007207093377719839, + "absolute_error_change_pp": 0.4722154126968784 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025", + "family": "dwp_universal_credit", + "target": 12836.222222222223, + "control_estimate": 12812.334838867188, + "candidate_estimate": 12789.249877929688, + "control_relative_error": -0.0018609356352277074, + "candidate_relative_error": -0.0036593589203539993, + "absolute_error_change_pp": 0.17984232851262918 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025", + "family": "dwp_universal_credit", + "target": 26502.666666666668, + "control_estimate": 26519.094997406006, + "candidate_estimate": 26405.262996673584, + "control_relative_error": 0.0006198746317101919, + "candidate_relative_error": -0.0036752403529110487, + "absolute_error_change_pp": 0.30553657212008567 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025", + "family": "dwp_universal_credit", + "target": 29027.0, + "control_estimate": 29060.13680267334, + "candidate_estimate": 28948.75368499756, + "control_relative_error": 0.0011415855125689821, + "candidate_relative_error": -0.0026956390602694527, + "absolute_error_change_pp": 0.15540535477004705 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025", + "family": "dwp_universal_credit", + "target": 32427.0, + "control_estimate": 32352.70072555542, + "candidate_estimate": 32327.552501678467, + "control_relative_error": -0.0022912780844536983, + "candidate_relative_error": -0.0030668115558495452, + "absolute_error_change_pp": 0.0775533471395847 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025", + "family": "dwp_universal_credit", + "target": 34956.88888888889, + "control_estimate": 34938.12148284912, + "candidate_estimate": 34876.3314743042, + "control_relative_error": -0.0005368728921907769, + "candidate_relative_error": -0.0023044789495067623, + "absolute_error_change_pp": 0.17676060573159855 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025", + "family": "dwp_universal_credit", + "target": 37410.77777777778, + "control_estimate": 37410.73895263672, + "candidate_estimate": 37320.519844055176, + "control_relative_error": -1.0378063052547358e-06, + "candidate_relative_error": -0.002412618477454349, + "absolute_error_change_pp": 0.24115806711490942 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025", + "family": "dwp_universal_credit", + "target": 39910.333333333336, + "control_estimate": 39912.52444458008, + "candidate_estimate": 39775.37535095215, + "control_relative_error": 5.490085057526538e-05, + "candidate_relative_error": -0.0033815298222144804, + "absolute_error_change_pp": 0.3326628971639215 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025", + "family": "dwp_universal_credit", + "target": 39368.0, + "control_estimate": 39413.518005371094, + "candidate_estimate": 39331.33395385742, + "control_relative_error": 0.0011562183847564965, + "candidate_relative_error": -0.0009313667481857886, + "absolute_error_change_pp": -0.02248516365707079 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025", + "family": "dwp_universal_credit", + "target": 26670.222222222223, + "control_estimate": 26702.536514282227, + "candidate_estimate": 26738.197067260742, + "control_relative_error": 0.0012116244023298369, + "candidate_relative_error": 0.002548716860029813, + "absolute_error_change_pp": 0.1337092457699976 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025", + "family": "dwp_universal_credit", + "target": 36208.11111111111, + "control_estimate": 36079.87585449219, + "candidate_estimate": 36153.96160888672, + "control_relative_error": -0.003541616855555072, + "candidate_relative_error": -0.0014955075137231889, + "absolute_error_change_pp": -0.20461093418318832 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025", + "family": "dwp_universal_credit", + "target": 85490.44444444444, + "control_estimate": 85422.88656616211, + "candidate_estimate": 85821.2798461914, + "control_relative_error": -0.0007902389409875015, + "candidate_relative_error": 0.0038698524015974684, + "absolute_error_change_pp": 0.3079613460609967 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025", + "family": "dwp_universal_credit", + "target": 71259.55555555556, + "control_estimate": 71301.09902954102, + "candidate_estimate": 71540.64520263672, + "control_relative_error": 0.0005829881152298989, + "candidate_relative_error": 0.003944588832890108, + "absolute_error_change_pp": 0.3361600717660209 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025", + "family": "dwp_universal_credit", + "target": 51301.666666666664, + "control_estimate": 51248.27346801758, + "candidate_estimate": 51377.555236816406, + "control_relative_error": -0.001040769279407806, + "candidate_relative_error": 0.0014792613004725385, + "absolute_error_change_pp": 0.04384920210647326 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025", + "family": "dwp_universal_credit", + "target": 43305.22222222222, + "control_estimate": 43308.97979736328, + "candidate_estimate": 43393.48303222656, + "control_relative_error": 8.676956145797237e-05, + "candidate_relative_error": 0.0020381100817686644, + "absolute_error_change_pp": 0.1951340520310692 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025", + "family": "dwp_universal_credit", + "target": 34910.555555555555, + "control_estimate": 34967.71870422363, + "candidate_estimate": 35005.31857299805, + "control_relative_error": 0.0016374173300424978, + "candidate_relative_error": 0.0027144517162349152, + "absolute_error_change_pp": 0.10770343861924174 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025", + "family": "dwp_universal_credit", + "target": 28513.0, + "control_estimate": 28472.154052734375, + "candidate_estimate": 28410.603729248047, + "control_relative_error": -0.0014325376938808614, + "candidate_relative_error": -0.003591213507942101, + "absolute_error_change_pp": 0.21586758140612394 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025", + "family": "dwp_universal_credit", + "target": 22593.0, + "control_estimate": 22941.5359954834, + "candidate_estimate": 22335.25946044922, + "control_relative_error": 0.01542672489193106, + "candidate_relative_error": -0.011407982098472148, + "absolute_error_change_pp": -0.4018742793458912 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025", + "family": "dwp_universal_credit", + "target": 46312.77777777778, + "control_estimate": 46211.40223693848, + "candidate_estimate": 46559.80694580078, + "control_relative_error": -0.0021889324221866773, + "candidate_relative_error": 0.005333931149807473, + "absolute_error_change_pp": 0.3144998727620796 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025", + "family": "dwp_universal_credit", + "target": 60310.11111111111, + "control_estimate": 60197.692474365234, + "candidate_estimate": 60178.7666015625, + "control_relative_error": -0.0018640097767149346, + "candidate_relative_error": -0.0021778190609967473, + "absolute_error_change_pp": 0.03138092842818127 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025", + "family": "dwp_universal_credit", + "target": 67858.66666666667, + "control_estimate": 67966.1632156372, + "candidate_estimate": 67801.44441986084, + "control_relative_error": 0.0015841240957264438, + "candidate_relative_error": -0.0008432562798045693, + "absolute_error_change_pp": -0.07408678159218746 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025", + "family": "dwp_universal_credit", + "target": 89577.44444444444, + "control_estimate": 89698.78782653809, + "candidate_estimate": 89584.03790283203, + "control_relative_error": 0.001354619824736177, + "candidate_relative_error": 7.360623456591808e-05, + "absolute_error_change_pp": -0.12810135901702588 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025", + "family": "dwp_universal_credit", + "target": 116076.0, + "control_estimate": 116286.76705932617, + "candidate_estimate": 116538.10373687744, + "control_relative_error": 0.0018157677670334253, + "candidate_relative_error": 0.00398104463349393, + "absolute_error_change_pp": 0.21652768664605043 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025", + "family": "dwp_universal_credit", + "target": 97511.0, + "control_estimate": 97399.42486572266, + "candidate_estimate": 97955.5943145752, + "control_relative_error": -0.0011442312588050964, + "candidate_relative_error": 0.00455942729102558, + "absolute_error_change_pp": 0.3415196032220484 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025", + "family": "dwp_universal_credit", + "target": 102343.0, + "control_estimate": 102252.2599029541, + "candidate_estimate": 102796.92694091797, + "control_relative_error": -0.0008866272929843608, + "candidate_relative_error": 0.004435349177940541, + "absolute_error_change_pp": 0.35487218849561797 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025", + "family": "dwp_universal_credit", + "target": 89479.33333333333, + "control_estimate": 89634.40298843384, + "candidate_estimate": 89215.16776657104, + "control_relative_error": 0.0017330220211055373, + "candidate_relative_error": -0.002952252290237786, + "absolute_error_change_pp": 0.12192302691322486 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025", + "family": "dwp_universal_credit", + "target": 104891.11111111111, + "control_estimate": 105225.78038787842, + "candidate_estimate": 104730.4072265625, + "control_relative_error": 0.0031906352523312816, + "candidate_relative_error": -0.0015321020327296938, + "absolute_error_change_pp": -0.16585332196015878 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025", + "family": "dwp_universal_credit", + "target": 122035.55555555556, + "control_estimate": 121352.39295959473, + "candidate_estimate": 122078.40899658203, + "control_relative_error": -0.005598061916060455, + "candidate_relative_error": 0.00035115537296800844, + "absolute_error_change_pp": -0.5246906543092446 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025", + "family": "dwp_universal_credit", + "target": 149963.22222222222, + "control_estimate": 149558.40324783325, + "candidate_estimate": 150295.2777786255, + "control_relative_error": -0.0026994550289742916, + "candidate_relative_error": 0.002214246609820203, + "absolute_error_change_pp": -0.04852084191540886 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025", + "family": "dwp_universal_credit", + "target": 108689.66666666667, + "control_estimate": 108450.17974853516, + "candidate_estimate": 109009.77145385742, + "control_relative_error": -0.002203400980757281, + "candidate_relative_error": 0.0029451262204387755, + "absolute_error_change_pp": 0.07417252396814947 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025", + "family": "dwp_universal_credit", + "target": 61718.666666666664, + "control_estimate": 61655.18292236328, + "candidate_estimate": 61770.48156738281, + "control_relative_error": -0.0010285987648801496, + "candidate_relative_error": 0.0008395337021130548, + "absolute_error_change_pp": -0.018906506276709478 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025", + "family": "dwp_universal_credit", + "target": 34050.444444444445, + "control_estimate": 34080.252182006836, + "candidate_estimate": 34123.49203491211, + "control_relative_error": 0.0008753993684582879, + "candidate_relative_error": 0.0021452756831660774, + "absolute_error_change_pp": 0.12698763147077893 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025", + "family": "dwp_universal_credit", + "target": 127403.22222222222, + "control_estimate": 127142.69436264038, + "candidate_estimate": 127203.61846160889, + "control_relative_error": -0.0020449079311935623, + "candidate_relative_error": -0.0015667088879838121, + "absolute_error_change_pp": -0.047819904320975014 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025", + "family": "dwp_universal_credit", + "target": 22338.333333333332, + "control_estimate": 22386.04296875, + "candidate_estimate": 22302.59716796875, + "control_relative_error": 0.0021357741736925113, + "candidate_relative_error": -0.0015997686502088543, + "absolute_error_change_pp": -0.0536005523483657 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025", + "family": "dwp_universal_credit", + "target": 11133.666666666666, + "control_estimate": 10729.99609375, + "candidate_estimate": 10729.99609375, + "control_relative_error": -0.03625675035927063, + "candidate_relative_error": -0.03625675035927063, + "absolute_error_change_pp": 0.0 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025", + "family": "dwp_universal_credit", + "target": 6951.222222222223, + "control_estimate": 6957.512939453125, + "candidate_estimate": 6929.44873046875, + "control_relative_error": 0.00090498002074969, + "candidate_relative_error": -0.0031323256626533086, + "absolute_error_change_pp": 0.22273456419036183 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025", + "family": "dwp_universal_credit", + "target": 6508.222222222223, + "control_estimate": 6518.90576171875, + "candidate_estimate": 6489.63818359375, + "control_relative_error": 0.0016415449767601044, + "candidate_relative_error": -0.002855470817363568, + "absolute_error_change_pp": 0.12139258406034636 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025", + "family": "dwp_universal_credit", + "target": 5913.444444444444, + "control_estimate": 5901.88525390625, + "candidate_estimate": 5947.3701171875, + "control_relative_error": -0.001954730554550818, + "candidate_relative_error": 0.005737040917823809, + "absolute_error_change_pp": 0.3782310363272991 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025", + "family": "dwp_universal_credit", + "target": 1653.7777777777778, + "control_estimate": 1653.3655700683594, + "candidate_estimate": 1650.5017395019531, + "control_relative_error": -0.00024925217581067455, + "candidate_relative_error": -0.0019809422522455208, + "absolute_error_change_pp": 0.1731690076434846 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025", + "family": "dwp_universal_credit", + "target": 197136.66666666666, + "control_estimate": 197619.07789230347, + "candidate_estimate": 197315.17567253113, + "control_relative_error": 0.002447090304375018, + "candidate_relative_error": 0.0009055088983842223, + "absolute_error_change_pp": -0.1541581405990796 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025", + "family": "dwp_universal_credit", + "target": 377063.1111111111, + "control_estimate": 377133.3975048065, + "candidate_estimate": 376824.7805747986, + "control_relative_error": 0.0001864048527268499, + "candidate_relative_error": -0.0006320706780629887, + "absolute_error_change_pp": 0.044566582533613876 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025", + "family": "dwp_universal_credit", + "target": 195983.22222222222, + "control_estimate": 196006.10721969604, + "candidate_estimate": 196081.9817123413, + "control_relative_error": 0.00011677018682689584, + "candidate_relative_error": 0.0005039180854323734, + "absolute_error_change_pp": 0.03871478986054776 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025", + "family": "dwp_universal_credit", + "target": 114033.33333333333, + "control_estimate": 113709.17582702637, + "candidate_estimate": 114046.63146972656, + "control_relative_error": -0.002842655711548915, + "candidate_relative_error": 0.00011661622092868183, + "absolute_error_change_pp": -0.27260394906202334 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025", + "family": "dwp_universal_credit", + "target": 149043.77777777778, + "control_estimate": 148945.04288482666, + "candidate_estimate": 148708.5940246582, + "control_relative_error": -0.0006624556517772464, + "candidate_relative_error": -0.0022488946410049553, + "absolute_error_change_pp": 0.15864389892277087 + }, + { + "name": "hmrc.salary_sacrifice.users_above_cap@2025", + "family": "hmrc_salary_sacrifice", + "target": 3300000.0, + "control_estimate": 3310142.457506424, + "candidate_estimate": 3301125.3879010733, + "control_relative_error": 0.0030734719716435806, + "candidate_relative_error": 0.00034102663668888534, + "absolute_error_change_pp": -0.2732445334954695 + }, + { + "name": "hmrc.salary_sacrifice.users_below_cap@2025", + "family": "hmrc_salary_sacrifice", + "target": 4300000.0, + "control_estimate": 4312530.925374508, + "candidate_estimate": 4299594.7601591665, + "control_relative_error": 0.002914168691746024, + "candidate_relative_error": -9.424182344964424e-05, + "absolute_error_change_pp": -0.281992686829638 + }, + { + "name": "hmrc.salary_sacrifice.users_total@2025", + "family": "hmrc_salary_sacrifice", + "target": 7700000.0, + "control_estimate": 7622673.382880932, + "candidate_estimate": 7600720.14806024, + "control_relative_error": -0.010042417807671206, + "candidate_relative_error": -0.012893487264903915, + "absolute_error_change_pp": 0.28510694572327094 + }, + { + "name": "hmrc.tfc.children_with_used_accounts@2025", + "family": "hmrc_tfc", + "target": 1151515.0, + "control_estimate": 1148588.428237915, + "candidate_estimate": 1151431.0919418335, + "control_relative_error": -0.0025414968646391587, + "candidate_relative_error": -7.286753378506047e-05, + "absolute_error_change_pp": -0.24686293308540985 + }, + { + "name": "hmrc.tfc.government_top_up@2025", + "family": "hmrc_tfc", + "target": 599800000.0, + "control_estimate": 599657535.1840911, + "candidate_estimate": 599861349.4543235, + "control_relative_error": -0.00023752053335930119, + "candidate_relative_error": 0.00010228318493419506, + "absolute_error_change_pp": -0.013523734842510612 + }, + { + "name": "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 222000.0, + "control_estimate": 222578.88404417038, + "candidate_estimate": 222482.31531143188, + "control_relative_error": 0.00260758578455126, + "candidate_relative_error": 0.002172591492936418, + "absolute_error_change_pp": -0.04349942916148418 + }, + { + "name": "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 115000.0, + "control_estimate": 115074.04962778091, + "candidate_estimate": 114918.26409244537, + "control_relative_error": 0.0006439098067905592, + "candidate_relative_error": -0.0007107470222141431, + "absolute_error_change_pp": 0.006683721542358396 + }, + { + "name": "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 92000.0, + "control_estimate": 92040.45379924774, + "candidate_estimate": 92216.7066745758, + "control_relative_error": 0.0004397152092145837, + "candidate_relative_error": 0.0023555073323457136, + "absolute_error_change_pp": 0.191579212313113 + }, + { + "name": "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 372000.0, + "control_estimate": 371727.824590683, + "candidate_estimate": 371789.72939014435, + "control_relative_error": -0.0007316543261210123, + "candidate_relative_error": -0.0005652435748807846, + "absolute_error_change_pp": -0.016641075124022776 + }, + { + "name": "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 75000.0, + "control_estimate": 74926.22023010254, + "candidate_estimate": 74954.1375656128, + "control_relative_error": -0.0009837302652994792, + "candidate_relative_error": -0.0006114991251627604, + "absolute_error_change_pp": -0.03722311401367187 + }, + { + "name": "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 843000.0, + "control_estimate": 843664.7532503605, + "candidate_estimate": 843470.4051469908, + "control_relative_error": 0.0007885566433695005, + "candidate_relative_error": 0.0005580132230021189, + "absolute_error_change_pp": -0.023054342036738156 + }, + { + "name": "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 49000.0, + "control_estimate": 49076.62705421448, + "candidate_estimate": 48974.64538002014, + "control_relative_error": 0.0015638174329485211, + "candidate_relative_error": -0.0005174412240787429, + "absolute_error_change_pp": -0.10463762088697781 + }, + { + "name": "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 667000.0, + "control_estimate": 667118.4145302773, + "candidate_estimate": 667397.620798111, + "control_relative_error": 0.0001775330289014276, + "candidate_relative_error": 0.0005961331306011423, + "absolute_error_change_pp": 0.04186001016997147 + }, + { + "name": "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 627000.0, + "control_estimate": 627162.6924381256, + "candidate_estimate": 626971.544523716, + "control_relative_error": 0.00025947757276811856, + "candidate_relative_error": -4.538353474326491e-05, + "absolute_error_change_pp": -0.021409403802485367 + }, + { + "name": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 32000.0, + "control_estimate": 31914.33546447754, + "candidate_estimate": 31929.55731201172, + "control_relative_error": -0.0026770167350769042, + "candidate_relative_error": -0.002201333999633789, + "absolute_error_change_pp": -0.04756827354431151 + }, + { + "name": "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 643000.0, + "control_estimate": 642162.5516755949, + "candidate_estimate": 643025.1111498247, + "control_relative_error": -0.0013024079695258515, + "candidate_relative_error": 3.905311014726295e-05, + "absolute_error_change_pp": -0.12633548593785887 + }, + { + "name": "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 336000.0, + "control_estimate": 336064.1584918499, + "candidate_estimate": 336283.36672258377, + "control_relative_error": 0.00019094789241041457, + "candidate_relative_error": 0.0008433533410231272, + "absolute_error_change_pp": 0.06524054486127126 + }, + { + "name": "hmrc/dividend_income_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 6870000000.0, + "control_estimate": 6894273786.925237, + "candidate_estimate": 6891162516.622944, + "control_relative_error": 0.003533302318083945, + "candidate_relative_error": 0.0030804245448244364, + "absolute_error_change_pp": -0.04528777732595085 + }, + { + "name": "hmrc/dividend_income_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 175000000.0, + "control_estimate": 174824337.84038645, + "candidate_estimate": 174647766.9937784, + "control_relative_error": -0.001003783769220284, + "candidate_relative_error": -0.002012760035551957, + "absolute_error_change_pp": 0.10089762663316729 + }, + { + "name": "hmrc/dividend_income_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 3450000000.0, + "control_estimate": 3449923615.56849, + "candidate_estimate": 3462478300.690716, + "control_relative_error": -2.2140414930426557e-05, + "candidate_relative_error": 0.003616898750932113, + "absolute_error_change_pp": 0.3594758336001686 + }, + { + "name": "hmrc/dividend_income_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 855000000.0, + "control_estimate": 855082374.5444342, + "candidate_estimate": 853251250.6250467, + "control_relative_error": 9.634449641425707e-05, + "candidate_relative_error": -0.0020453209063780934, + "absolute_error_change_pp": 0.19489764099638363 + }, + { + "name": "hmrc/dividend_income_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 3700000000.0, + "control_estimate": 3697358285.405196, + "candidate_estimate": 3696543154.0687127, + "control_relative_error": -0.0007139769175145432, + "candidate_relative_error": -0.0009342826841316997, + "absolute_error_change_pp": 0.022030576661715644 + }, + { + "name": "hmrc/dividend_income_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 3330000000.0, + "control_estimate": 3331018611.9216385, + "candidate_estimate": 3332014411.7466683, + "control_relative_error": 0.00030588946595750413, + "candidate_relative_error": 0.0006049284524529546, + "absolute_error_change_pp": 0.029903898649545044 + }, + { + "name": "hmrc/dividend_income_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 3430000000.0, + "control_estimate": 3436143439.386361, + "candidate_estimate": 3442016019.7673182, + "control_relative_error": 0.0017910902001052834, + "candidate_relative_error": 0.003503212760151093, + "absolute_error_change_pp": 0.17121225600458095 + }, + { + "name": "hmrc/dividend_income_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 4700000000.0, + "control_estimate": 4692892862.74632, + "candidate_estimate": 4707275957.274032, + "control_relative_error": -0.001512156862485155, + "candidate_relative_error": 0.0015480760157514126, + "absolute_error_change_pp": 0.0035919153266257466 + }, + { + "name": "hmrc/dividend_income_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 8400000000.0, + "control_estimate": 8409454356.005359, + "candidate_estimate": 8395737304.968556, + "control_relative_error": 0.0011255185720665114, + "candidate_relative_error": -0.0005074636942194757, + "absolute_error_change_pp": -0.061805487784703565 + }, + { + "name": "hmrc/dividend_income_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 12500000000.0, + "control_estimate": 12500481578.788755, + "candidate_estimate": 12496676863.40134, + "control_relative_error": 3.852630310043335e-05, + "candidate_relative_error": -0.00026585092789276125, + "absolute_error_change_pp": 0.02273246247923279 + }, + { + "name": "hmrc/dividend_income_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 9440000000.0, + "control_estimate": 9440689361.02068, + "candidate_estimate": 9445466344.601028, + "control_relative_error": 7.302553185163919e-05, + "candidate_relative_error": 0.0005790619280750469, + "absolute_error_change_pp": 0.05060363962234077 + }, + { + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 791000.0, + "control_estimate": 792964.9012224728, + "candidate_estimate": 792138.8263628536, + "control_relative_error": 0.002484072341937772, + "candidate_relative_error": 0.001439729915112057, + "absolute_error_change_pp": -0.1044342426825715 + }, + { + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 1360000.0, + "control_estimate": 1365177.517014742, + "candidate_estimate": 1364502.4826648142, + "control_relative_error": 0.003806997804957278, + "candidate_relative_error": 0.0033106490182457492, + "absolute_error_change_pp": -0.049634878671152856 + }, + { + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 264000.0, + "control_estimate": 264663.1562137604, + "candidate_estimate": 263860.07652664185, + "control_relative_error": 0.0025119553551529394, + "candidate_relative_error": -0.0005300131566596753, + "absolute_error_change_pp": -0.1981942198493264 + }, + { + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 3100000.0, + "control_estimate": 3109879.536339771, + "candidate_estimate": 3104651.6507803467, + "control_relative_error": 0.003186947206377743, + "candidate_relative_error": 0.0015005325097892613, + "absolute_error_change_pp": -0.16864146965884816 + }, + { + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 180000.0, + "control_estimate": 180104.21351242065, + "candidate_estimate": 179753.73133850098, + "control_relative_error": 0.0005789639578925239, + "candidate_relative_error": -0.0013681592305501303, + "absolute_error_change_pp": 0.07891952726576064 + }, + { + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 7470000.0, + "control_estimate": 7499823.851601991, + "candidate_estimate": 7484920.125304093, + "control_relative_error": 0.003992483480855538, + "candidate_relative_error": 0.00199733939813824, + "absolute_error_change_pp": -0.1995144082717298 + }, + { + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 93000.0, + "control_estimate": 92867.96628284454, + "candidate_estimate": 92751.92737674713, + "control_relative_error": -0.00141971738876835, + "candidate_relative_error": -0.002667447561858803, + "absolute_error_change_pp": 0.12477301730904529 + }, + { + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 5370000.0, + "control_estimate": 5449477.36409642, + "candidate_estimate": 5442028.5377696715, + "control_relative_error": 0.014800254021679681, + "candidate_relative_error": 0.013413135525078498, + "absolute_error_change_pp": -0.13871184966011835 + }, + { + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 3500000.0, + "control_estimate": 3507028.743809776, + "candidate_estimate": 3502050.24144875, + "control_relative_error": 0.002008212517078833, + "candidate_relative_error": 0.000585783271071368, + "absolute_error_change_pp": -0.1422429246007465 + }, + { + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 44000.0, + "control_estimate": 43993.48078918457, + "candidate_estimate": 43946.834396362305, + "control_relative_error": -0.00014816388216885653, + "candidate_relative_error": -0.0012083091735839843, + "absolute_error_change_pp": 0.10601452914151277 + }, + { + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 3430000.0, + "control_estimate": 3434298.003418244, + "candidate_estimate": 3435972.7879767786, + "control_relative_error": 0.0012530622210623777, + "candidate_relative_error": 0.0017413376025593522, + "absolute_error_change_pp": 0.048827538149697446 + }, + { + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 1640000.0, + "control_estimate": 1657474.498050928, + "candidate_estimate": 1655284.3107624054, + "control_relative_error": 0.010655181738370802, + "candidate_relative_error": 0.009319701684393535, + "absolute_error_change_pp": -0.1335480053977267 + }, + { + "name": "hmrc/employment_income_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 82300000000.0, + "control_estimate": 82437277887.10991, + "candidate_estimate": 82477677437.58824, + "control_relative_error": 0.001668018069379211, + "candidate_relative_error": 0.002158899606175475, + "absolute_error_change_pp": 0.0490881536796264 + }, + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 16900000000.0, + "control_estimate": 16867559505.962223, + "candidate_estimate": 16866580981.908524, + "control_relative_error": -0.001919555860223488, + "candidate_relative_error": -0.0019774566918033397, + "absolute_error_change_pp": 0.005790083157985169 + }, + { + "name": "hmrc/employment_income_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 39200000000.0, + "control_estimate": 39343722658.34471, + "candidate_estimate": 39224460536.383736, + "control_relative_error": 0.0036663943455283498, + "candidate_relative_error": 0.0006239932750952973, + "absolute_error_change_pp": -0.30424010704330523 + }, + { + "name": "hmrc/employment_income_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 48600000000.0, + "control_estimate": 48571104009.64969, + "candidate_estimate": 48573626956.30167, + "control_relative_error": -0.0005945677026813021, + "candidate_relative_error": -0.0005426552201303239, + "absolute_error_change_pp": -0.005191248255097822 + }, + { + "name": "hmrc/employment_income_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 36600000000.0, + "control_estimate": 36686181384.16371, + "candidate_estimate": 36591627859.24364, + "control_relative_error": 0.002354682627423813, + "candidate_relative_error": -0.00022874701520117255, + "absolute_error_change_pp": -0.21259356122226405 + }, + { + "name": "hmrc/employment_income_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 172000000000.0, + "control_estimate": 172083482725.8886, + "candidate_estimate": 172063615826.5224, + "control_relative_error": 0.00048536468539890024, + "candidate_relative_error": 0.00036985945652558084, + "absolute_error_change_pp": -0.01155052288733194 + }, + { + "name": "hmrc/employment_income_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 29000000000.0, + "control_estimate": 30564748001.398754, + "candidate_estimate": 30301756357.25937, + "control_relative_error": 0.0539568276344398, + "candidate_relative_error": 0.04488815025032306, + "absolute_error_change_pp": -0.9068677384116736 + }, + { + "name": "hmrc/employment_income_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 170000000000.0, + "control_estimate": 170115166383.40378, + "candidate_estimate": 170032447485.84415, + "control_relative_error": 0.000677449314139871, + "candidate_relative_error": 0.00019086756378909842, + "absolute_error_change_pp": -0.04865817503507726 + }, + { + "name": "hmrc/employment_income_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 139000000000.0, + "control_estimate": 139158516908.86105, + "candidate_estimate": 139086852358.84, + "control_relative_error": 0.0011404094162665718, + "candidate_relative_error": 0.0006248371139568082, + "absolute_error_change_pp": -0.05155723023097635 + }, + { + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 23100000000.0, + "control_estimate": 23117163879.138275, + "candidate_estimate": 23082529683.230755, + "control_relative_error": 0.0007430250709210021, + "candidate_relative_error": -0.0007562907692313916, + "absolute_error_change_pp": 0.001326569831038959 + }, + { + "name": "hmrc/employment_income_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 174000000000.0, + "control_estimate": 174344680401.29572, + "candidate_estimate": 174756801223.34763, + "control_relative_error": 0.0019809218465271, + "candidate_relative_error": 0.004349432318089803, + "absolute_error_change_pp": 0.23685104715627034 + }, + { + "name": "hmrc/employment_income_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 118000000000.0, + "control_estimate": 118035277549.29321, + "candidate_estimate": 117956350721.91338, + "control_relative_error": 0.00029896228214587193, + "candidate_relative_error": -0.00036990913632732326, + "absolute_error_change_pp": 0.007094685418145133 + }, + { + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 109000.0, + "control_estimate": 109048.34322357178, + "candidate_estimate": 109161.64456558228, + "control_relative_error": 0.00044351581258511325, + "candidate_relative_error": 0.0014829776658924348, + "absolute_error_change_pp": 0.10394618533073217 + }, + { + "name": "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 1070000.0, + "control_estimate": 1071354.7379851341, + "candidate_estimate": 1070596.143336296, + "control_relative_error": 0.0012661102664804904, + "candidate_relative_error": 0.0005571433049496089, + "absolute_error_change_pp": -0.07089669615308815 + }, + { + "name": "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 29000.0, + "control_estimate": 29040.356709480286, + "candidate_estimate": 29000.459478378296, + "control_relative_error": 0.0013916106717339878, + "candidate_relative_error": 1.5844082010203393e-05, + "absolute_error_change_pp": -0.13757665897237845 + }, + { + "name": "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 2140000.0, + "control_estimate": 2141104.6531006563, + "candidate_estimate": 2138787.0376602025, + "control_relative_error": 0.000516193037689881, + "candidate_relative_error": -0.0005668048316810855, + "absolute_error_change_pp": 0.005061179399120448 + }, + { + "name": "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 20000.0, + "control_estimate": 19962.649101257324, + "candidate_estimate": 20082.078704833984, + "control_relative_error": -0.001867544937133789, + "candidate_relative_error": 0.004103935241699218, + "absolute_error_change_pp": 0.22363903045654293 + }, + { + "name": "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 2660000.0, + "control_estimate": 2661302.84004879, + "candidate_estimate": 2659180.0798906432, + "control_relative_error": 0.0004897894920263075, + "candidate_relative_error": -0.00030824064261532086, + "absolute_error_change_pp": -0.018154884941098667 + }, + { + "name": "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 10000.0, + "control_estimate": 10001.05462551117, + "candidate_estimate": 10029.502806663513, + "control_relative_error": 0.00010546255111694336, + "candidate_relative_error": 0.0029502806663513183, + "absolute_error_change_pp": 0.2844818115234375 + }, + { + "name": "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 1450000.0, + "control_estimate": 1448803.863445282, + "candidate_estimate": 1450017.896736145, + "control_relative_error": -0.0008249217618744949, + "candidate_relative_error": 1.2342576651737608e-05, + "absolute_error_change_pp": -0.08125791852227573 + }, + { + "name": "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 779000.0, + "control_estimate": 778593.1363544464, + "candidate_estimate": 778820.1164355278, + "control_relative_error": -0.0005222896605309228, + "candidate_relative_error": -0.0002309160006061598, + "absolute_error_change_pp": -0.0291373659924763 + }, + { + "name": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 4000.0, + "control_estimate": 4003.2963256835938, + "candidate_estimate": 3993.177444458008, + "control_relative_error": 0.0008240814208984375, + "candidate_relative_error": -0.0017056388854980468, + "absolute_error_change_pp": 0.08815574645996094 + }, + { + "name": "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 643000.0, + "control_estimate": 641976.118216753, + "candidate_estimate": 643367.7096328735, + "control_relative_error": -0.0015923511403530234, + "candidate_relative_error": 0.0005718656809852802, + "absolute_error_change_pp": -0.10204854593677433 + }, + { + "name": "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 259000.0, + "control_estimate": 259416.3604233319, + "candidate_estimate": 258208.08591270447, + "control_relative_error": 0.0016075692020536896, + "candidate_relative_error": -0.0030575833486313985, + "absolute_error_change_pp": 0.1450014146577709 + }, + { + "name": "hmrc/private_pension_income_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 5430000000.0, + "control_estimate": 5433440329.915841, + "candidate_estimate": 5434683887.414151, + "control_relative_error": 0.0006335782533777353, + "candidate_relative_error": 0.0008625943672469966, + "absolute_error_change_pp": 0.022901611386926132 + }, + { + "name": "hmrc/private_pension_income_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 4350000000.0, + "control_estimate": 4356060765.123558, + "candidate_estimate": 4354845031.623423, + "control_relative_error": 0.0013932793387489758, + "candidate_relative_error": 0.0011138003732006029, + "absolute_error_change_pp": -0.02794789655483729 + }, + { + "name": "hmrc/private_pension_income_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 1810000000.0, + "control_estimate": 1812924024.293221, + "candidate_estimate": 1806842622.6002488, + "control_relative_error": 0.0016154830349287275, + "candidate_relative_error": -0.001744407403177451, + "absolute_error_change_pp": 0.01289243682487235 + }, + { + "name": "hmrc/private_pension_income_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 13600000000.0, + "control_estimate": 13603170338.357073, + "candidate_estimate": 13594692879.58194, + "control_relative_error": 0.0002331131144906493, + "candidate_relative_error": -0.00039022944250443405, + "absolute_error_change_pp": 0.015711632801378477 + }, + { + "name": "hmrc/private_pension_income_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 1570000000.0, + "control_estimate": 1564151609.361326, + "candidate_estimate": 1580843500.957539, + "control_relative_error": -0.0037250895787732615, + "candidate_relative_error": 0.006906688507986676, + "absolute_error_change_pp": 0.3181598929213415 + }, + { + "name": "hmrc/private_pension_income_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 30200000000.0, + "control_estimate": 30210500378.603336, + "candidate_estimate": 30205728919.41489, + "control_relative_error": 0.0003476946557396137, + "candidate_relative_error": 0.00018969931837385063, + "absolute_error_change_pp": -0.015799533736576308 + }, + { + "name": "hmrc/private_pension_income_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 1120000000.0, + "control_estimate": 980300037.0694891, + "candidate_estimate": 992994511.6282674, + "control_relative_error": -0.12473210975938472, + "candidate_relative_error": -0.11339775747476125, + "absolute_error_change_pp": -1.133435228462347 + }, + { + "name": "hmrc/private_pension_income_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 24900000000.0, + "control_estimate": 24889272149.0994, + "candidate_estimate": 24924507957.4174, + "control_relative_error": -0.00043083738556628246, + "candidate_relative_error": 0.000984255317967886, + "absolute_error_change_pp": 0.05534179324016036 + }, + { + "name": "hmrc/private_pension_income_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 16900000000.0, + "control_estimate": 16906004975.266615, + "candidate_estimate": 16908386003.829512, + "control_relative_error": 0.0003553239802730718, + "candidate_relative_error": 0.0004962132443498014, + "absolute_error_change_pp": 0.014088926407672956 + }, + { + "name": "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 640000000.0, + "control_estimate": 640246080.3115848, + "candidate_estimate": 638899817.9100064, + "control_relative_error": 0.0003845004868512973, + "candidate_relative_error": -0.0017190345156149938, + "absolute_error_change_pp": 0.13345340287636964 + }, + { + "name": "hmrc/private_pension_income_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 17400000000.0, + "control_estimate": 17383249921.012943, + "candidate_estimate": 17411039971.17449, + "control_relative_error": -0.0009626482176469386, + "candidate_relative_error": 0.0006344811019822921, + "absolute_error_change_pp": -0.03281671156646466 + }, + { + "name": "hmrc/private_pension_income_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 9470000000.0, + "control_estimate": 9480415417.97901, + "candidate_estimate": 9439299568.338987, + "control_relative_error": 0.001099832943929211, + "candidate_relative_error": -0.0032418618438239334, + "absolute_error_change_pp": 0.21420288998947223 + }, + { + "name": "hmrc/property_income_count_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 137000.0, + "control_estimate": 136474.92591285706, + "candidate_estimate": 137168.26479148865, + "control_relative_error": -0.003832657570386455, + "candidate_relative_error": 0.0012282101568514413, + "absolute_error_change_pp": -0.2604447413535014 + }, + { + "name": "hmrc/property_income_count_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 101000.0, + "control_estimate": 101109.31782150269, + "candidate_estimate": 101346.8582649231, + "control_relative_error": 0.0010823546683434212, + "candidate_relative_error": 0.0034342402467633236, + "absolute_error_change_pp": 0.23518855784199025 + }, + { + "name": "hmrc/property_income_count_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 54000.0, + "control_estimate": 54171.188457489014, + "candidate_estimate": 53825.39771270752, + "control_relative_error": 0.00317015662016692, + "candidate_relative_error": -0.00323337569060149, + "absolute_error_change_pp": 0.006321907043457028 + }, + { + "name": "hmrc/property_income_count_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 232000.0, + "control_estimate": 231389.88915538788, + "candidate_estimate": 231284.48879432678, + "control_relative_error": -0.0026297881233281104, + "candidate_relative_error": -0.003084100024453525, + "absolute_error_change_pp": 0.04543119011254145 + }, + { + "name": "hmrc/property_income_count_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 41000.0, + "control_estimate": 41078.52325439453, + "candidate_estimate": 40985.660652160645, + "control_relative_error": 0.0019152013266958842, + "candidate_relative_error": -0.0003497401912037919, + "absolute_error_change_pp": -0.15654611354920922 + }, + { + "name": "hmrc/property_income_count_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 431000.0, + "control_estimate": 430581.1872162819, + "candidate_estimate": 431645.16889953613, + "control_relative_error": -0.000971723396097701, + "candidate_relative_error": 0.0014969115998518163, + "absolute_error_change_pp": 0.05251882037541152 + }, + { + "name": "hmrc/property_income_count_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 23000.0, + "control_estimate": 23012.888721466064, + "candidate_estimate": 23027.067195892334, + "control_relative_error": 0.0005603791941767154, + "candidate_relative_error": 0.001176834604014521, + "absolute_error_change_pp": 0.06164554098378056 + }, + { + "name": "hmrc/property_income_count_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 364000.0, + "control_estimate": 363327.8918809891, + "candidate_estimate": 364464.5138530731, + "control_relative_error": -0.001846450876403641, + "candidate_relative_error": 0.0012761369589920882, + "absolute_error_change_pp": -0.05703139174115528 + }, + { + "name": "hmrc/property_income_count_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 325000.0, + "control_estimate": 325168.9147930145, + "candidate_estimate": 324922.35222148895, + "control_relative_error": 0.0005197378246600811, + "candidate_relative_error": -0.00023891624157245343, + "absolute_error_change_pp": -0.02808215830876277 + }, + { + "name": "hmrc/property_income_count_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 397000.0, + "control_estimate": 396466.29116535187, + "candidate_estimate": 397204.8216605553, + "control_relative_error": -0.0013443547472245148, + "candidate_relative_error": 0.00051592357822498, + "absolute_error_change_pp": -0.08284311689995348 + }, + { + "name": "hmrc/property_income_count_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 226000.0, + "control_estimate": 226300.05749225616, + "candidate_estimate": 225959.64861869812, + "control_relative_error": 0.0013276880188325866, + "candidate_relative_error": -0.00017854593496407028, + "absolute_error_change_pp": -0.11491420838685162 + }, + { + "name": "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 85000.0, + "control_estimate": 84779.2965927124, + "candidate_estimate": 85157.46286582947, + "control_relative_error": -0.002596510673971737, + "candidate_relative_error": 0.0018525043038760914, + "absolute_error_change_pp": -0.07440063700956458 + }, + { + "name": "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 444000.0, + "control_estimate": 443786.3394908905, + "candidate_estimate": 444335.54044914246, + "control_relative_error": -0.0004812173628592276, + "candidate_relative_error": 0.0007557217323028289, + "absolute_error_change_pp": 0.027450436944360133 + }, + { + "name": "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 40000.0, + "control_estimate": 40095.42194366455, + "candidate_estimate": 39789.439628601074, + "control_relative_error": 0.0023855485916137696, + "candidate_relative_error": -0.005264009284973145, + "absolute_error_change_pp": 0.28784606933593754 + }, + { + "name": "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 651000.0, + "control_estimate": 649448.8898844719, + "candidate_estimate": 649775.5322070122, + "control_relative_error": -0.0023826576275393346, + "candidate_relative_error": -0.0018809029078153971, + "absolute_error_change_pp": -0.05017547197239374 + }, + { + "name": "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 34000.0, + "control_estimate": 34100.544335365295, + "candidate_estimate": 33880.59492301941, + "control_relative_error": 0.0029571863342733942, + "candidate_relative_error": -0.0035119140288409063, + "absolute_error_change_pp": 0.05547276945675121 + }, + { + "name": "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 961000.0, + "control_estimate": 961648.5036541545, + "candidate_estimate": 962860.4917839216, + "control_relative_error": 0.0006748217004729274, + "candidate_relative_error": 0.0019359956128216513, + "absolute_error_change_pp": 0.1261173912348724 + }, + { + "name": "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 21000.0, + "control_estimate": 21052.293586730957, + "candidate_estimate": 21000.487686157227, + "control_relative_error": 0.0024901707967122395, + "candidate_relative_error": 2.3223150344122024e-05, + "absolute_error_change_pp": -0.24669476463681175 + }, + { + "name": "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 595000.0, + "control_estimate": 596358.2788336277, + "candidate_estimate": 595769.5046725273, + "control_relative_error": 0.0022828215691221864, + "candidate_relative_error": 0.0012932851639114507, + "absolute_error_change_pp": -0.09895364052107357 + }, + { + "name": "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 359000.0, + "control_estimate": 358874.54667305946, + "candidate_estimate": 358798.1196374893, + "control_relative_error": -0.0003494521641797674, + "candidate_relative_error": -0.000562340842648137, + "absolute_error_change_pp": 0.021288867846836954 + }, + { + "name": "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 311000.0, + "control_estimate": 310717.4570353031, + "candidate_estimate": 310817.2210073471, + "control_relative_error": -0.0009084982787681162, + "candidate_relative_error": -0.0005877138027424215, + "absolute_error_change_pp": -0.032078447602569476 + }, + { + "name": "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 143000.0, + "control_estimate": 143363.71698760986, + "candidate_estimate": 142843.02161169052, + "control_relative_error": 0.0025434754378312117, + "candidate_relative_error": -0.0010977509671991521, + "absolute_error_change_pp": -0.14457244706320596 + }, + { + "name": "hmrc/self_employment_income_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 4980000000.0, + "control_estimate": 4984023895.826436, + "candidate_estimate": 5002125371.4517975, + "control_relative_error": 0.0008080112101277195, + "candidate_relative_error": 0.004442845673051704, + "absolute_error_change_pp": 0.3634834462923984 + }, + { + "name": "hmrc/self_employment_income_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 4810000000.0, + "control_estimate": 4805984335.611502, + "candidate_estimate": 4814485854.718028, + "control_relative_error": -0.0008348574612262591, + "candidate_relative_error": 0.000932610128488164, + "absolute_error_change_pp": 0.009775266726190491 + }, + { + "name": "hmrc/self_employment_income_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 3650000000.0, + "control_estimate": 3656566481.5439396, + "candidate_estimate": 3641379163.178382, + "control_relative_error": 0.0017990360394355043, + "candidate_relative_error": -0.0023618731018131725, + "absolute_error_change_pp": 0.05628370623776682 + }, + { + "name": "hmrc/self_employment_income_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 8030000000.0, + "control_estimate": 8028363000.666877, + "candidate_estimate": 8029726117.750705, + "control_relative_error": -0.00020386043999043676, + "candidate_relative_error": -3.4107378492557246e-05, + "absolute_error_change_pp": -0.016975306149787952 + }, + { + "name": "hmrc/self_employment_income_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 4390000000.0, + "control_estimate": 4417881742.78326, + "candidate_estimate": 4378035529.538005, + "control_relative_error": 0.006351194255867961, + "candidate_relative_error": -0.0027253919047824887, + "absolute_error_change_pp": -0.3625802351085472 + }, + { + "name": "hmrc/self_employment_income_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 15700000000.0, + "control_estimate": 18832491476.593945, + "candidate_estimate": 18880756116.185246, + "control_relative_error": 0.19952175010152512, + "candidate_relative_error": 0.2025959309672131, + "absolute_error_change_pp": 0.30741808656879754 + }, + { + "name": "hmrc/self_employment_income_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 4840000000.0, + "control_estimate": 4854893343.750498, + "candidate_estimate": 4842675904.852768, + "control_relative_error": 0.003077137138532607, + "candidate_relative_error": 0.0005528729034644513, + "absolute_error_change_pp": -0.2524264235068156 + }, + { + "name": "hmrc/self_employment_income_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 12600000000.0, + "control_estimate": 15640360964.991894, + "candidate_estimate": 15637827479.670216, + "control_relative_error": 0.24129848928507094, + "candidate_relative_error": 0.24109741902144569, + "absolute_error_change_pp": -0.020107026362525815 + }, + { + "name": "hmrc/self_employment_income_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 8730000000.0, + "control_estimate": 9108844173.579672, + "candidate_estimate": 8885513671.543478, + "control_relative_error": 0.04339566707670926, + "candidate_relative_error": 0.017813708080581674, + "absolute_error_change_pp": -2.558195899612759 + }, + { + "name": "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 6670000000.0, + "control_estimate": 6671560517.966438, + "candidate_estimate": 6656275570.626277, + "control_relative_error": 0.0002339607146084398, + "candidate_relative_error": -0.002057635588264322, + "absolute_error_change_pp": 0.18236748736558825 + }, + { + "name": "hmrc/self_employment_income_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 8220000000.0, + "control_estimate": 8246860288.349117, + "candidate_estimate": 8222861627.814151, + "control_relative_error": 0.003267674981644438, + "candidate_relative_error": 0.0003481299043979088, + "absolute_error_change_pp": -0.2919545077246529 + }, + { + "name": "hmrc/self_employment_income_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 5360000000.0, + "control_estimate": 5381368863.645258, + "candidate_estimate": 5351311047.545394, + "control_relative_error": 0.003986728292025737, + "candidate_relative_error": -0.001621073219142921, + "absolute_error_change_pp": -0.2365655072882816 + }, + { + "name": "hmrc/state_pension_count_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 74000.0, + "control_estimate": 73968.48151302338, + "candidate_estimate": 74083.94567298889, + "control_relative_error": -0.00042592549968410183, + "candidate_relative_error": 0.001134400986336373, + "absolute_error_change_pp": 0.07084754866522713 + }, + { + "name": "hmrc/state_pension_count_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 1140000.0, + "control_estimate": 1134548.6955971718, + "candidate_estimate": 1134636.439702034, + "control_relative_error": -0.004781845967393172, + "candidate_relative_error": -0.0047048774543561435, + "absolute_error_change_pp": -0.007696851303702883 + }, + { + "name": "hmrc/state_pension_count_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 21000.0, + "control_estimate": 21076.303547859192, + "candidate_estimate": 21036.434980392456, + "control_relative_error": 0.0036335022790091377, + "candidate_relative_error": 0.0017349990663074312, + "absolute_error_change_pp": -0.18985032127017065 + }, + { + "name": "hmrc/state_pension_count_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 2050000.0, + "control_estimate": 2048606.901837158, + "candidate_estimate": 2045081.9775728807, + "control_relative_error": -0.0006795600794351137, + "candidate_relative_error": -0.0023990353303021046, + "absolute_error_change_pp": 0.17194752508669908 + }, + { + "name": "hmrc/state_pension_count_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 14000.0, + "control_estimate": 13982.514541625977, + "candidate_estimate": 14033.310676574707, + "control_relative_error": -0.0012489613124302456, + "candidate_relative_error": 0.0023793340410505023, + "absolute_error_change_pp": 0.11303727286202567 + }, + { + "name": "hmrc/state_pension_count_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 2320000.0, + "control_estimate": 2318867.7951540947, + "candidate_estimate": 2316376.5817723274, + "control_relative_error": -0.00048801933013159656, + "candidate_relative_error": -0.0015618182015830072, + "absolute_error_change_pp": 0.10737988714514106 + }, + { + "name": "hmrc/state_pension_count_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 8000.0, + "control_estimate": 8003.899812698364, + "candidate_estimate": 8016.0708866119385, + "control_relative_error": 0.0004874765872955322, + "candidate_relative_error": 0.0020088608264923094, + "absolute_error_change_pp": 0.15213842391967772 + }, + { + "name": "hmrc/state_pension_count_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 1160000.0, + "control_estimate": 1157248.0961830616, + "candidate_estimate": 1157175.0187387466, + "control_relative_error": -0.0023723308766710346, + "candidate_relative_error": -0.0024353286734942734, + "absolute_error_change_pp": 0.006299779682323887 + }, + { + "name": "hmrc/state_pension_count_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 568000.0, + "control_estimate": 565906.816724062, + "candidate_estimate": 566699.9505386353, + "control_relative_error": -0.003685181823834567, + "candidate_relative_error": -0.002288819474233708, + "absolute_error_change_pp": -0.1396362349600859 + }, + { + "name": "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 3000.0, + "control_estimate": 3004.0203247070312, + "candidate_estimate": 2993.7835235595703, + "control_relative_error": 0.0013401082356770833, + "candidate_relative_error": -0.0020721588134765623, + "absolute_error_change_pp": 0.0732050577799479 + }, + { + "name": "hmrc/state_pension_count_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 441000.0, + "control_estimate": 436302.3439991841, + "candidate_estimate": 438974.53312734456, + "control_relative_error": -0.010652281180988467, + "candidate_relative_error": -0.004592895402846796, + "absolute_error_change_pp": -0.605938577814167 + }, + { + "name": "hmrc/state_pension_count_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 176000.0, + "control_estimate": 176113.6406710202, + "candidate_estimate": 175479.15962600708, + "control_relative_error": 0.0006456856307965857, + "candidate_relative_error": -0.0029593203067779543, + "absolute_error_change_pp": 0.23136346759813686 + }, + { + "name": "hmrc/state_pension_income_band_100_000_to_150_000@2025", + "family": "hmrc_spi", + "target": 847000000.0, + "control_estimate": 847427364.7766821, + "candidate_estimate": 848303808.7041687, + "control_relative_error": 0.000504562900451167, + "candidate_relative_error": 0.0015393255066926534, + "absolute_error_change_pp": 0.10347626062414864 + }, + { + "name": "hmrc/state_pension_income_band_12_570_to_15_000@2025", + "family": "hmrc_spi", + "target": 11800000000.0, + "control_estimate": 13033227546.5607, + "candidate_estimate": 13033212492.867386, + "control_relative_error": 0.10451080903056775, + "candidate_relative_error": 0.10450953329384625, + "absolute_error_change_pp": -0.00012757367214982773 + }, + { + "name": "hmrc/state_pension_income_band_150_000_to_200_000@2025", + "family": "hmrc_spi", + "target": 265000000.0, + "control_estimate": 266009583.33404294, + "candidate_estimate": 265512754.50858057, + "control_relative_error": 0.003809748430350704, + "candidate_relative_error": 0.0019349226738889262, + "absolute_error_change_pp": -0.18748257564617776 + }, + { + "name": "hmrc/state_pension_income_band_15_000_to_20_000@2025", + "family": "hmrc_spi", + "target": 22200000000.0, + "control_estimate": 25342727509.764053, + "candidate_estimate": 25326176361.54487, + "control_relative_error": 0.14156430224162403, + "candidate_relative_error": 0.14081875502454363, + "absolute_error_change_pp": -0.07455472170803945 + }, + { + "name": "hmrc/state_pension_income_band_200_000_to_300_000@2025", + "family": "hmrc_spi", + "target": 179000000.0, + "control_estimate": 178828836.30172962, + "candidate_estimate": 179534540.62778068, + "control_relative_error": -0.0009562217780468184, + "candidate_relative_error": 0.0029862604903948373, + "absolute_error_change_pp": 0.20300387123480187 + }, + { + "name": "hmrc/state_pension_income_band_20_000_to_30_000@2025", + "family": "hmrc_spi", + "target": 24900000000.0, + "control_estimate": 29499726951.278637, + "candidate_estimate": 29557872946.87977, + "control_relative_error": 0.18472799001119025, + "candidate_relative_error": 0.18706317055742042, + "absolute_error_change_pp": 0.23351805462301645 + }, + { + "name": "hmrc/state_pension_income_band_300_000_to_500_000@2025", + "family": "hmrc_spi", + "target": 96000000.0, + "control_estimate": 95667021.17564905, + "candidate_estimate": 95843214.89340216, + "control_relative_error": -0.003468529420322428, + "candidate_relative_error": -0.001633178193727508, + "absolute_error_change_pp": -0.18353512265949198 + }, + { + "name": "hmrc/state_pension_income_band_30_000_to_40_000@2025", + "family": "hmrc_spi", + "target": 12300000000.0, + "control_estimate": 13973223039.1955, + "candidate_estimate": 13973400701.728178, + "control_relative_error": 0.13603439343052842, + "candidate_relative_error": 0.13604883753887625, + "absolute_error_change_pp": 0.0014444108347833051 + }, + { + "name": "hmrc/state_pension_income_band_40_000_to_50_000@2025", + "family": "hmrc_spi", + "target": 6020000000.0, + "control_estimate": 6352584516.144807, + "candidate_estimate": 6332412976.960441, + "control_relative_error": 0.055246597366246986, + "candidate_relative_error": 0.051895843348910405, + "absolute_error_change_pp": -0.33507540173365813 + }, + { + "name": "hmrc/state_pension_income_band_500_000_to_1_000_000@2025", + "family": "hmrc_spi", + "target": 43000000.0, + "control_estimate": 43037970.99150249, + "candidate_estimate": 42904568.971734256, + "control_relative_error": 0.0008830463140114795, + "candidate_relative_error": -0.002219326238738243, + "absolute_error_change_pp": 0.13362799247267634 + }, + { + "name": "hmrc/state_pension_income_band_50_000_to_70_000@2025", + "family": "hmrc_spi", + "target": 4660000000.0, + "control_estimate": 4791615583.981081, + "candidate_estimate": 4785714760.981318, + "control_relative_error": 0.028243687549588198, + "candidate_relative_error": 0.026977416519596238, + "absolute_error_change_pp": -0.12662710299919597 + }, + { + "name": "hmrc/state_pension_income_band_70_000_to_100_000@2025", + "family": "hmrc_spi", + "target": 1890000000.0, + "control_estimate": 1891505349.6346827, + "candidate_estimate": 1886420716.8490741, + "control_relative_error": 0.0007964812881918811, + "candidate_relative_error": -0.0018938006089554893, + "absolute_error_change_pp": 0.10973193207636082 + }, + { + "name": "isc.private_school_students@2025", + "family": "isc", + "target": 556551.0, + "control_estimate": 556227.3886165619, + "candidate_estimate": 556125.4962882996, + "control_relative_error": -0.0005814586326106868, + "candidate_relative_error": -0.0007645367840511282, + "absolute_error_change_pp": 0.01830781514404414 + }, + { + "name": "obr.attendance_allowance@2025", + "family": "obr", + "target": 8492497075.074617, + "control_estimate": 8495117485.085889, + "candidate_estimate": 8482816736.632687, + "control_relative_error": 0.00030855589211356343, + "candidate_relative_error": -0.0011398695055594961, + "absolute_error_change_pp": 0.08313136134459327 + }, + { + "name": "obr.carers_allowance@2025", + "family": "obr", + "target": 4569403813.760573, + "control_estimate": 4571134406.246751, + "candidate_estimate": 4570928918.236375, + "control_relative_error": 0.0003787348539793825, + "candidate_relative_error": 0.00033376443360262403, + "absolute_error_change_pp": -0.004497042037675849 + }, + { + "name": "obr.child_benefit@2025", + "family": "obr", + "target": 13389272724.45089, + "control_estimate": 15759391835.595362, + "candidate_estimate": 15649031340.746838, + "control_relative_error": 0.17701626966013373, + "candidate_relative_error": 0.1687738133953518, + "absolute_error_change_pp": -0.8242456264781928 + }, + { + "name": "obr.council_tax@2025", + "family": "obr", + "target": 50925163826.30539, + "control_estimate": 47022874245.53085, + "candidate_estimate": 47161572620.27391, + "control_relative_error": -0.07662792394904008, + "candidate_relative_error": -0.07390435146891754, + "absolute_error_change_pp": -0.27235724801225464 + }, + { + "name": "obr.esa@2025", + "family": "obr", + "target": 7206287181.538654, + "control_estimate": 6475729628.614429, + "candidate_estimate": 6509898925.556877, + "control_relative_error": -0.10137780170568216, + "candidate_relative_error": -0.09663620647339889, + "absolute_error_change_pp": -0.47415952322832633 + }, + { + "name": "obr.income_tax@2025", + "family": "obr", + "target": 331437583074.4429, + "control_estimate": 289208975664.497, + "candidate_estimate": 289277484990.5292, + "control_relative_error": -0.1274104373385473, + "candidate_relative_error": -0.12720373378550823, + "absolute_error_change_pp": -0.02067035530390615 + }, + { + "name": "obr.jobseekers_allowance@2025", + "family": "obr", + "target": 280558748.04472804, + "control_estimate": 281315294.25617826, + "candidate_estimate": 280696853.353428, + "control_relative_error": 0.0026965696729214336, + "candidate_relative_error": 0.0004922509444544145, + "absolute_error_change_pp": -0.2204318728467019 + }, + { + "name": "obr.ni@2025", + "family": "obr", + "target": 200081395082.7125, + "control_estimate": 196836566204.77274, + "candidate_estimate": 196935189863.2001, + "control_relative_error": -0.016217544247921527, + "candidate_relative_error": -0.015724626561164107, + "absolute_error_change_pp": -0.04929176867574207 + }, + { + "name": "obr.ni_employee@2025", + "family": "obr", + "target": 49544363784.26465, + "control_estimate": 47811612495.26749, + "candidate_estimate": 47858392837.82478, + "control_relative_error": -0.03497373175568935, + "candidate_relative_error": -0.034029520568297854, + "absolute_error_change_pp": -0.09442111873914985 + }, + { + "name": "obr.ni_employer@2025", + "family": "obr", + "target": 145324007512.71753, + "control_estimate": 146121664326.81866, + "candidate_estimate": 146176809372.04532, + "control_relative_error": 0.005488816526280636, + "candidate_relative_error": 0.005868279260418547, + "absolute_error_change_pp": 0.03794627341379107 + }, + { + "name": "obr.ni_self_employed@2025", + "family": "obr", + "target": 2902816090.4147716, + "control_estimate": 2903289600.529053, + "candidate_estimate": 2899987872.7277045, + "control_relative_error": 0.0001631209486006385, + "candidate_relative_error": -0.0009743013676980546, + "absolute_error_change_pp": 0.08111804190974162 + }, + { + "name": "obr.pension_credit@2025", + "family": "obr", + "target": 6146422389.476461, + "control_estimate": 6146934201.258123, + "candidate_estimate": 6135357481.668367, + "control_relative_error": 8.326986810055244e-05, + "candidate_relative_error": -0.0018002192343693627, + "absolute_error_change_pp": 0.17169493662688104 + }, + { + "name": "obr.pip@2025", + "family": "obr", + "target": 36910059270.5278, + "control_estimate": 36900612286.28908, + "candidate_estimate": 36925162975.16164, + "control_relative_error": -0.0002559460598392224, + "candidate_relative_error": 0.00040920293633597463, + "absolute_error_change_pp": 0.015325687649675224 + }, + { + "name": "obr.sdlt@2025", + "family": "obr", + "target": 15406516698.785578, + "control_estimate": 15467288072.986925, + "candidate_estimate": 15428332402.652102, + "control_relative_error": 0.003944523956290371, + "candidate_relative_error": 0.0014160049473248791, + "absolute_error_change_pp": -0.25285190089654913 + }, + { + "name": "obr.state_pension@2025", + "family": "obr", + "target": 146185954351.57382, + "control_estimate": 137018135866.62624, + "candidate_estimate": 137856714380.9764, + "control_relative_error": -0.06271340174651249, + "candidate_relative_error": -0.05697701949235002, + "absolute_error_change_pp": -0.5736382254162474 + }, + { + "name": "obr.statutory_maternity_pay@2025", + "family": "obr", + "target": 3194800881.520547, + "control_estimate": 3195978838.32002, + "candidate_estimate": 3189762668.959949, + "control_relative_error": 0.00036871055291328326, + "candidate_relative_error": -0.0015770036216466764, + "absolute_error_change_pp": 0.12082930687333931 + }, + { + "name": "obr.tv_licence_fee@2025", + "family": "obr", + "target": 3872000000.0, + "control_estimate": 3873761399.8596377, + "candidate_estimate": 3872382206.1125503, + "control_relative_error": 0.000454906988542804, + "candidate_relative_error": 9.871025634045935e-05, + "absolute_error_change_pp": -0.03561967322023447 + }, + { + "name": "obr.vat@2025", + "family": "obr", + "target": 180168938685.41794, + "control_estimate": 192246685136.8141, + "candidate_estimate": 188915490408.41504, + "control_relative_error": 0.06703567518086105, + "candidate_relative_error": 0.048546390886327666, + "absolute_error_change_pp": -1.8489284294533386 + }, + { + "name": "obr.winter_fuel_allowance@2025", + "family": "obr", + "target": 1911040880.4619167, + "control_estimate": 1911426611.002743, + "candidate_estimate": 1910612883.536038, + "control_relative_error": 0.00020184316555964303, + "candidate_relative_error": -0.000223960110039777, + "absolute_error_change_pp": 0.002211694448013397 + }, + { + "name": "ons.household_composition.couple_3_plus_children_households@2025", + "family": "ons_household_composition", + "target": 931000.0, + "control_estimate": 930534.1579246521, + "candidate_estimate": 931079.7128439706, + "control_relative_error": -0.0005003674278709993, + "candidate_relative_error": 8.56206702154978e-05, + "absolute_error_change_pp": -0.041474675765550154 + }, + { + "name": "ons.household_composition.couple_no_children_households@2025", + "family": "ons_household_composition", + "target": 8119000.0, + "control_estimate": 8127232.394597758, + "candidate_estimate": 8122550.28512754, + "control_relative_error": 0.0010139665719617697, + "candidate_relative_error": 0.00043728108480602524, + "absolute_error_change_pp": -0.05766854871557444 + }, + { + "name": "ons.household_composition.couple_non_dependent_children_only_households@2025", + "family": "ons_household_composition", + "target": 1848000.0, + "control_estimate": 1848949.091872692, + "candidate_estimate": 1848643.6012821198, + "control_relative_error": 0.0005135778531883702, + "candidate_relative_error": 0.0003482690920561423, + "absolute_error_change_pp": -0.016530876113222792 + }, + { + "name": "ons.household_composition.couple_under_3_children_households@2025", + "family": "ons_household_composition", + "target": 5439000.0, + "control_estimate": 5435166.614212768, + "candidate_estimate": 5437756.176064661, + "control_relative_error": -0.00070479606310569, + "candidate_relative_error": -0.0002286861436549416, + "absolute_error_change_pp": -0.04761099194507484 + }, + { + "name": "ons.household_composition.lone_households_over_65@2025", + "family": "ons_household_composition", + "target": 4254000.0, + "control_estimate": 4252432.091497421, + "candidate_estimate": 4248398.414824963, + "control_relative_error": -0.00036857275566025747, + "candidate_relative_error": -0.0013167807181564137, + "absolute_error_change_pp": 0.09482079624961563 + }, + { + "name": "ons.household_composition.lone_households_under_65@2025", + "family": "ons_household_composition", + "target": 4316000.0, + "control_estimate": 4318892.271175861, + "candidate_estimate": 4322439.578588963, + "control_relative_error": 0.0006701277052505465, + "candidate_relative_error": 0.0014920246962378486, + "absolute_error_change_pp": 0.08218969909873021 + }, + { + "name": "ons.household_composition.lone_parent_dependent_children_households@2025", + "family": "ons_household_composition", + "target": 1835000.0, + "control_estimate": 1836541.8386135101, + "candidate_estimate": 1837227.925176859, + "control_relative_error": 0.0008402390264360391, + "candidate_relative_error": 0.0012141281617759684, + "absolute_error_change_pp": 0.03738891353399292 + }, + { + "name": "ons.land.corporate_land_value@2025", + "family": "ons_land", + "target": 2103053000000.0, + "control_estimate": 2104176810488.435, + "candidate_estimate": 2103604690730.7883, + "control_relative_error": 0.0005343709780186512, + "candidate_relative_error": 0.00026232849613791475, + "absolute_error_change_pp": -0.02720424818807365 + }, + { + "name": "ons.land.household_land_value@2025", + "family": "ons_land", + "target": 4559831000000.0, + "control_estimate": 4565947015244.548, + "candidate_estimate": 4563374916325.898, + "control_relative_error": 0.0013412811230389572, + "candidate_relative_error": 0.000777203437122656, + "absolute_error_change_pp": -0.056407768591630124 + }, + { + "name": "ons.land.land_value@2025", + "family": "ons_land", + "target": 7117771000000.0, + "control_estimate": 6670123826357.194, + "candidate_estimate": 6666979607884.736, + "control_relative_error": -0.0628914829716783, + "candidate_relative_error": -0.06333322498226814, + "absolute_error_change_pp": 0.044174201058982954 + }, + { + "name": "ons.population.age_0_9_by_region@2025", + "family": "ons_population", + "target": 7553013.0, + "control_estimate": 7548459.472192787, + "candidate_estimate": 7548722.283398651, + "control_relative_error": -0.0006028756745438365, + "candidate_relative_error": -0.0005680801292609205, + "absolute_error_change_pp": -0.0034795545282915942 + }, + { + "name": "ons.population.age_10_19_by_region@2025", + "family": "ons_population", + "target": 8331437.0, + "control_estimate": 8333422.468993913, + "candidate_estimate": 8332644.024840746, + "control_relative_error": 0.0002383105092090815, + "candidate_relative_error": 0.00014487594886045167, + "absolute_error_change_pp": -0.009343456034862982 + }, + { + "name": "ons.population.age_20_29_by_region@2025", + "family": "ons_population", + "target": 8715225.0, + "control_estimate": 8720363.863340972, + "candidate_estimate": 8720482.013663668, + "control_relative_error": 0.0005896420736093436, + "candidate_relative_error": 0.000603198846119083, + "absolute_error_change_pp": 0.0013556772509739409 + }, + { + "name": "ons.population.age_30_39_by_region@2025", + "family": "ons_population", + "target": 9572397.0, + "control_estimate": 9578059.739127213, + "candidate_estimate": 9568319.801818706, + "control_relative_error": 0.0005915696065690898, + "candidate_relative_error": -0.0004259328338862152, + "absolute_error_change_pp": -0.01656367726828746 + }, + { + "name": "ons.population.age_40_49_by_region@2025", + "family": "ons_population", + "target": 8622506.0, + "control_estimate": 8628194.977913845, + "candidate_estimate": 8626453.783576507, + "control_relative_error": 0.0006597824244883484, + "candidate_relative_error": 0.00045784642846373447, + "absolute_error_change_pp": -0.02019359960246139 + }, + { + "name": "ons.population.age_50_59_by_region@2025", + "family": "ons_population", + "target": 9036816.0, + "control_estimate": 9042277.203098414, + "candidate_estimate": 9045035.894011678, + "control_relative_error": 0.0006043282388857387, + "candidate_relative_error": 0.0009096006836565195, + "absolute_error_change_pp": 0.030527244477078084 + }, + { + "name": "ons.population.age_60_69_by_region@2025", + "family": "ons_population", + "target": 7861034.0, + "control_estimate": 7861485.1418612115, + "candidate_estimate": 7860634.059489641, + "control_relative_error": 5.738963362981365e-05, + "candidate_relative_error": -5.0876323694651546e-05, + "absolute_error_change_pp": -0.0006513309935162106 + }, + { + "name": "ons.population.age_70_79_by_region@2025", + "family": "ons_population", + "target": 5998605.0, + "control_estimate": 6000614.517294719, + "candidate_estimate": 5998942.530552461, + "control_relative_error": 0.0003349974360236895, + "candidate_relative_error": 5.6268174427356365e-05, + "absolute_error_change_pp": -0.027872926159633316 + }, + { + "name": "ons.population.age_80_89_by_region@2025", + "family": "ons_population", + "target": 2965168.0, + "control_estimate": 2966814.0157957296, + "candidate_estimate": 2963996.148547109, + "control_relative_error": 0.0005551172128289488, + "candidate_relative_error": -0.00039520575322908634, + "absolute_error_change_pp": -0.01599114595998625 + }, + { + "name": "ons.population.female_0_4@2025", + "family": "ons_population", + "target": 1744355.0, + "control_estimate": 1743699.807838207, + "candidate_estimate": 1743168.7396233138, + "control_relative_error": -0.00037560712228467785, + "candidate_relative_error": -0.0006800567411371139, + "absolute_error_change_pp": 0.030444961885243604 + }, + { + "name": "ons.population.female_10_14@2025", + "family": "ons_population", + "target": 2052052.0, + "control_estimate": 2052205.282996416, + "candidate_estimate": 2051795.0773920142, + "control_relative_error": 7.469742307509357e-05, + "candidate_relative_error": -0.00012520277653090215, + "absolute_error_change_pp": 0.005050535345580857 + }, + { + "name": "ons.population.female_15_19@2025", + "family": "ons_population", + "target": 2002835.0, + "control_estimate": 2004860.128251325, + "candidate_estimate": 2003983.0051205268, + "control_relative_error": 0.0010111308476859584, + "candidate_relative_error": 0.0005731900633485866, + "absolute_error_change_pp": -0.04379407843373718 + }, + { + "name": "ons.population.female_20_24@2025", + "family": "ons_population", + "target": 2034609.0, + "control_estimate": 2037147.6792116165, + "candidate_estimate": 2036555.1377780382, + "control_relative_error": 0.0012477479513835416, + "candidate_relative_error": 0.0009565168433041233, + "absolute_error_change_pp": -0.029123110807941832 + }, + { + "name": "ons.population.female_25_29@2025", + "family": "ons_population", + "target": 2291610.0, + "control_estimate": 2292759.5235373974, + "candidate_estimate": 2291465.6625120216, + "control_relative_error": 0.0005016226746249949, + "candidate_relative_error": -6.298518856978066e-05, + "absolute_error_change_pp": -0.043863748605521426 + }, + { + "name": "ons.population.female_30_34@2025", + "family": "ons_population", + "target": 2463301.0, + "control_estimate": 2463948.0245893113, + "candidate_estimate": 2463085.207978487, + "control_relative_error": 0.0002626656625850156, + "candidate_relative_error": -8.760278240985784e-05, + "absolute_error_change_pp": -0.017506288017515775 + }, + { + "name": "ons.population.female_35_39@2025", + "family": "ons_population", + "target": 2472291.0, + "control_estimate": 2473338.7593197986, + "candidate_estimate": 2471379.8381912, + "control_relative_error": 0.0004238009683320269, + "candidate_relative_error": -0.00036854957964088864, + "absolute_error_change_pp": -0.005525138869113828 + }, + { + "name": "ons.population.female_40_44@2025", + "family": "ons_population", + "target": 2333109.0, + "control_estimate": 2334914.0438110065, + "candidate_estimate": 2334637.1026509395, + "control_relative_error": 0.0007736645870409276, + "candidate_relative_error": 0.0006549641062374227, + "absolute_error_change_pp": -0.011870048080350488 + }, + { + "name": "ons.population.female_45_49@2025", + "family": "ons_population", + "target": 2088285.0, + "control_estimate": 2089847.22929223, + "candidate_estimate": 2089528.1243758958, + "control_relative_error": 0.0007480919952161616, + "candidate_relative_error": 0.0005952848274521102, + "absolute_error_change_pp": -0.015280716776405148 + }, + { + "name": "ons.population.female_50_54@2025", + "family": "ons_population", + "target": 2255231.0, + "control_estimate": 2257543.0681118965, + "candidate_estimate": 2257976.108002578, + "control_relative_error": 0.0010252023459665616, + "candidate_relative_error": 0.0012172181042996962, + "absolute_error_change_pp": 0.01920157583331346 + }, + { + "name": "ons.population.female_55_59@2025", + "family": "ons_population", + "target": 2360202.0, + "control_estimate": 2360934.607371209, + "candidate_estimate": 2361993.0836861883, + "control_relative_error": 0.00031040028404737786, + "candidate_relative_error": 0.000758868811308663, + "absolute_error_change_pp": 0.04484685272612852 + }, + { + "name": "ons.population.female_5_9@2025", + "family": "ons_population", + "target": 1941658.0, + "control_estimate": 1940220.2585179806, + "candidate_estimate": 1940357.8192880154, + "control_relative_error": -0.0007404710211682101, + "candidate_relative_error": -0.0006696239564251966, + "absolute_error_change_pp": -0.007084706474301355 + }, + { + "name": "ons.population.female_60_64@2025", + "family": "ons_population", + "target": 2193915.0, + "control_estimate": 2193132.0257413387, + "candidate_estimate": 2194246.8747710334, + "control_relative_error": -0.00035688450038459565, + "candidate_relative_error": 0.00015127056929434992, + "absolute_error_change_pp": -0.02056139310902457 + }, + { + "name": "ons.population.female_65_69@2025", + "family": "ons_population", + "target": 1838574.0, + "control_estimate": 1840358.8587129172, + "candidate_estimate": 1838558.82406044, + "control_relative_error": 0.0009707842670010528, + "candidate_relative_error": -8.254190236529247e-06, + "absolute_error_change_pp": -0.09625300767645235 + }, + { + "name": "ons.population.female_70_74@2025", + "family": "ons_population", + "target": 1622996.0, + "control_estimate": 1621609.9994883537, + "candidate_estimate": 1621519.268737793, + "control_relative_error": -0.0008539765419300298, + "candidate_relative_error": -0.0009098797915749831, + "absolute_error_change_pp": 0.005590324964495331 + }, + { + "name": "ons.population.female_75_79@2025", + "family": "ons_population", + "target": 1551183.0, + "control_estimate": 1552933.98634199, + "candidate_estimate": 1553046.769363917, + "control_relative_error": 0.0011288070730468712, + "candidate_relative_error": 0.001201514820570458, + "absolute_error_change_pp": 0.007270774752358685 + }, + { + "name": "ons.population.female_80_84@2025", + "family": "ons_population", + "target": 1024480.0, + "control_estimate": 1024766.7017660249, + "candidate_estimate": 1023252.0092911829, + "control_relative_error": 0.0002798510132212691, + "candidate_relative_error": -0.0011986478104181104, + "absolute_error_change_pp": 0.09187967971968412 + }, + { + "name": "ons.population.female_85_89@2025", + "family": "ons_population", + "target": 665267.0, + "control_estimate": 664940.6974301338, + "candidate_estimate": 665210.8195628271, + "control_relative_error": -0.0004904836251703157, + "candidate_relative_error": -8.444795423924449e-05, + "absolute_error_change_pp": -0.04060356709310712 + }, + { + "name": "ons.population.female_90_plus@2025", + "family": "ons_population", + "target": 414716.0, + "control_estimate": 414769.0346069336, + "candidate_estimate": 414773.7953701019, + "control_relative_error": 0.0001278817478312719, + "candidate_relative_error": 0.00013936132221069048, + "absolute_error_change_pp": 0.0011479574379418597 + }, + { + "name": "ons.population.male_0_4@2025", + "family": "ons_population", + "target": 1829801.0, + "control_estimate": 1829108.9949276554, + "candidate_estimate": 1828379.686600219, + "control_relative_error": -0.0003781859734170875, + "candidate_relative_error": -0.0007767584561277469, + "absolute_error_change_pp": 0.03985724827106594 + }, + { + "name": "ons.population.male_10_14@2025", + "family": "ons_population", + "target": 2152800.0, + "control_estimate": 2152375.857488394, + "candidate_estimate": 2152309.54913353, + "control_relative_error": -0.00019701900390478282, + "candidate_relative_error": -0.00022781998628303298, + "absolute_error_change_pp": 0.003080098237825016 + }, + { + "name": "ons.population.male_15_19@2025", + "family": "ons_population", + "target": 2123750.0, + "control_estimate": 2123981.200257778, + "candidate_estimate": 2124556.3931946754, + "control_relative_error": 0.00010886415904798951, + "candidate_relative_error": 0.0003797025048501215, + "absolute_error_change_pp": 0.027083834580213198 + }, + { + "name": "ons.population.male_20_24@2025", + "family": "ons_population", + "target": 2131646.0, + "control_estimate": 2133220.850448011, + "candidate_estimate": 2133277.699726614, + "control_relative_error": 0.0007387954885618696, + "candidate_relative_error": 0.0007654646815719729, + "absolute_error_change_pp": 0.002666919301010334 + }, + { + "name": "ons.population.male_25_29@2025", + "family": "ons_population", + "target": 2257360.0, + "control_estimate": 2257235.8101439476, + "candidate_estimate": 2259183.5136469947, + "control_relative_error": -5.501552966846169e-05, + "candidate_relative_error": 0.0008078080797899836, + "absolute_error_change_pp": 0.07527925501215219 + }, + { + "name": "ons.population.male_30_34@2025", + "family": "ons_population", + "target": 2333326.0, + "control_estimate": 2334199.291704178, + "candidate_estimate": 2331995.9773750305, + "control_relative_error": 0.00037426904949323686, + "candidate_relative_error": -0.0005700114878801687, + "absolute_error_change_pp": 0.019574243838693182 + }, + { + "name": "ons.population.male_35_39@2025", + "family": "ons_population", + "target": 2303479.0, + "control_estimate": 2306573.663513926, + "candidate_estimate": 2301858.7782739885, + "control_relative_error": 0.0013434737255802454, + "candidate_relative_error": -0.0007033802895583094, + "absolute_error_change_pp": -0.0640093436021936 + }, + { + "name": "ons.population.male_40_44@2025", + "family": "ons_population", + "target": 2196013.0, + "control_estimate": 2197786.6315259933, + "candidate_estimate": 2195449.743415176, + "control_relative_error": 0.0008076598480944089, + "candidate_relative_error": -0.0002564905512053266, + "absolute_error_change_pp": -0.05511692968890823 + }, + { + "name": "ons.population.male_45_49@2025", + "family": "ons_population", + "target": 2005099.0, + "control_estimate": 2005647.0732846146, + "candidate_estimate": 2006838.813134496, + "control_relative_error": 0.0002733397625825949, + "candidate_relative_error": 0.0008676943804251562, + "absolute_error_change_pp": 0.059435461784256134 + }, + { + "name": "ons.population.male_50_54@2025", + "family": "ons_population", + "target": 2164862.0, + "control_estimate": 2165640.8346800804, + "candidate_estimate": 2166320.062389802, + "control_relative_error": 0.0003597618139541522, + "candidate_relative_error": 0.0006735128566172752, + "absolute_error_change_pp": 0.0313751042663123 + }, + { + "name": "ons.population.male_55_59@2025", + "family": "ons_population", + "target": 2256521.0, + "control_estimate": 2258158.6929352283, + "candidate_estimate": 2258746.6399331093, + "control_relative_error": 0.0007257601126815784, + "candidate_relative_error": 0.0009863147442941073, + "absolute_error_change_pp": 0.026055463161252897 + }, + { + "name": "ons.population.male_5_9@2025", + "family": "ons_population", + "target": 2037199.0, + "control_estimate": 2035430.410908943, + "candidate_estimate": 2036816.037887102, + "control_relative_error": -0.0008681474372689942, + "candidate_relative_error": -0.0001879846362078555, + "absolute_error_change_pp": -0.06801628010611388 + }, + { + "name": "ons.population.male_60_64@2025", + "family": "ons_population", + "target": 2094462.0, + "control_estimate": 2093618.0714159012, + "candidate_estimate": 2095362.2053232193, + "control_relative_error": -0.00040293334713106083, + "candidate_relative_error": 0.0004298026525280952, + "absolute_error_change_pp": 0.002686930539703438 + }, + { + "name": "ons.population.male_65_69@2025", + "family": "ons_population", + "target": 1734083.0, + "control_estimate": 1734376.1859910544, + "candidate_estimate": 1732466.1553349495, + "control_relative_error": 0.00016907264015298044, + "candidate_relative_error": -0.0009323917396402056, + "absolute_error_change_pp": 0.07633190994872252 + }, + { + "name": "ons.population.male_70_74@2025", + "family": "ons_population", + "target": 1473758.0, + "control_estimate": 1473803.7468049526, + "candidate_estimate": 1474650.7112116814, + "control_relative_error": 3.1040920526043934e-05, + "candidate_relative_error": 0.0006057379920457538, + "absolute_error_change_pp": 0.057469707151970986 + }, + { + "name": "ons.population.male_75_79@2025", + "family": "ons_population", + "target": 1350668.0, + "control_estimate": 1352266.7846594225, + "candidate_estimate": 1349725.7812390695, + "control_relative_error": 0.0011836992209946992, + "candidate_relative_error": -0.0006975946427474904, + "absolute_error_change_pp": -0.04861045782472088 + }, + { + "name": "ons.population.male_80_84@2025", + "family": "ons_population", + "target": 815910.0, + "control_estimate": 816995.0910081972, + "candidate_estimate": 816715.9077620615, + "control_relative_error": 0.0013299150742081443, + "candidate_relative_error": 0.0009877410033722533, + "absolute_error_change_pp": -0.0342174070835891 + }, + { + "name": "ons.population.male_85_89@2025", + "family": "ons_population", + "target": 459511.0, + "control_estimate": 460111.52559137344, + "candidate_estimate": 458817.4119310379, + "control_relative_error": 0.0013068796859562527, + "candidate_relative_error": -0.0015094047127535515, + "absolute_error_change_pp": 0.020252502679729882 + }, + { + "name": "ons.population.male_90_plus@2025", + "family": "ons_population", + "target": 210520.0, + "control_estimate": 210449.15379333496, + "candidate_estimate": 210098.8139667511, + "control_relative_error": -0.0003365295775462619, + "candidate_relative_error": -0.0020006936787426437, + "absolute_error_change_pp": 0.16641641011963818 + }, + { + "name": "ons.population.scotland_babies_under_1@2025", + "family": "ons_population", + "target": 46776.0, + "control_estimate": 46753.46699523926, + "candidate_estimate": 46650.48211669922, + "control_relative_error": -0.0004817214973649347, + "candidate_relative_error": -0.0026833821468441347, + "absolute_error_change_pp": 0.22016606494792 + }, + { + "name": "ons.population.scotland_children_under_16@2025", + "family": "ons_population", + "target": 896833.0, + "control_estimate": 895881.6839752197, + "candidate_estimate": 894863.0286102295, + "control_relative_error": -0.0010607504683483697, + "candidate_relative_error": -0.0021965866440803446, + "absolute_error_change_pp": 0.11358361757319749 + }, + { + "name": "ons.population.uk_total@2025", + "family": "ons_population", + "target": 69281437.0, + "control_estimate": 69304909.58801906, + "candidate_estimate": 69290103.14923601, + "control_relative_error": 0.0003388005364129227, + "candidate_relative_error": 0.00012508616465343414, + "absolute_error_change_pp": -0.021371437175948856 + }, + { + "name": "ons.public_sector_employment@2025", + "family": "ons_employment", + "target": 6146000.0, + "control_estimate": 6140910.768561363, + "candidate_estimate": 6143860.296098232, + "control_relative_error": -0.0008280558800255092, + "candidate_relative_error": -0.00034814576989387094, + "absolute_error_change_pp": -0.04799101101316383 + }, + { + "name": "scotgov.council_tax_stock.band_a@2025", + "family": "council_tax_stock", + "target": 498707.0, + "control_estimate": 497793.0453109741, + "candidate_estimate": 498474.34790802, + "control_relative_error": -0.0018326486073503658, + "candidate_relative_error": -0.0004665105803206702, + "absolute_error_change_pp": -0.13661380270296955 + }, + { + "name": "scotgov.council_tax_stock.band_b@2025", + "family": "council_tax_stock", + "target": 583705.0, + "control_estimate": 584170.3162002563, + "candidate_estimate": 581630.644203186, + "control_relative_error": 0.0007971769990943159, + "candidate_relative_error": -0.0035537742469465994, + "absolute_error_change_pp": 0.2756597247852283 + }, + { + "name": "scotgov.council_tax_stock.band_c@2025", + "family": "council_tax_stock", + "target": 426388.0, + "control_estimate": 425280.1085510254, + "candidate_estimate": 425186.0961608887, + "control_relative_error": -0.002598317609723091, + "candidate_relative_error": -0.0028188031537269534, + "absolute_error_change_pp": 0.022048554400386222 + }, + { + "name": "scotgov.council_tax_stock.band_d@2025", + "family": "council_tax_stock", + "target": 369621.0, + "control_estimate": 368587.2019920349, + "candidate_estimate": 368700.5122909546, + "control_relative_error": -0.0027969136168266625, + "candidate_relative_error": -0.0024903555508085586, + "absolute_error_change_pp": -0.030655806601810394 + }, + { + "name": "scotgov.council_tax_stock.band_e@2025", + "family": "council_tax_stock", + "target": 366881.0, + "control_estimate": 367981.4059123993, + "candidate_estimate": 365745.9590911865, + "control_relative_error": 0.0029993537752003837, + "candidate_relative_error": -0.003093757672960651, + "absolute_error_change_pp": 0.009440389776026745 + }, + { + "name": "scotgov.council_tax_stock.band_f@2025", + "family": "council_tax_stock", + "target": 221282.0, + "control_estimate": 220549.76114463806, + "candidate_estimate": 221041.26977157593, + "control_relative_error": -0.0033090755477713438, + "candidate_relative_error": -0.0010878888857840776, + "absolute_error_change_pp": -0.2221186661987266 + }, + { + "name": "scotgov.council_tax_stock.band_g@2025", + "family": "council_tax_stock", + "target": 142084.0, + "control_estimate": 141802.03342437744, + "candidate_estimate": 141480.20031356812, + "control_relative_error": -0.0019845061767866795, + "candidate_relative_error": -0.004249596621941139, + "absolute_error_change_pp": 0.22650904451544593 + }, + { + "name": "scotgov.council_tax_stock.band_h@2025", + "family": "council_tax_stock", + "target": 14481.0, + "control_estimate": 14489.340209960938, + "candidate_estimate": 14445.208251953125, + "control_relative_error": 0.0005759415759227608, + "candidate_relative_error": -0.002471635111309647, + "absolute_error_change_pp": 0.18956935353868862 + }, + { + "name": "scotgov.council_tax_stock.total@2025", + "family": "council_tax_stock", + "target": 2623149.0, + "control_estimate": 2620653.2127456665, + "candidate_estimate": 2616704.237991333, + "control_relative_error": -0.0009514470029470289, + "candidate_relative_error": -0.002456879883173618, + "absolute_error_change_pp": 0.1505432880226589 + }, + { + "name": "scotgov.scottish_child_payment_spending@2025", + "family": "scotgov_social_security", + "target": 471000000.0, + "control_estimate": 471340018.6017812, + "candidate_estimate": 470980100.84276366, + "control_relative_error": 0.0007219078594080455, + "candidate_relative_error": -4.224874147842391e-05, + "absolute_error_change_pp": -0.06796591179296216 + }, + { + "name": "slc.borrowers.plan_5_above_threshold@2025", + "family": "slc_borrowers", + "target": 35000.0, + "control_estimate": 35015.98388671875, + "candidate_estimate": 35081.273193359375, + "control_relative_error": 0.0004566824776785714, + "candidate_relative_error": 0.0023220912388392857, + "absolute_error_change_pp": 0.18654087611607142 + }, + { + "name": "slc.repayments.england_plan_1@2025", + "family": "slc_repayments", + "target": 1852699178.55, + "control_estimate": 1850754153.6308398, + "candidate_estimate": 1848829124.2502878, + "control_relative_error": -0.0010498330984754826, + "candidate_relative_error": -0.0020888735443500587, + "absolute_error_change_pp": 0.10390404458745761 + }, + { + "name": "slc.repayments.england_plan_2@2025", + "family": "slc_repayments", + "target": 2778253361.64, + "control_estimate": 2777872810.1758494, + "candidate_estimate": 2783404384.285944, + "control_relative_error": -0.00013697507556538675, + "candidate_relative_error": 0.0018540507201630723, + "absolute_error_change_pp": 0.17170756445976856 + }, + { + "name": "slc.repayments.england_total_higher_education@2025", + "family": "slc_repayments", + "target": 5018231834.949999, + "control_estimate": 5016466956.444836, + "candidate_estimate": 5021850511.156866, + "control_relative_error": -0.00035169329819947985, + "candidate_relative_error": 0.0007211058248972418, + "absolute_error_change_pp": 0.036941252669776194 + }, + { + "name": "slc.support.adult_dependants_grant_recipients@2025", + "family": "slc_student_support", + "target": 18611.0, + "control_estimate": 15676.6904296875, + "candidate_estimate": 15762.217529296875, + "control_relative_error": -0.1576653361083499, + "candidate_relative_error": -0.15306982272328865, + "absolute_error_change_pp": -0.4595513385061256 + }, + { + "name": "slc.support.adult_dependants_grant_spend@2025", + "family": "slc_student_support", + "target": 55364916.81, + "control_estimate": 55573867.57324219, + "candidate_estimate": 55877061.14135742, + "control_relative_error": 0.0037740644307162484, + "candidate_relative_error": 0.009250340483938307, + "absolute_error_change_pp": 0.5476276053222059 + }, + { + "name": "slc.support.maintenance_loan_recipients@2025", + "family": "slc_student_support", + "target": 1159761.0, + "control_estimate": 1164623.2449188232, + "candidate_estimate": 1158359.0033187866, + "control_relative_error": 0.004192454237401708, + "candidate_relative_error": -0.0012088668968980496, + "absolute_error_change_pp": -0.2983587340503658 + }, + { + "name": "slc.support.maintenance_loan_spend@2025", + "family": "slc_student_support", + "target": 8591659718.080004, + "control_estimate": 8628531693.376953, + "candidate_estimate": 8576016578.514992, + "control_relative_error": 0.0042916009836093975, + "candidate_relative_error": -0.0018207354665237816, + "absolute_error_change_pp": -0.24708655170856156 + }, + { + "name": "slc.support.parents_learning_allowance_recipients@2025", + "family": "slc_student_support", + "target": 99645.0, + "control_estimate": 90431.08807373047, + "candidate_estimate": 90318.60095214844, + "control_relative_error": -0.09246737845621487, + "candidate_relative_error": -0.09359625719154561, + "absolute_error_change_pp": 0.11288787353307406 + }, + { + "name": "slc.support.parents_learning_allowance_spend@2025", + "family": "slc_student_support", + "target": 181421659.32, + "control_estimate": 183032522.26123047, + "candidate_estimate": 182804848.32714844, + "control_relative_error": 0.008879110395463645, + "candidate_relative_error": 0.007624166884664589, + "absolute_error_change_pp": -0.12549435107990564 + }, + { + "name": "voa.council_tax_stock.band_a@2025", + "family": "council_tax_stock", + "target": 6103320.0, + "control_estimate": 6107296.999644431, + "candidate_estimate": 6106488.17078698, + "control_relative_error": 0.0006516125067063968, + "candidate_relative_error": 0.0005190897391877876, + "absolute_error_change_pp": -0.013252276751860914 + }, + { + "name": "voa.council_tax_stock.band_b@2025", + "family": "council_tax_stock", + "target": 5016580.0, + "control_estimate": 5023958.854512419, + "candidate_estimate": 5019941.210148968, + "control_relative_error": 0.0014708934199033246, + "candidate_relative_error": 0.0006700202426688706, + "absolute_error_change_pp": -0.0800873177234454 + }, + { + "name": "voa.council_tax_stock.band_c@2025", + "family": "council_tax_stock", + "target": 5654450.0, + "control_estimate": 5656055.638030529, + "candidate_estimate": 5659464.145677079, + "control_relative_error": 0.0002839600722491175, + "candidate_relative_error": 0.0008867609895002072, + "absolute_error_change_pp": 0.060280091725108974 + }, + { + "name": "voa.council_tax_stock.band_d@2025", + "family": "council_tax_stock", + "target": 4035220.0, + "control_estimate": 4035927.0324764946, + "candidate_estimate": 4034540.265619569, + "control_relative_error": 0.00017521534798463392, + "candidate_relative_error": -0.00016845038942883104, + "absolute_error_change_pp": -0.000676495855580288 + }, + { + "name": "voa.council_tax_stock.band_e@2025", + "family": "council_tax_stock", + "target": 2528140.0, + "control_estimate": 2527976.882118713, + "candidate_estimate": 2525878.8736705044, + "control_relative_error": -6.45209052057597e-05, + "candidate_relative_error": -0.0008943833527793444, + "absolute_error_change_pp": 0.08298624475735847 + }, + { + "name": "voa.council_tax_stock.band_f@2025", + "family": "council_tax_stock", + "target": 1343220.0, + "control_estimate": 1345912.8241853714, + "candidate_estimate": 1344068.872639656, + "control_relative_error": 0.0020047528963024665, + "candidate_relative_error": 0.0006319684338053832, + "absolute_error_change_pp": -0.13727844624970834 + }, + { + "name": "voa.council_tax_stock.band_g@2025", + "family": "council_tax_stock", + "target": 911160.0, + "control_estimate": 912219.1403989792, + "candidate_estimate": 910256.6156177521, + "control_relative_error": 0.001162408796456371, + "candidate_relative_error": -0.0009914662433029597, + "absolute_error_change_pp": -0.01709425531534114 + }, + { + "name": "voa.council_tax_stock.band_h@2025", + "family": "council_tax_stock", + "target": 154470.0, + "control_estimate": 154569.6538925171, + "candidate_estimate": 154799.60537719727, + "control_relative_error": 0.0006451342818481895, + "candidate_relative_error": 0.002133782463891148, + "absolute_error_change_pp": 0.14886481820429584 + }, + { + "name": "voa.council_tax_stock.total@2025", + "family": "council_tax_stock", + "target": 25746570.0, + "control_estimate": 25763917.025259446, + "candidate_estimate": 25755437.759537708, + "control_relative_error": 0.0006737606313946422, + "candidate_relative_error": 0.0003444248899060346, + "absolute_error_change_pp": -0.03293357414886076 + } + ], + "objective_weight_changes": [ + { + "control_name": "obr.income_tax@2025", + "candidate_name": "obr.income_tax@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.ni@2025", + "candidate_name": "obr.ni@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.ni_employee@2025", + "candidate_name": "obr.ni_employee@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.ni_employer@2025", + "candidate_name": "obr.ni_employer@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.ni_self_employed@2025", + "candidate_name": "obr.ni_self_employed@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.vat@2025", + "candidate_name": "obr.vat@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.capital_gains_tax@2025", + "candidate_name": "hmrc.cgt.liability_total@2025", + "control_family": "obr", + "candidate_family": "hmrc_cgt", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.015873015873015872 + }, + { + "control_name": "obr.sdlt@2025", + "candidate_name": "obr.sdlt@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.attendance_allowance@2025", + "candidate_name": "obr.attendance_allowance@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.carers_allowance@2025", + "candidate_name": "obr.carers_allowance@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.child_benefit@2025", + "candidate_name": "obr.child_benefit@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.council_tax@2025", + "candidate_name": "obr.council_tax@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.esa@2025", + "candidate_name": "obr.esa@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.jobseekers_allowance@2025", + "candidate_name": "obr.jobseekers_allowance@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.pension_credit@2025", + "candidate_name": "obr.pension_credit@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.pip@2025", + "candidate_name": "obr.pip@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.state_pension@2025", + "candidate_name": "obr.state_pension@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.statutory_maternity_pay@2025", + "candidate_name": "obr.statutory_maternity_pay@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.tv_licence_fee@2025", + "candidate_name": "obr.tv_licence_fee@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "obr.winter_fuel_allowance@2025", + "candidate_name": "obr.winter_fuel_allowance@2025", + "control_family": "obr", + "candidate_family": "obr", + "control_weight": 0.002380952380952381, + "candidate_weight": 0.002506265664160401 + }, + { + "control_name": "hmrc.cgt.taxpayers_total@2025", + "candidate_name": "hmrc.cgt.taxpayers_total@2025", + "control_family": "hmrc_cgt", + "candidate_family": "hmrc_cgt", + "control_weight": 0.023809523809523808, + "candidate_weight": 0.015873015873015872 + }, + { + "control_name": "hmrc.cgt.gains_total@2025", + "candidate_name": "hmrc.cgt.gains_total@2025", + "control_family": "hmrc_cgt", + "candidate_family": "hmrc_cgt", + "control_weight": 0.023809523809523808, + "candidate_weight": 0.015873015873015872 + } + ], + "objective_caution": "The treatment combines measurement year, individual scope, liability comparator and the automatic family_equal row-weight changes. Held-weight CGT2024 evaluations isolate measurement from reweighting; they do not isolate each reason the fitted weights change.", + "schema_version": 1, + "receipt_kind": "public_aggregate_projection_of_authenticated_saved_run_evidence", + "input_receipt": { + "logical_name": "cgt-rebase-run-evidence.json", + "sha256": "c4f60e880fea2f993328876cab5f61d739b7942e891ebf01aad32fcb181a7af1", + "size_bytes": 466498, + "path_normalization": "Machine-specific paths replaced with artifact basenames; raw gate attestation/signature material omitted. No numeric result changed." + }, + "execution_and_review_scope": { + "numerical_candidate": "9b5ac7c52f8a3742940674dd2b58a7595ea24db6", + "numerical_control": "cc9c953c72b003406f4aeec8ae5e82bd211099bc", + "review_start": "393d069364737650a8652dc19cb0cfe40763ad82", + "review_changes": "Optional diagnostic availability, active-exemption retirement, historical parity metadata, test harmonization and public evidence. Captured original failures are historical, not reevaluated under the retired register. No source, outcome or fit rerun.", + "original_gate_scope": "The original national scoped calibration battery excludes release-cut-owned compile-parity gates. Its two empty-UC-band plus five stale-exemption failures are historical captured results. Review-time full-feed parity checks are separate; neither establishes release certification." + }, + "control": { + "code_pin": "cc9c953c72b003406f4aeec8ae5e82bd211099bc", + "source_sha256": "03a63ecc1d0b3064d42e8b412fa4a28c587a79bd153ff2ffebc2715f4b316e33", + "facts_sha256": "4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5", + "manifest_sha256": "a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f", + "uv_lock_sha256": "4ef1ef6eb39b65ebc47c2c00bafa44e7c872544b1b0146dd8493bcfe45b2da1b", + "runtime": { + "h5py": "3.16.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "policyengine-core": "3.31.0", + "policyengine-uk": "2.97.0", + "policyengine-us": "1.819.0", + "quantile-forest": "1.4.2", + "scipy": "1.17.1", + "tables": "3.11.1", + "torch": "2.12.0" + }, + "completion": { + "capture_present": true, + "elapsed_seconds": 193.2684162920341, + "error": { + "message": "Gate battery blocked at phase 'terminal' (report: artifact:calibration_gates.json):\n - [uk_target_fit] microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025 relative error -100.0% exceeds 25%.\n - [uk_target_fit] microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025 relative error -100.0% exceeds 25%.\n - [uk_target_fit] Stale reviewed target-fit exclusions are back inside the bound; remove them: ['dwp.uc.households_children_1@2025', 'dwp.uc.households_children_2@2025', 'dwp.uc.households_children_5_or_more@2025', 'dwp.uc.households_single_with_children@2025', 'hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025'].", + "type": "GateBatteryBlockedError" + }, + "exit_code": 1, + "finished_at": "2026-09-09T16:34:39.164498+00:00", + "peak_rss_bytes_macos": 3005366272, + "staged_h5_present": false, + "started_at": "2026-09-09T16:31:25.895893+00:00" + }, + "diagnostics": { + "path": "artifact:calibration_diagnostics.json", + "sha256": "17c41983ec199683329e0daef77043b49761cb4ac51486cdd0ef54ddb7eb3fbb", + "size_bytes": 1807990 + }, + "options": { + "method": "adam", + "epochs": 1500, + "learning_rate": 0.02, + "iterate_selection": "best_feasible_loss", + "iterate_selection_receipt": { + "rule": "best_feasible_loss", + "selected_epoch": 1333, + "epochs_executed": 1500, + "epoch_convention": "completed_optimizer_updates; zero is start", + "selected_loss_float32": 0.011822213418781757, + "closing_iterate_loss_float32": 0.012390774674713612 + }, + "mass": "free", + "mass_reason": "National doctrine calibration to bound target family(ies) council_tax_stock, dfe_funded_childcare, dft_local_bus, dwp_benefit_cap, dwp_legacy_benefits, dwp_two_child_limit, dwp_universal_credit, hmrc_cgt, hmrc_salary_sacrifice, hmrc_spi, hmrc_tfc, isc, obr, ons_employment, ons_household_composition, ons_land, ons_population, scotgov_social_security, slc_borrowers, slc_repayments, slc_student_support; total household mass moved with the targets.", + "max_weight_ratio": 10.0, + "target_records": null, + "l1_lambda": 0.0, + "l1_penalty": "mean_initial_weight_ratio_abs", + "l2_lambda": 0.0, + "l2_anchor": "initial", + "l2_anchor_weights_supplied": false, + "l2_penalty": "mean_initial_pre_gate_weight_ratio_squared", + "seed": 0, + "target_loss_weights": { + "kind": "provided", + "n": 366, + "sum": 0.9999999999999999, + "min": 0.00036913990402362494, + "max": 0.047619047619047616 + }, + "target_loss_scales": { + "kind": "default_target", + "formula": "weighted_mean(min(abs((estimate - target) / scale), cap))", + "cap": 10.0, + "n": 366, + "min": 605.7777777777778, + "median": 867465.0, + "max": 7117771000000.0 + }, + "warm_start_weights": { + "enabled": false, + "kind": null + }, + "matrix_format": "sparse_csr" + }, + "ess": 14049.76239586668, + "max_prior_weight_ratio": 10.0, + "weight_sum": 29900349.733421523, + "initial_weight_sum": 29247433.0, + "households": 52846, + "nonzero_weights": 52846, + "at_10x_bound_rtol_1e_6": 139, + "capture": { + "artifacts": { + "calibrated.diagnostic.private.h5": { + "sha256": "fb67e46dfcf803f7ba7ce10f271768644a9cc3c5d6ee1f1fc1fafc7dc499f762", + "size_bytes": 160897649 + }, + "matrix.private.npz": { + "sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "size_bytes": 3622279 + }, + "solve.private.npz": { + "sha256": "cbd020e4abfea28b9dfa82c10bc687d03e93c23e972782f0843cc500be168e47", + "size_bytes": 407211 + } + }, + "capture_point": "before unchanged national gate enforcement", + "code_pin": "cc9c953c72b003406f4aeec8ae5e82bd211099bc", + "final_loss": 0.01182203087237668, + "posture": "private_diagnostic_only_not_certified", + "shape": [ + 366, + 52846 + ], + "solve_options": { + "epochs": 1500, + "iterate_selection": "best_feasible_loss", + "iterate_selection_receipt": { + "closing_iterate_loss_float32": 0.012390774674713612, + "epoch_convention": "completed_optimizer_updates; zero is start", + "epochs_executed": 1500, + "rule": "best_feasible_loss", + "selected_epoch": 1333, + "selected_loss_float32": 0.011822213418781757 + }, + "l1_lambda": 0.0, + "l1_penalty": "mean_initial_weight_ratio_abs", + "l2_anchor": "initial", + "l2_anchor_weights_supplied": false, + "l2_lambda": 0.0, + "l2_penalty": "mean_initial_pre_gate_weight_ratio_squared", + "learning_rate": 0.02, + "mass": "free", + "mass_reason": "National doctrine calibration to bound target family(ies) council_tax_stock, dfe_funded_childcare, dft_local_bus, dwp_benefit_cap, dwp_legacy_benefits, dwp_two_child_limit, dwp_universal_credit, hmrc_cgt, hmrc_salary_sacrifice, hmrc_spi, hmrc_tfc, isc, obr, ons_employment, ons_household_composition, ons_land, ons_population, scotgov_social_security, slc_borrowers, slc_repayments, slc_student_support; total household mass moved with the targets.", + "matrix_format": "sparse_csr", + "max_weight_ratio": 10.0, + "method": "adam", + "seed": 0, + "target_loss_scales": { + "cap": 10.0, + "formula": "weighted_mean(min(abs((estimate - target) / scale), cap))", + "kind": "default_target", + "max": 7117771000000.0, + "median": 867465.0, + "min": 605.7777777777778, + "n": 366 + }, + "target_loss_weights": { + "kind": "provided", + "max": 0.047619047619047616, + "min": 0.00036913990402362494, + "n": 366, + "sum": 0.9999999999999999 + }, + "target_records": null, + "warm_start_weights": { + "enabled": false, + "kind": null + } + } + }, + "original_gates": { + "blocked_at_phase": "terminal", + "country": "uk", + "evidence_sha256": {}, + "gates": { + "uk_aggregate_admin": { + "criticality": "release_blocking", + "details": { + "anchors_checked": 3 + }, + "failures": [], + "gate": "aggregate_admin", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_calibration_reference_coverage": { + "criticality": "release_blocking", + "details": { + "activated": 366, + "matrix": 366, + "resolved": 366 + }, + "failures": [], + "gate": "calibration_reference_coverage", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_target_fit": { + "criticality": "release_blocking", + "details": { + "candidate_name": "microcosm_uk_2024", + "dormant_exclusions": [], + "exclusions_evaluated_on": "2026-09-09", + "expired_exclusions": [], + "failing_targets": { + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025": -1.0, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025": -1.0 + }, + "max_abs_relative_error": 0.25, + "premature_exclusions": [], + "reviewed_exclusions": { + "obr.capital_gains_tax@2025": { + "adjudication": "microcosm#875", + "approved_by": "juaristi22", + "expires_on": "2026-10-05", + "reason": "Vintage conflict, not a fit defect: the Chronicle re-pin (microcosm#874) put HMRC's 2024-25 CGT outturn on the feed (\u00a3127.3bn of chargeable gains, 584k taxpayers, against \u00a369.9bn / 403k in 2023-24 \u2014 the forestalling year ahead of the 30 October 2024 rate rise) and the doctrine binds it at face value at the 2025 period; the frame fits both HMRC rows within 0.3% and 2025-26 rates on those gains give \u00a331.4bn of liability (24.7% effective) against OBR's \u00a321.8bn FY2025-26 receipts and HMRC's realised 19.0% on the same gains (+44.2% at the composed calibration; \u221225% with the 2023-24 gains). The facts stay bound as published; the deliverable is a declared 2024-25 \u2192 2025 translation of the gains total under the WS-C reconciliation layer (#875: the index ruling, applying uprating_index in the compile step, the taxpayer count flat at 584k, the cash-lag mapping for self-assessed OBR lines). While in force the calibrated 2025-26 base carries ~40% more CGT liability than OBR expects.", + "relative_error": 0.447710376098256 + } + }, + "stale_exclusions": [ + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_with_children@2025", + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025" + ], + "targets_checked": 366 + }, + "failures": [ + "microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025 relative error -100.0% exceeds 25%.", + "microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025 relative error -100.0% exceeds 25%.", + "Stale reviewed target-fit exclusions are back inside the bound; remove them: ['dwp.uc.households_children_1@2025', 'dwp.uc.households_children_2@2025', 'dwp.uc.households_children_5_or_more@2025', 'dwp.uc.households_single_with_children@2025', 'hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025']." + ], + "gate": "target_fit", + "phase": "terminal", + "reason": null, + "status": "failed" + }, + "uk_weight_ess": { + "criticality": "release_blocking", + "details": { + "effective_sample_size": 14049.76239586668, + "ess_fraction": 0.2658623622576294, + "max_to_median_positive_weight": 83.24100190968494, + "max_weight": 24597.220703125, + "median_positive_weight": 295.4940490722656, + "minimum_ess_fraction": 0.01, + "n_records": 52846, + "positive_weight_records": 52846, + "top_1pct_weight_share": 0.12558151635559262, + "total_weight": 29900349.733421523, + "zero_weight_records": 0 + }, + "failures": [], + "gate": "weight_ess", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_weight_ratio": { + "criticality": "release_blocking", + "details": { + "effective_sample_size": 14049.76239586668, + "ess_fraction": 0.2658623622576294, + "max_to_median_positive_weight": 83.24100190968494, + "max_weight": 24597.220703125, + "maximum_max_to_median_ratio": 1151.2542195939373, + "median_positive_weight": 295.4940490722656, + "n_records": 52846, + "positive_weight_records": 52846, + "top_1pct_weight_share": 0.12558151635559262, + "total_weight": 29900349.733421523, + "zero_weight_records": 0 + }, + "failures": [], + "gate": "weight_ratio", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_zero_weight_strata": { + "criticality": "release_blocking", + "details": { + "ambiguous_household_examples": [], + "ambiguous_zero_weight_rows": 0, + "declared_strata": [ + { + "maximum_zero_weight_rows": 100000, + "missing_selector_columns": [], + "name": "june_spi_synthetic_base", + "reason": "The certified June FRS-derived artifact ships 100,000 zero-weight SPI-synthetic non-capital-gains rows.", + "selector": { + "household_is_capital_gains_clone": false, + "household_is_spi_synthetic": true + }, + "zero_weight_rows": 0 + }, + { + "maximum_zero_weight_rows": 100000, + "missing_selector_columns": [], + "name": "june_spi_synthetic_capital_gains", + "reason": "The certified June FRS-derived artifact ships 100,000 zero-weight SPI-synthetic capital-gains-clone rows.", + "selector": { + "household_is_capital_gains_clone": true, + "household_is_spi_synthetic": true + }, + "zero_weight_rows": 0 + } + ], + "household_rows": 52846, + "unmatched_household_examples": [], + "unmatched_zero_weight_rows": 0, + "zero_weight_rows": 0 + }, + "failures": [], + "gate": "zero_weight_strata", + "phase": "terminal", + "reason": null, + "status": "passed" + } + }, + "gates_manifest_sha256": "cb0d7ce17c0cd3cf70bd432d4ba85efce3fa837ebf3caba5f5cf0b5545c5dc61", + "phases": [ + "terminal" + ], + "phases_evaluated": [ + "terminal" + ], + "policy_sha256": "290b1ad240bf4f6412dcaa87c77283dad79d88c817b10b2f402736378fd3d63d", + "release_candidate": false, + "release_evidence": { + "calibration_diagnostics_sha256": "17c41983ec199683329e0daef77043b49761cb4ac51486cdd0ef54ddb7eb3fbb" + }, + "release_id": "uk-cgt-rebase-main-cc9c953c", + "schema_version": 4, + "shippable": false, + "spec_fingerprint": "0be90511d13f826076a1a04e15addf37b3b00453393947b038d95502846684c4" + }, + "original_gate_outcomes_sha256": "89b78a3a2d2b65c106b2bc63bd506521734b3fcf040aa44b3ead68c5c45a4301" + }, + "candidate": { + "code_pin": "9b5ac7c52f8a3742940674dd2b58a7595ea24db6", + "source_sha256": "03a63ecc1d0b3064d42e8b412fa4a28c587a79bd153ff2ffebc2715f4b316e33", + "facts_sha256": "4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5", + "manifest_sha256": "a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f", + "uv_lock_sha256": "4ef1ef6eb39b65ebc47c2c00bafa44e7c872544b1b0146dd8493bcfe45b2da1b", + "runtime": { + "h5py": "3.16.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "policyengine-core": "3.31.0", + "policyengine-uk": "2.97.0", + "policyengine-us": "1.819.0", + "quantile-forest": "1.4.2", + "scipy": "1.17.1", + "tables": "3.11.1", + "torch": "2.12.0" + }, + "completion": { + "capture_present": true, + "elapsed_seconds": 226.57220754097216, + "error": { + "message": "Gate battery blocked at phase 'terminal' (report: artifact:calibration_gates.json):\n - [uk_target_fit] microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025 relative error -100.0% exceeds 25%.\n - [uk_target_fit] microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025 relative error -100.0% exceeds 25%.\n - [uk_target_fit] Stale reviewed target-fit exclusions are back inside the bound; remove them: ['dwp.uc.households_children_1@2025', 'dwp.uc.households_children_2@2025', 'dwp.uc.households_children_5_or_more@2025', 'dwp.uc.households_single_with_children@2025', 'hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025'].", + "type": "GateBatteryBlockedError" + }, + "exit_code": 1, + "finished_at": "2026-09-09T16:41:50.130493+00:00", + "peak_rss_bytes_macos": 2340814848, + "staged_h5_present": false, + "started_at": "2026-09-09T16:38:03.558031+00:00" + }, + "diagnostics": { + "path": "artifact:calibration_diagnostics.json", + "sha256": "4ef99e8170567f98c670d9c44f9245dfb66b103a91cae593ce53a8856b02bf2d", + "size_bytes": 1814616 + }, + "options": { + "method": "adam", + "epochs": 1500, + "learning_rate": 0.02, + "iterate_selection": "best_feasible_loss", + "iterate_selection_receipt": { + "rule": "best_feasible_loss", + "selected_epoch": 1422, + "epochs_executed": 1500, + "epoch_convention": "completed_optimizer_updates; zero is start", + "selected_loss_float32": 0.01230266410857439, + "closing_iterate_loss_float32": 0.01246922928839922 + }, + "mass": "free", + "mass_reason": "National doctrine calibration to bound target family(ies) council_tax_stock, dfe_funded_childcare, dft_local_bus, dwp_benefit_cap, dwp_legacy_benefits, dwp_two_child_limit, dwp_universal_credit, hmrc_cgt, hmrc_salary_sacrifice, hmrc_spi, hmrc_tfc, isc, obr, ons_employment, ons_household_composition, ons_land, ons_population, scotgov_social_security, slc_borrowers, slc_repayments, slc_student_support; total household mass moved with the targets.", + "max_weight_ratio": 10.0, + "target_records": null, + "l1_lambda": 0.0, + "l1_penalty": "mean_initial_weight_ratio_abs", + "l2_lambda": 0.0, + "l2_anchor": "initial", + "l2_anchor_weights_supplied": false, + "l2_penalty": "mean_initial_pre_gate_weight_ratio_squared", + "seed": 0, + "target_loss_weights": { + "kind": "provided", + "n": 366, + "sum": 0.9999999999999999, + "min": 0.00036913990402362494, + "max": 0.047619047619047616 + }, + "target_loss_scales": { + "kind": "default_target", + "formula": "weighted_mean(min(abs((estimate - target) / scale), cap))", + "cap": 10.0, + "n": 366, + "min": 605.7777777777778, + "median": 867465.0, + "max": 7117771000000.0 + }, + "warm_start_weights": { + "enabled": false, + "kind": null + }, + "matrix_format": "sparse_csr" + }, + "ess": 13725.441394894662, + "max_prior_weight_ratio": 10.0, + "weight_sum": 29907447.93041397, + "initial_weight_sum": 29247433.0, + "households": 52846, + "nonzero_weights": 52846, + "at_10x_bound_rtol_1e_6": 178, + "capture": { + "artifacts": { + "calibrated.diagnostic.private.h5": { + "sha256": "fcfe4ccce8060874397d49da2b4bfe97b3b66b73f1e2e0f3805a409f2dae80a6", + "size_bytes": 160890203 + }, + "matrix.private.npz": { + "sha256": "d2330fb6967547feebf43a5a7bb19b893a8cdf2a8022db46ba781cf71f84ba4d", + "size_bytes": 3585389 + }, + "solve.private.npz": { + "sha256": "16c5ccd3de7c741366c5fcdbb0e82f6bba6ab9f7e91d6c3cb34d56fd4bc578e1", + "size_bytes": 407440 + } + }, + "capture_point": "before unchanged national gate enforcement", + "code_pin": "9b5ac7c52f8a3742940674dd2b58a7595ea24db6", + "final_loss": 0.012302734910399767, + "posture": "private_diagnostic_only_not_certified", + "shape": [ + 366, + 52846 + ], + "solve_options": { + "epochs": 1500, + "iterate_selection": "best_feasible_loss", + "iterate_selection_receipt": { + "closing_iterate_loss_float32": 0.01246922928839922, + "epoch_convention": "completed_optimizer_updates; zero is start", + "epochs_executed": 1500, + "rule": "best_feasible_loss", + "selected_epoch": 1422, + "selected_loss_float32": 0.01230266410857439 + }, + "l1_lambda": 0.0, + "l1_penalty": "mean_initial_weight_ratio_abs", + "l2_anchor": "initial", + "l2_anchor_weights_supplied": false, + "l2_lambda": 0.0, + "l2_penalty": "mean_initial_pre_gate_weight_ratio_squared", + "learning_rate": 0.02, + "mass": "free", + "mass_reason": "National doctrine calibration to bound target family(ies) council_tax_stock, dfe_funded_childcare, dft_local_bus, dwp_benefit_cap, dwp_legacy_benefits, dwp_two_child_limit, dwp_universal_credit, hmrc_cgt, hmrc_salary_sacrifice, hmrc_spi, hmrc_tfc, isc, obr, ons_employment, ons_household_composition, ons_land, ons_population, scotgov_social_security, slc_borrowers, slc_repayments, slc_student_support; total household mass moved with the targets.", + "matrix_format": "sparse_csr", + "max_weight_ratio": 10.0, + "method": "adam", + "seed": 0, + "target_loss_scales": { + "cap": 10.0, + "formula": "weighted_mean(min(abs((estimate - target) / scale), cap))", + "kind": "default_target", + "max": 7117771000000.0, + "median": 867465.0, + "min": 605.7777777777778, + "n": 366 + }, + "target_loss_weights": { + "kind": "provided", + "max": 0.047619047619047616, + "min": 0.00036913990402362494, + "n": 366, + "sum": 0.9999999999999999 + }, + "target_records": null, + "warm_start_weights": { + "enabled": false, + "kind": null + } + } + }, + "original_gates": { + "blocked_at_phase": "terminal", + "country": "uk", + "evidence_sha256": {}, + "gates": { + "uk_aggregate_admin": { + "criticality": "release_blocking", + "details": { + "anchors_checked": 3 + }, + "failures": [], + "gate": "aggregate_admin", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_calibration_reference_coverage": { + "criticality": "release_blocking", + "details": { + "activated": 366, + "matrix": 366, + "resolved": 366 + }, + "failures": [], + "gate": "calibration_reference_coverage", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_target_fit": { + "criticality": "release_blocking", + "details": { + "candidate_name": "microcosm_uk_2024", + "dormant_exclusions": [ + "obr.capital_gains_tax@2025" + ], + "exclusions_evaluated_on": "2026-09-09", + "expired_exclusions": [], + "failing_targets": { + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025": -1.0, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025": -1.0 + }, + "max_abs_relative_error": 0.25, + "premature_exclusions": [], + "reviewed_exclusions": {}, + "stale_exclusions": [ + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_with_children@2025", + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025" + ], + "targets_checked": 366 + }, + "failures": [ + "microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025 relative error -100.0% exceeds 25%.", + "microcosm_uk_2024: dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025 relative error -100.0% exceeds 25%.", + "Stale reviewed target-fit exclusions are back inside the bound; remove them: ['dwp.uc.households_children_1@2025', 'dwp.uc.households_children_2@2025', 'dwp.uc.households_children_5_or_more@2025', 'dwp.uc.households_single_with_children@2025', 'hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025']." + ], + "gate": "target_fit", + "phase": "terminal", + "reason": null, + "status": "failed" + }, + "uk_weight_ess": { + "criticality": "release_blocking", + "details": { + "effective_sample_size": 13725.441394894662, + "ess_fraction": 0.25972526577025057, + "max_to_median_positive_weight": 85.49229471574556, + "max_weight": 24780.9453125, + "median_positive_weight": 289.8617401123047, + "minimum_ess_fraction": 0.01, + "n_records": 52846, + "positive_weight_records": 52846, + "top_1pct_weight_share": 0.12740097580722864, + "total_weight": 29907447.93041397, + "zero_weight_records": 0 + }, + "failures": [], + "gate": "weight_ess", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_weight_ratio": { + "criticality": "release_blocking", + "details": { + "effective_sample_size": 13725.441394894662, + "ess_fraction": 0.25972526577025057, + "max_to_median_positive_weight": 85.49229471574556, + "max_weight": 24780.9453125, + "maximum_max_to_median_ratio": 1151.2542195939373, + "median_positive_weight": 289.8617401123047, + "n_records": 52846, + "positive_weight_records": 52846, + "top_1pct_weight_share": 0.12740097580722864, + "total_weight": 29907447.93041397, + "zero_weight_records": 0 + }, + "failures": [], + "gate": "weight_ratio", + "phase": "terminal", + "reason": null, + "status": "passed" + }, + "uk_zero_weight_strata": { + "criticality": "release_blocking", + "details": { + "ambiguous_household_examples": [], + "ambiguous_zero_weight_rows": 0, + "declared_strata": [ + { + "maximum_zero_weight_rows": 100000, + "missing_selector_columns": [], + "name": "june_spi_synthetic_base", + "reason": "The certified June FRS-derived artifact ships 100,000 zero-weight SPI-synthetic non-capital-gains rows.", + "selector": { + "household_is_capital_gains_clone": false, + "household_is_spi_synthetic": true + }, + "zero_weight_rows": 0 + }, + { + "maximum_zero_weight_rows": 100000, + "missing_selector_columns": [], + "name": "june_spi_synthetic_capital_gains", + "reason": "The certified June FRS-derived artifact ships 100,000 zero-weight SPI-synthetic capital-gains-clone rows.", + "selector": { + "household_is_capital_gains_clone": true, + "household_is_spi_synthetic": true + }, + "zero_weight_rows": 0 + } + ], + "household_rows": 52846, + "unmatched_household_examples": [], + "unmatched_zero_weight_rows": 0, + "zero_weight_rows": 0 + }, + "failures": [], + "gate": "zero_weight_strata", + "phase": "terminal", + "reason": null, + "status": "passed" + } + }, + "gates_manifest_sha256": "cb0d7ce17c0cd3cf70bd432d4ba85efce3fa837ebf3caba5f5cf0b5545c5dc61", + "phases": [ + "terminal" + ], + "phases_evaluated": [ + "terminal" + ], + "policy_sha256": "290b1ad240bf4f6412dcaa87c77283dad79d88c817b10b2f402736378fd3d63d", + "release_candidate": false, + "release_evidence": { + "calibration_diagnostics_sha256": "4ef99e8170567f98c670d9c44f9245dfb66b103a91cae593ce53a8856b02bf2d" + }, + "release_id": "uk-cgt-rebase-candidate", + "schema_version": 4, + "shippable": false, + "spec_fingerprint": "0be90511d13f826076a1a04e15addf37b3b00453393947b038d95502846684c4" + }, + "original_gate_outcomes_sha256": "19006c79c0345d8d462270f2a83981cbb2ec219ac4574033f191d674f77cc22a" + }, + "control_original_cgt_rows": [ + { + "name": "hmrc.cgt.gains_total@2025", + "target_name": "hmrc.cgt.gains_total", + "period": 2025, + "entity": "person", + "measure": { + "kind": "column", + "name": "hmrc/capital_gains_total" + }, + "filter": null, + "source": "hmrc | Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal | Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods | cgt_statistics_2026 | https://assets.publishing.service.gov.uk/media/6a7b23f1bbafcd1db3b6e420/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", + "metadata": { + "ledger_source": "policyengine-ledger-data", + "ledger_fact_key": "ledger.aggregate_fact.v2:a9969c2a306f713f6bb203fc", + "ledger_source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.total_gains", + "ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:a9969c2a306f713f6bb203fc", + "ledger_semantic_fact_key": "ledger.semantic_fact.v2:b3278862060c7036e8477ea5", + "ledger_legacy_fact_key": "ledger.fact.v1:1f177e0b7aa93ea81dcb6318", + "ledger_observed_measure_key": "ledger.observed_measure.v2:76f6824292f0e8bd3edb801f", + "ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", + "ledger_measure_concept": "hmrc.cgt_gains_total", + "ledger_measure_unit": "gbp", + "ledger_source_concept": "hmrc.cgt_gains_total", + "ledger_concept_relation": "source_label", + "ledger_concept_authority": "hmrc", + "ledger_period_type": "tax_year", + "ledger_fact_period": "2024", + "ledger_assertion": "observation", + "ledger_geography_level": "country", + "ledger_geography_id": "K02000001", + "ledger_geography_vintage": "current", + "ledger_entity_name": "tax_unit", + "ledger_entity_role": "taxpayer", + "ledger_domain": "capital_gains_tax", + "ledger_layout_record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", + "ledger_layout_record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", + "ledger_layout_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_layout_groupby_value_id": "ty2024", + "ledger_layout_measure_id": "total_gains", + "ledger_aggregation_method": "sum", + "ledger_resolved_assertion": "observation", + "contract_target_id": "hmrc.cgt.gains_total", + "measure_kind": "prepared_column", + "ledger_value_operation": "identity", + "ledger_assertion_policy": "observed_only", + "ledger_period_match_policy": "latest_not_after", + "ledger_selector_entity_name": "tax_unit", + "ledger_selector_geography_id": "K02000001", + "ledger_selector_geography_level": "country", + "ledger_selector_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_selector_source_concept": "hmrc.cgt_gains_total", + "ledger_selector_source_name": "hmrc", + "uprating_from_period": "2024", + "uprating_to_period": "2025" + }, + "target": 127316000000.0, + "compiled_target": 127316000000.0, + "initial_estimate": 63762165202.22743, + "final_estimate": 127484860359.64522, + "relative_error": 0.0013263090235729829, + "within_tolerance": null, + "registry": { + "family": "hmrc_cgt", + "se": null, + "signed": false, + "notes": "" + }, + "target_loss_weight": 0.023809523809523808, + "target_loss_weight_share": 0.02380952380952381, + "target_loss_scale": 127316000000.0, + "final_capped_scaled_error": 0.0013263090235729829, + "final_loss_contribution": 3.1578786275547216e-05 + }, + { + "name": "hmrc.cgt.taxpayers_total@2025", + "target_name": "hmrc.cgt.taxpayers_total", + "period": 2025, + "entity": "person", + "measure": { + "kind": "column", + "name": "hmrc/cgt_taxpayers" + }, + "filter": null, + "source": "hmrc | Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal | Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods | cgt_statistics_2026 | https://assets.publishing.service.gov.uk/media/6a7b23f1bbafcd1db3b6e420/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", + "metadata": { + "ledger_source": "policyengine-ledger-data", + "ledger_fact_key": "ledger.aggregate_fact.v2:ec8cf88ffb8304ce72228e8b", + "ledger_source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.total_taxpayers", + "ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:ec8cf88ffb8304ce72228e8b", + "ledger_semantic_fact_key": "ledger.semantic_fact.v2:d8d5e36429e422aaaa00ae63", + "ledger_legacy_fact_key": "ledger.fact.v1:2d23c0c3cead7d492138056c", + "ledger_observed_measure_key": "ledger.observed_measure.v2:5bbe59f8c9f99ad916666bd7", + "ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", + "ledger_measure_concept": "hmrc.cgt_taxpayers_total", + "ledger_measure_unit": "count", + "ledger_source_concept": "hmrc.cgt_taxpayers_total", + "ledger_concept_relation": "source_label", + "ledger_concept_authority": "hmrc", + "ledger_period_type": "tax_year", + "ledger_fact_period": "2024", + "ledger_assertion": "observation", + "ledger_geography_level": "country", + "ledger_geography_id": "K02000001", + "ledger_geography_vintage": "current", + "ledger_entity_name": "tax_unit", + "ledger_entity_role": "taxpayer", + "ledger_domain": "capital_gains_tax", + "ledger_layout_record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", + "ledger_layout_record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", + "ledger_layout_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_layout_groupby_value_id": "ty2024", + "ledger_layout_measure_id": "total_taxpayers", + "ledger_aggregation_method": "sum", + "ledger_resolved_assertion": "observation", + "contract_target_id": "hmrc.cgt.taxpayers_total", + "measure_kind": "prepared_column", + "ledger_value_operation": "identity", + "ledger_assertion_policy": "observed_only", + "ledger_period_match_policy": "latest_not_after", + "ledger_selector_geography_id": "K02000001", + "ledger_selector_geography_level": "country", + "ledger_selector_groupby_dimension": "hmrc.cgt_table1_line", + "ledger_selector_source_concept": "hmrc.cgt_taxpayers_total", + "ledger_selector_source_name": "hmrc", + "uprating_from_period": "2024", + "uprating_to_period": "2025" + }, + "target": 584000.0, + "compiled_target": 584000.0, + "initial_estimate": 357787.82917373703, + "final_estimate": 583538.7092819214, + "relative_error": -0.0007898813665729679, + "within_tolerance": null, + "registry": { + "family": "hmrc_cgt", + "se": null, + "signed": false, + "notes": "" + }, + "target_loss_weight": 0.023809523809523808, + "target_loss_weight_share": 0.02380952380952381, + "target_loss_scale": 584000.0, + "final_capped_scaled_error": 0.0007898813665729679, + "final_loss_contribution": 1.8806699204118286e-05 + }, + { + "name": "obr.capital_gains_tax@2025", + "target_name": "obr.capital_gains_tax", + "period": 2025, + "entity": "person", + "measure": { + "kind": "column", + "name": "obr/capital_gains_tax" + }, + "filter": null, + "source": "obr | EFO March 2026 detailed forecast tables: receipts | efo_receipts.xlsx | efo_march_2026 | https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", + "metadata": { + "ledger_source": "policyengine-ledger-data", + "ledger_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420", + "ledger_source_record_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025.capital_gains_tax.amount", + "ledger_aggregate_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420", + "ledger_semantic_fact_key": "ledger.semantic_fact.v2:543340b7e41c1c5d710aafde", + "ledger_legacy_fact_key": "ledger.fact.v1:4ae0218b8aabc16818fee69b", + "ledger_observed_measure_key": "ledger.observed_measure.v2:6bdb8644c98a705e2c4d4d26", + "ledger_dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", + "ledger_universe_constraint_set_key": "ledger.universe_constraint_set.v2:ecb00e907376ba856934e4ad", + "ledger_measure_concept": "obr.capital_gains_tax", + "ledger_measure_unit": "gbp", + "ledger_source_concept": "obr.capital_gains_tax", + "ledger_concept_relation": "source_label", + "ledger_concept_authority": "obr", + "ledger_period_type": "fiscal_year", + "ledger_fact_period": "2025", + "ledger_assertion": "source_projection", + "ledger_geography_level": "country", + "ledger_geography_id": "K02000001", + "ledger_geography_vintage": "current", + "ledger_entity_name": "person", + "ledger_entity_role": "resident_population", + "ledger_domain": "public_sector_finances", + "ledger_layout_record_set_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025", + "ledger_layout_record_set_spec_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025.v1", + "ledger_layout_groupby_dimension": "obr.efo_line", + "ledger_layout_groupby_value_id": "capital_gains_tax", + "ledger_layout_measure_id": "amount", + "ledger_aggregation_method": "sum", + "ledger_resolved_assertion": "source_projection", + "contract_target_id": "obr.capital_gains_tax", + "measure_kind": "prepared_column", + "ledger_value_operation": "identity", + "ledger_assertion_policy": "allow_source_projection", + "ledger_period_match_policy": "latest_not_after", + "ledger_selector_entity_name": "person", + "ledger_selector_geography_id": "K02000001", + "ledger_selector_geography_level": "country", + "ledger_selector_source_concept": "obr.capital_gains_tax", + "ledger_selector_source_name": "obr" + }, + "target": 21801546197.09165, + "compiled_target": 21801546197.09165, + "initial_estimate": 15857467292.749073, + "final_estimate": 31562324644.515053, + "relative_error": 0.447710376098256, + "within_tolerance": null, + "registry": { + "family": "obr", + "se": null, + "signed": false, + "notes": "" + }, + "target_loss_weight": 0.002380952380952381, + "target_loss_weight_share": 0.0023809523809523816, + "target_loss_scale": 21801546197.09165, + "final_capped_scaled_error": 0.447710376098256, + "final_loss_contribution": 0.0010659770859482289 + } + ], + "historical_fit_exclusions": { + "obr.capital_gains_tax@2025": { + "status": "retired_from_active_register_for_observed_FY2024_25_contract", + "retirement_reason": "The replaced FY2025-26 cash row is no longer fitted. The accepted FY2024-25 deliverable binds individual HMRC gains, taxpayers and liability; retaining its former cash-fit deferral as dormant would misstate the active surface. HMRC liability has no replacement exemption. This does not close or amend issue #875 or settle its general forward-year cash-lag rule.", + "original_entry": { + "reason": "Vintage conflict, not a fit defect: the Chronicle re-pin (microcosm#874) put HMRC's 2024-25 CGT outturn on the feed (\u00a3127.3bn of chargeable gains, 584k taxpayers, against \u00a369.9bn / 403k in 2023-24 \u2014 the forestalling year ahead of the 30 October 2024 rate rise) and the doctrine binds it at face value at the 2025 period; the frame fits both HMRC rows within 0.3% and 2025-26 rates on those gains give \u00a331.4bn of liability (24.7% effective) against OBR's \u00a321.8bn FY2025-26 receipts and HMRC's realised 19.0% on the same gains (+44.2% at the composed calibration; \u221225% with the 2023-24 gains). The facts stay bound as published; the deliverable is a declared 2024-25 \u2192 2025 translation of the gains total under the WS-C reconciliation layer (#875: the index ruling, applying uprating_index in the compile step, the taxpayer count flat at 584k, the cash-lag mapping for self-assessed OBR lines). While in force the calibrated 2025-26 base carries ~40% more CGT liability than OBR expects.", + "approved_by": "juaristi22", + "adjudication": "microcosm#875", + "approved_on": "2026-09-05", + "expires_on": "2026-10-05" + }, + "original_resource_path": "packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json", + "original_resource_commit": "393d069364737650a8652dc19cb0cfe40763ad82", + "original_resource_sha256": "6349f231c953bb2e4316bbffa3fef0522a60e3fed315c64ad16112e2499d6a41", + "original_entry_canonical_sha256": "57745ddabd919957b7b45eba5fbeac7c3d6b997192da0e22d5f79adc7b0ba869", + "approval_note": "Original approver, adjudication, approved_on and expires_on are historical fields preserved verbatim. No new human signature, renewal or expiry is asserted." + } + }, + "target_comparison_csv": { + "path": "target-comparison.csv", + "rows": 363, + "sha256": "44c8d59a9452935991f9e2f6fb6b5f186191ebeb71d9687381c1c4a81d5b88b4", + "all_rows_have_identical_source_coefficients_and_target_values": true, + "line_endings": "LF", + "source_export_sha256": "e3c07b97bb805e15d2f100fe2d8c1b1b6c06286ac61b3b2285ace339bcf2c449", + "source_export_line_endings": "CRLF", + "parsed_header_and_all_rows_equal_source_export": true + }, + "reproduction_provenance": { + "family_weighting": "family_equal", + "national_chronicle_code_pin": "ec7169b5db40b9f54117c80f70f14efc1dd0fedd", + "local_chronicle_code_pin": "6fb700e", + "source_origin_code_pin": "a2ecb2060b5b612fbe66e6589d54baf83632e787", + "python": "3.13.14", + "input_h5_sha256": "03a63ecc1d0b3064d42e8b412fa4a28c587a79bd153ff2ffebc2715f4b316e33", + "invocations": { + "control": { + "logical_name": "national-rebase-main-cc9c953c/invocation.json", + "sha256": "80ffc7751f2d269abcc4c1cc6edcde952864a229653ea30e0961e3eeb709f044", + "code_pin": "cc9c953c72b003406f4aeec8ae5e82bd211099bc", + "chronicle_code_pin": "ec7169b5db40b9f54117c80f70f14efc1dd0fedd", + "spine_origin_code_pin": "a2ecb2060b5b612fbe66e6589d54baf83632e787", + "wrapper_sha256": "648ff8823c13672e513bd9079c844a4ab9d799acd61647e662e44a13947b338b", + "periods": { + "calibration_year": 2025, + "output_time_period": "2024", + "source_base_year": 2024 + }, + "posture": "diagnostic control, fixed source draws, no release certification", + "verified_doctrine_defaults": { + "l0_lambda": 0.0, + "mass_rule": "free", + "max_weight_ratio": 10.0, + "seed": 0 + }, + "thread_limits": { + "OMP_NUM_THREADS": "2", + "OPENBLAS_NUM_THREADS": "2", + "POPULACE_FIT_N_JOBS": "2", + "POPULACE_FIT_PREDICT_WORKERS": "2", + "VECLIB_MAXIMUM_THREADS": "2" + } + }, + "candidate": { + "logical_name": "national-rebase-candidate/invocation.json", + "sha256": "f5d804d933f174d6291b5af995b966a1f70f6036351aa34b2ac4a617aa0ef5a1", + "code_pin": "9b5ac7c52f8a3742940674dd2b58a7595ea24db6", + "chronicle_code_pin": "ec7169b5db40b9f54117c80f70f14efc1dd0fedd", + "spine_origin_code_pin": "a2ecb2060b5b612fbe66e6589d54baf83632e787", + "wrapper_sha256": "648ff8823c13672e513bd9079c844a4ab9d799acd61647e662e44a13947b338b", + "periods": { + "calibration_year": 2025, + "output_time_period": "2024", + "source_base_year": 2024 + }, + "posture": "diagnostic control, fixed source draws, no release certification", + "verified_doctrine_defaults": { + "l0_lambda": 0.0, + "mass_rule": "free", + "max_weight_ratio": 10.0, + "seed": 0 + }, + "thread_limits": { + "OMP_NUM_THREADS": "2", + "OPENBLAS_NUM_THREADS": "2", + "POPULACE_FIT_N_JOBS": "2", + "POPULACE_FIT_PREDICT_WORKERS": "2", + "VECLIB_MAXIMUM_THREADS": "2" + } + } + } + } +} diff --git a/docs/evidence/uk-cgt-889/target-comparison.csv b/docs/evidence/uk-cgt-889/target-comparison.csv new file mode 100644 index 000000000..d5c6a4b49 --- /dev/null +++ b/docs/evidence/uk-cgt-889/target-comparison.csv @@ -0,0 +1,364 @@ +name,family,target,control_estimate,candidate_estimate,control_relative_error,candidate_relative_error,absolute_error_change_pp +dfe.funded_childcare.early_learning_2_year_olds@2025,dfe_funded_childcare,95031.0,94926.19609069824,94730.13942718506,-0.001102839171446768,-0.0031659203082672117,0.20630811368204435 +dfe.funded_childcare.universal_only_children@2025,dfe_funded_childcare,396965.0,398097.26737213135,396970.9009170532,0.0028523103349951447,1.486508143847104e-05,-0.28374452535566735 +dfe.funded_childcare.working_parent_children_2_to_4@2025,dfe_funded_childcare,621482.0,620693.0394058228,620743.5235671997,-0.0012694826144236616,-0.0011882507181226374,-0.008123189630102425 +dft.bus_fare_receipts.england@2025,dft_local_bus,3417388656.43538,3413014982.893592,3420703193.9844637,-0.001279829127293413,0.0009699035966664229,-0.030992553062699 +dft.bus_net_support.england@2025,dft_local_bus,3024904320.8399997,3024788486.4766355,3025547465.1661716,-3.829356273062319e-05,0.00021261641954786764,0.017432285681724446 +dwp.benefit_cap.capped_households@2025,dwp_benefit_cap,110637.0,110695.21670913696,110722.17761993408,0.0005261956591100888,0.0007698836730395983,0.02436880139295095 +dwp.esa_claimants@2025,dwp_legacy_benefits,1000000.0,800905.8603649139,801054.7412891388,-0.19909413963508607,-0.19894525871086122,-0.014888092422485344 +dwp.esa_contrib_claimants@2025,dwp_legacy_benefits,620000.0,620819.2523536682,621533.8441810608,0.0013213747639809884,0.002473942227517405,0.11525674635364165 +dwp.esa_income_claimants@2025,dwp_legacy_benefits,180000.0,180348.33646202087,179757.01635742188,0.0019352025667826334,-0.0013499091254340278,-0.058529344134860564 +dwp.uc.households@2025,dwp_universal_credit,6197311.0,5905355.915781509,5921636.7649006955,-0.04710996175897754,-0.04448287896142447,-0.2627082797553068 +dwp.uc.households_children_1@2025,dwp_universal_credit,1190123.8333333333,958658.2978921045,970143.6153588403,-0.19448861451075508,-0.1848380914768894,-0.9650523033865682 +dwp.uc.households_children_2@2025,dwp_universal_credit,1049895.5,982488.795085907,988014.1006622314,-0.0642032515751263,-0.058940532022252266,-0.526271955287403 +dwp.uc.households_children_3@2025,dwp_universal_credit,477887.6666666667,477891.95067596436,477592.3685569763,8.964469260215405e-06,-0.0006179236885314771,0.060895921927126166 +dwp.uc.households_children_4@2025,dwp_universal_credit,170713.66666666666,170759.3681640625,169877.8620147705,0.0002677084868962436,-0.004895944584964781,0.46282360980685366 +dwp.uc.households_children_5_or_more@2025,dwp_universal_credit,76320.08333333333,76415.20346069336,76266.9966430664,0.00124633154479912,-0.0006955795637049082,-0.05507519810942118 +dwp.uc.households_couple_no_children@2025,dwp_universal_credit,241130.91666666666,246619.82132911682,246801.37789154053,0.022763172546794937,0.023516110265995354,0.07529377192004166 +dwp.uc.households_couple_with_children@2025,dwp_universal_credit,826160.8333333334,826999.3626594543,825913.004535675,0.0010149710471479708,-0.0002999764545341635,-0.07149945926138072 +dwp.uc.households_single_no_children@2025,dwp_universal_credit,2990070.1666666665,2992522.4791736603,2992940.4437732697,0.0008201521604182311,0.0009599363715945602,0.013978421117632913 +dwp.uc.households_single_with_children@2025,dwp_universal_credit,2138780.1666666665,1839214.2526192775,1855981.93870021,-0.14006391059548154,-0.13222407443921802,-0.7839836156263519 +dwp.uc.scotland_households_child_under_1@2025,dwp_universal_credit,14333.222222222223,14293.698974609375,14339.822967529297,-0.002757457255603754,0.0004605206843748264,-0.22969365712289272 +dwp.uc.two_child_limit.children_affected@2025,dwp_two_child_limit,597920.0,598350.1328811646,597142.075630188,0.0007193819928494627,-0.0013010509262309535,0.058166893338149075 +dwp.uc.two_child_limit.children_claimant_pip@2025,dwp_two_child_limit,235270.0,234708.7303161621,234948.0887451172,-0.0023856406844811944,-0.0013682630802176754,-0.10173776042635191 +dwp.uc.two_child_limit.children_disabled_child_element@2025,dwp_two_child_limit,479460.0,479984.01042175293,478389.86698913574,0.0010929179113021517,-0.002231954721695778,0.11390368103936264 +dwp.uc.two_child_limit.children_in_3_children_households@2025,dwp_two_child_limit,891930.0,892681.7881393433,892009.286064148,0.0008428779605386765,8.889269802333054e-05,-0.07539852625153459 +dwp.uc.two_child_limit.children_in_4_children_households@2025,dwp_two_child_limit,468760.0,469047.0302734375,466136.40002441406,0.0006123181872120061,-0.005596893880847209,0.49845756936352026 +dwp.uc.two_child_limit.children_in_5_children_households@2025,dwp_two_child_limit,185120.0,185491.82815551758,185846.0726928711,0.0020085790596239095,0.003922173146451457,0.19135940868275475 +dwp.uc.two_child_limit.children_in_6_plus_children_households@2025,dwp_two_child_limit,119720.0,119755.16040039062,119474.77746582031,0.00029368861001190276,-0.002048300485964647,0.1754611875952744 +dwp.uc.two_child_limit.children_in_affected_households@2025,dwp_two_child_limit,1665540.0,1666975.806968689,1663466.5362472534,0.0008620669384637804,-0.0012449198174445417,0.03828528789807613 +dwp.uc.two_child_limit.households_3_children@2025,dwp_two_child_limit,297310.0,297560.59604644775,297336.4286880493,0.0008428779605386765,8.889269802333054e-05,-0.07539852625153459 +dwp.uc.two_child_limit.households_4_children@2025,dwp_two_child_limit,117190.0,117261.75756835938,116534.10000610352,0.0006123181872120061,-0.005596893880847209,0.49845756936352026 +dwp.uc.two_child_limit.households_5_children@2025,dwp_two_child_limit,37020.0,37098.365631103516,37169.21453857422,0.0021168457888577964,0.0040306466389578265,0.191380085010003 +dwp.uc.two_child_limit.households_6_plus_children@2025,dwp_two_child_limit,18260.0,18265.482360839844,18224.869018554688,0.00030023881926855147,-0.001923931075865964,0.16236922565974124 +dwp.uc.two_child_limit.households_affected@2025,dwp_two_child_limit,469780.0,470186.2016067505,469264.61225128174,0.0008646634738611441,-0.0010970832064333554,0.023241973257221132 +dwp.uc.two_child_limit.households_claimant_pip@2025,dwp_two_child_limit,65280.0,65115.01516723633,65189.623779296875,-0.002527341188168993,-0.0013844396553787531,-0.114290153279024 +dwp.uc.two_child_limit.households_disabled_child_element@2025,dwp_two_child_limit,129630.0,129779.48835754395,129387.85597229004,0.0011531926062172747,-0.0018679628767257653,0.07147702705084906 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025,dwp_universal_credit,7506.333333333333,7549.726631164551,7501.908332824707,0.005780891402533561,-0.0005895022659033704,-0.5191389136630191 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025,dwp_universal_credit,13313.333333333334,13278.288986206055,13292.263534545898,-0.0026322744462152665,-0.0015826088222910992,-0.10496656239241672 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025,dwp_universal_credit,16121.444444444445,16067.063690185547,16020.69204711914,-0.003373193664271091,-0.006249588718461549,0.28763950541904587 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025,dwp_universal_credit,13317.333333333334,13265.290328979492,13211.862380981445,-0.003907914824327324,-0.007919825216651629,0.40119103923243055 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025,dwp_universal_credit,19657.333333333332,19646.632431030273,19775.19612121582,-0.0005443720224712754,0.005995868609636176,0.5451496587164901 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025,dwp_universal_credit,16443.222222222223,16378.710571289062,16507.149322509766,-0.003923297396417579,0.003887747755494577,-0.003554964092300234 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025,dwp_universal_credit,13441.111111111111,13433.922409057617,13407.74967956543,-0.0005348294492969094,-0.002482044175507437,0.19472147262105274 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025,dwp_universal_credit,10728.555555555555,10777.996124267578,10733.342819213867,0.004608315486274536,0.000446216979864867,-0.4162098506409669 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025,dwp_universal_credit,9653.222222222223,9725.134979248047,9676.722259521484,0.007449611680986409,0.002434424149602962,-0.5015187531383447 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025,dwp_universal_credit,8797.0,8813.124504089355,8721.069076538086,0.0018329548811362362,-0.008631456571776067,0.679850169063983 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025,dwp_universal_credit,6486.888888888889,6539.253356933594,6485.8262939453125,0.008072354705257538,-0.00016380655839446544,-0.7908548146863074 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025,dwp_universal_credit,3981.8888888888887,3994.9493408203125,3966.171630859375,0.003279963930653077,-0.003947186490655557,0.066722256000248 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025,dwp_universal_credit,2761.4444444444443,2750.487060546875,2756.07861328125,-0.003967989984232249,-0.0019431247925300404,-0.2024865191702209 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025,dwp_universal_credit,2131.222222222222,2131.5609130859375,2143.7354125976562,0.0001589186055699888,0.005871368196595939,0.571244959102595 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025,dwp_universal_credit,1475.3333333333333,1468.1308288574219,1486.83203125,-0.0048819506162978196,0.00779396605286946,0.29120154365716405 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025,dwp_universal_credit,746.3333333333334,0.0,0.0,-1.0,-1.0,0.0 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025,dwp_universal_credit,605.7777777777778,0.0,0.0,-1.0,-1.0,0.0 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025,dwp_universal_credit,12256.0,12192.001091003418,12349.63419342041,-0.005221843096979604,0.007639865651143126,0.2418022554163522 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025,dwp_universal_credit,10945.444444444445,10940.92593383789,10989.354064941406,-0.0004128211174511126,0.0040116799934285085,0.3598858875977396 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025,dwp_universal_credit,12492.444444444445,12473.312881469727,12511.995803833008,-0.0015314507148540292,0.0015650547397276845,0.003360402487365523 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025,dwp_universal_credit,12979.666666666666,12898.599021911621,13017.202606201172,-0.006245741654000742,0.002891903197398943,-0.3353838456601799 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025,dwp_universal_credit,16484.444444444445,16494.63247680664,16533.905548095703,0.0006180391699902827,0.003000471372750882,0.23824322027605993 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025,dwp_universal_credit,15272.444444444445,15259.45620727539,15277.932632446289,-0.0008504360396465068,0.0003593522976500472,-0.04910837419964595 +dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025,dwp_universal_credit,19142.333333333332,19168.387908935547,19196.922943115234,0.0013610971634709155,0.0028517740670017024,0.14906769035307868 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025,dwp_universal_credit,19073.555555555555,19080.001777648926,19014.604873657227,0.00033796646223590145,-0.003090702293372754,0.27527358311368527 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025,dwp_universal_credit,40805.444444444445,40726.661712646484,40755.253967285156,-0.001930691672902167,-0.0012299946206350487,-0.07006970522671183 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025,dwp_universal_credit,40009.555555555555,39959.461517333984,39975.60674285889,-0.0012520518542629632,-0.0008485176159862152,-0.0403534238276748 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025,dwp_universal_credit,39972.555555555555,40084.38185119629,39974.25108337402,0.0027975768395721756,4.2417298441481276e-05,-0.2755159541130694 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025,dwp_universal_credit,40518.77777777778,40631.55555725098,40520.024978637695,0.0027833460350585324,3.078081147349708e-05,-0.2752565223585035 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025,dwp_universal_credit,37118.0,37138.967376708984,37159.76266479492,0.0005648843339884793,0.0011251324100145987,0.056024807602611935 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025,dwp_universal_credit,37177.77777777778,37149.302505493164,37114.09118652344,-0.0007659218486597505,-0.0017130284557354799,0.09471066070757293 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025,dwp_universal_credit,37164.555555555555,37318.567932128906,37192.609283447266,0.0041440661477338435,0.0007548516986776466,-0.3389214449056197 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025,dwp_universal_credit,33309.555555555555,33282.195220947266,33317.78674316406,-0.0008213959673720657,0.0002471119014115728,-0.057428406596049295 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025,dwp_universal_credit,22775.777777777777,22835.179355621338,22688.353755950928,0.00260810315340881,-0.0038384648234559464,0.12303616700471363 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025,dwp_universal_credit,29102.555555555555,29132.563507080078,29020.713439941406,0.0010311105314184338,-0.002812196869031496,0.17810863376130623 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025,dwp_universal_credit,27534.666666666668,27392.065307617188,27365.25164794922,-0.005178975317762349,-0.006152789890953796,0.09738145731914465 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025,dwp_universal_credit,25584.777777777777,25543.960021972656,25539.38427734375,-0.0015953922351662668,-0.0017742386050135991,0.01788463698473323 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025,dwp_universal_credit,22927.777777777777,22907.781677246094,23015.901306152344,-0.0008721342611347352,0.003843526800926084,0.2971392539791349 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025,dwp_universal_credit,20334.666666666668,20316.6142578125,20311.510681152344,-0.0008877651721609015,-0.0011387442879642708,0.025097911580336932 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025,dwp_universal_credit,17535.0,17451.72442626953,17474.560791015625,-0.004749106001167308,-0.003446775533753921,-0.1302330467413387 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025,dwp_universal_credit,15399.888888888889,15438.156677246094,15288.900451660156,0.0024849392507510556,-0.007207093377719839,0.4722154126968784 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025,dwp_universal_credit,12836.222222222223,12812.334838867188,12789.249877929688,-0.0018609356352277074,-0.0036593589203539993,0.17984232851262918 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025,dwp_universal_credit,26502.666666666668,26519.094997406006,26405.262996673584,0.0006198746317101919,-0.0036752403529110487,0.30553657212008567 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025,dwp_universal_credit,29027.0,29060.13680267334,28948.75368499756,0.0011415855125689821,-0.0026956390602694527,0.15540535477004705 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025,dwp_universal_credit,32427.0,32352.70072555542,32327.552501678467,-0.0022912780844536983,-0.0030668115558495452,0.0775533471395847 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025,dwp_universal_credit,34956.88888888889,34938.12148284912,34876.3314743042,-0.0005368728921907769,-0.0023044789495067623,0.17676060573159855 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025,dwp_universal_credit,37410.77777777778,37410.73895263672,37320.519844055176,-1.0378063052547358e-06,-0.002412618477454349,0.24115806711490942 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025,dwp_universal_credit,39910.333333333336,39912.52444458008,39775.37535095215,5.490085057526538e-05,-0.0033815298222144804,0.3326628971639215 +dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025,dwp_universal_credit,39368.0,39413.518005371094,39331.33395385742,0.0011562183847564965,-0.0009313667481857886,-0.02248516365707079 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025,dwp_universal_credit,26670.222222222223,26702.536514282227,26738.197067260742,0.0012116244023298369,0.002548716860029813,0.1337092457699976 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025,dwp_universal_credit,36208.11111111111,36079.87585449219,36153.96160888672,-0.003541616855555072,-0.0014955075137231889,-0.20461093418318832 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025,dwp_universal_credit,85490.44444444444,85422.88656616211,85821.2798461914,-0.0007902389409875015,0.0038698524015974684,0.3079613460609967 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025,dwp_universal_credit,71259.55555555556,71301.09902954102,71540.64520263672,0.0005829881152298989,0.003944588832890108,0.3361600717660209 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025,dwp_universal_credit,51301.666666666664,51248.27346801758,51377.555236816406,-0.001040769279407806,0.0014792613004725385,0.04384920210647326 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025,dwp_universal_credit,43305.22222222222,43308.97979736328,43393.48303222656,8.676956145797237e-05,0.0020381100817686644,0.1951340520310692 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025,dwp_universal_credit,34910.555555555555,34967.71870422363,35005.31857299805,0.0016374173300424978,0.0027144517162349152,0.10770343861924174 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025,dwp_universal_credit,28513.0,28472.154052734375,28410.603729248047,-0.0014325376938808614,-0.003591213507942101,0.21586758140612394 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025,dwp_universal_credit,22593.0,22941.5359954834,22335.25946044922,0.01542672489193106,-0.011407982098472148,-0.4018742793458912 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025,dwp_universal_credit,46312.77777777778,46211.40223693848,46559.80694580078,-0.0021889324221866773,0.005333931149807473,0.3144998727620796 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025,dwp_universal_credit,60310.11111111111,60197.692474365234,60178.7666015625,-0.0018640097767149346,-0.0021778190609967473,0.03138092842818127 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025,dwp_universal_credit,67858.66666666667,67966.1632156372,67801.44441986084,0.0015841240957264438,-0.0008432562798045693,-0.07408678159218746 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025,dwp_universal_credit,89577.44444444444,89698.78782653809,89584.03790283203,0.001354619824736177,7.360623456591808e-05,-0.12810135901702588 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025,dwp_universal_credit,116076.0,116286.76705932617,116538.10373687744,0.0018157677670334253,0.00398104463349393,0.21652768664605043 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025,dwp_universal_credit,97511.0,97399.42486572266,97955.5943145752,-0.0011442312588050964,0.00455942729102558,0.3415196032220484 +dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025,dwp_universal_credit,102343.0,102252.2599029541,102796.92694091797,-0.0008866272929843608,0.004435349177940541,0.35487218849561797 +dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025,dwp_universal_credit,89479.33333333333,89634.40298843384,89215.16776657104,0.0017330220211055373,-0.002952252290237786,0.12192302691322486 +dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025,dwp_universal_credit,104891.11111111111,105225.78038787842,104730.4072265625,0.0031906352523312816,-0.0015321020327296938,-0.16585332196015878 +dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025,dwp_universal_credit,122035.55555555556,121352.39295959473,122078.40899658203,-0.005598061916060455,0.00035115537296800844,-0.5246906543092446 +dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025,dwp_universal_credit,149963.22222222222,149558.40324783325,150295.2777786255,-0.0026994550289742916,0.002214246609820203,-0.04852084191540886 +dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025,dwp_universal_credit,108689.66666666667,108450.17974853516,109009.77145385742,-0.002203400980757281,0.0029451262204387755,0.07417252396814947 +dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025,dwp_universal_credit,61718.666666666664,61655.18292236328,61770.48156738281,-0.0010285987648801496,0.0008395337021130548,-0.018906506276709478 +dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025,dwp_universal_credit,34050.444444444445,34080.252182006836,34123.49203491211,0.0008753993684582879,0.0021452756831660774,0.12698763147077893 +dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025,dwp_universal_credit,127403.22222222222,127142.69436264038,127203.61846160889,-0.0020449079311935623,-0.0015667088879838121,-0.047819904320975014 +dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025,dwp_universal_credit,22338.333333333332,22386.04296875,22302.59716796875,0.0021357741736925113,-0.0015997686502088543,-0.0536005523483657 +dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025,dwp_universal_credit,11133.666666666666,10729.99609375,10729.99609375,-0.03625675035927063,-0.03625675035927063,0.0 +dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025,dwp_universal_credit,6951.222222222223,6957.512939453125,6929.44873046875,0.00090498002074969,-0.0031323256626533086,0.22273456419036183 +dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025,dwp_universal_credit,6508.222222222223,6518.90576171875,6489.63818359375,0.0016415449767601044,-0.002855470817363568,0.12139258406034636 +dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025,dwp_universal_credit,5913.444444444444,5901.88525390625,5947.3701171875,-0.001954730554550818,0.005737040917823809,0.3782310363272991 +dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025,dwp_universal_credit,1653.7777777777778,1653.3655700683594,1650.5017395019531,-0.00024925217581067455,-0.0019809422522455208,0.1731690076434846 +dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025,dwp_universal_credit,197136.66666666666,197619.07789230347,197315.17567253113,0.002447090304375018,0.0009055088983842223,-0.1541581405990796 +dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025,dwp_universal_credit,377063.1111111111,377133.3975048065,376824.7805747986,0.0001864048527268499,-0.0006320706780629887,0.044566582533613876 +dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025,dwp_universal_credit,195983.22222222222,196006.10721969604,196081.9817123413,0.00011677018682689584,0.0005039180854323734,0.03871478986054776 +dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025,dwp_universal_credit,114033.33333333333,113709.17582702637,114046.63146972656,-0.002842655711548915,0.00011661622092868183,-0.27260394906202334 +dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025,dwp_universal_credit,149043.77777777778,148945.04288482666,148708.5940246582,-0.0006624556517772464,-0.0022488946410049553,0.15864389892277087 +hmrc.salary_sacrifice.users_above_cap@2025,hmrc_salary_sacrifice,3300000.0,3310142.457506424,3301125.3879010733,0.0030734719716435806,0.00034102663668888534,-0.2732445334954695 +hmrc.salary_sacrifice.users_below_cap@2025,hmrc_salary_sacrifice,4300000.0,4312530.925374508,4299594.7601591665,0.002914168691746024,-9.424182344964424e-05,-0.281992686829638 +hmrc.salary_sacrifice.users_total@2025,hmrc_salary_sacrifice,7700000.0,7622673.382880932,7600720.14806024,-0.010042417807671206,-0.012893487264903915,0.28510694572327094 +hmrc.tfc.children_with_used_accounts@2025,hmrc_tfc,1151515.0,1148588.428237915,1151431.0919418335,-0.0025414968646391587,-7.286753378506047e-05,-0.24686293308540985 +hmrc.tfc.government_top_up@2025,hmrc_tfc,599800000.0,599657535.1840911,599861349.4543235,-0.00023752053335930119,0.00010228318493419506,-0.013523734842510612 +hmrc/dividend_income_count_income_band_100_000_to_150_000@2025,hmrc_spi,222000.0,222578.88404417038,222482.31531143188,0.00260758578455126,0.002172591492936418,-0.04349942916148418 +hmrc/dividend_income_count_income_band_12_570_to_15_000@2025,hmrc_spi,115000.0,115074.04962778091,114918.26409244537,0.0006439098067905592,-0.0007107470222141431,0.006683721542358396 +hmrc/dividend_income_count_income_band_150_000_to_200_000@2025,hmrc_spi,92000.0,92040.45379924774,92216.7066745758,0.0004397152092145837,0.0023555073323457136,0.191579212313113 +hmrc/dividend_income_count_income_band_15_000_to_20_000@2025,hmrc_spi,372000.0,371727.824590683,371789.72939014435,-0.0007316543261210123,-0.0005652435748807846,-0.016641075124022776 +hmrc/dividend_income_count_income_band_200_000_to_300_000@2025,hmrc_spi,75000.0,74926.22023010254,74954.1375656128,-0.0009837302652994792,-0.0006114991251627604,-0.03722311401367187 +hmrc/dividend_income_count_income_band_20_000_to_30_000@2025,hmrc_spi,843000.0,843664.7532503605,843470.4051469908,0.0007885566433695005,0.0005580132230021189,-0.023054342036738156 +hmrc/dividend_income_count_income_band_300_000_to_500_000@2025,hmrc_spi,49000.0,49076.62705421448,48974.64538002014,0.0015638174329485211,-0.0005174412240787429,-0.10463762088697781 +hmrc/dividend_income_count_income_band_30_000_to_40_000@2025,hmrc_spi,667000.0,667118.4145302773,667397.620798111,0.0001775330289014276,0.0005961331306011423,0.04186001016997147 +hmrc/dividend_income_count_income_band_40_000_to_50_000@2025,hmrc_spi,627000.0,627162.6924381256,626971.544523716,0.00025947757276811856,-4.538353474326491e-05,-0.021409403802485367 +hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025,hmrc_spi,32000.0,31914.33546447754,31929.55731201172,-0.0026770167350769042,-0.002201333999633789,-0.04756827354431151 +hmrc/dividend_income_count_income_band_50_000_to_70_000@2025,hmrc_spi,643000.0,642162.5516755949,643025.1111498247,-0.0013024079695258515,3.905311014726295e-05,-0.12633548593785887 +hmrc/dividend_income_count_income_band_70_000_to_100_000@2025,hmrc_spi,336000.0,336064.1584918499,336283.36672258377,0.00019094789241041457,0.0008433533410231272,0.06524054486127126 +hmrc/dividend_income_income_band_100_000_to_150_000@2025,hmrc_spi,6870000000.0,6894273786.925237,6891162516.622944,0.003533302318083945,0.0030804245448244364,-0.04528777732595085 +hmrc/dividend_income_income_band_12_570_to_15_000@2025,hmrc_spi,175000000.0,174824337.84038645,174647766.9937784,-0.001003783769220284,-0.002012760035551957,0.10089762663316729 +hmrc/dividend_income_income_band_150_000_to_200_000@2025,hmrc_spi,3450000000.0,3449923615.56849,3462478300.690716,-2.2140414930426557e-05,0.003616898750932113,0.3594758336001686 +hmrc/dividend_income_income_band_15_000_to_20_000@2025,hmrc_spi,855000000.0,855082374.5444342,853251250.6250467,9.634449641425707e-05,-0.0020453209063780934,0.19489764099638363 +hmrc/dividend_income_income_band_200_000_to_300_000@2025,hmrc_spi,3700000000.0,3697358285.405196,3696543154.0687127,-0.0007139769175145432,-0.0009342826841316997,0.022030576661715644 +hmrc/dividend_income_income_band_20_000_to_30_000@2025,hmrc_spi,3330000000.0,3331018611.9216385,3332014411.7466683,0.00030588946595750413,0.0006049284524529546,0.029903898649545044 +hmrc/dividend_income_income_band_300_000_to_500_000@2025,hmrc_spi,3430000000.0,3436143439.386361,3442016019.7673182,0.0017910902001052834,0.003503212760151093,0.17121225600458095 +hmrc/dividend_income_income_band_30_000_to_40_000@2025,hmrc_spi,4700000000.0,4692892862.74632,4707275957.274032,-0.001512156862485155,0.0015480760157514126,0.0035919153266257466 +hmrc/dividend_income_income_band_40_000_to_50_000@2025,hmrc_spi,8400000000.0,8409454356.005359,8395737304.968556,0.0011255185720665114,-0.0005074636942194757,-0.061805487784703565 +hmrc/dividend_income_income_band_50_000_to_70_000@2025,hmrc_spi,12500000000.0,12500481578.788755,12496676863.40134,3.852630310043335e-05,-0.00026585092789276125,0.02273246247923279 +hmrc/dividend_income_income_band_70_000_to_100_000@2025,hmrc_spi,9440000000.0,9440689361.02068,9445466344.601028,7.302553185163919e-05,0.0005790619280750469,0.05060363962234077 +hmrc/employment_income_count_income_band_100_000_to_150_000@2025,hmrc_spi,791000.0,792964.9012224728,792138.8263628536,0.002484072341937772,0.001439729915112057,-0.1044342426825715 +hmrc/employment_income_count_income_band_12_570_to_15_000@2025,hmrc_spi,1360000.0,1365177.517014742,1364502.4826648142,0.003806997804957278,0.0033106490182457492,-0.049634878671152856 +hmrc/employment_income_count_income_band_150_000_to_200_000@2025,hmrc_spi,264000.0,264663.1562137604,263860.07652664185,0.0025119553551529394,-0.0005300131566596753,-0.1981942198493264 +hmrc/employment_income_count_income_band_15_000_to_20_000@2025,hmrc_spi,3100000.0,3109879.536339771,3104651.6507803467,0.003186947206377743,0.0015005325097892613,-0.16864146965884816 +hmrc/employment_income_count_income_band_200_000_to_300_000@2025,hmrc_spi,180000.0,180104.21351242065,179753.73133850098,0.0005789639578925239,-0.0013681592305501303,0.07891952726576064 +hmrc/employment_income_count_income_band_20_000_to_30_000@2025,hmrc_spi,7470000.0,7499823.851601991,7484920.125304093,0.003992483480855538,0.00199733939813824,-0.1995144082717298 +hmrc/employment_income_count_income_band_300_000_to_500_000@2025,hmrc_spi,93000.0,92867.96628284454,92751.92737674713,-0.00141971738876835,-0.002667447561858803,0.12477301730904529 +hmrc/employment_income_count_income_band_30_000_to_40_000@2025,hmrc_spi,5370000.0,5449477.36409642,5442028.5377696715,0.014800254021679681,0.013413135525078498,-0.13871184966011835 +hmrc/employment_income_count_income_band_40_000_to_50_000@2025,hmrc_spi,3500000.0,3507028.743809776,3502050.24144875,0.002008212517078833,0.000585783271071368,-0.1422429246007465 +hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025,hmrc_spi,44000.0,43993.48078918457,43946.834396362305,-0.00014816388216885653,-0.0012083091735839843,0.10601452914151277 +hmrc/employment_income_count_income_band_50_000_to_70_000@2025,hmrc_spi,3430000.0,3434298.003418244,3435972.7879767786,0.0012530622210623777,0.0017413376025593522,0.048827538149697446 +hmrc/employment_income_count_income_band_70_000_to_100_000@2025,hmrc_spi,1640000.0,1657474.498050928,1655284.3107624054,0.010655181738370802,0.009319701684393535,-0.1335480053977267 +hmrc/employment_income_income_band_100_000_to_150_000@2025,hmrc_spi,82300000000.0,82437277887.10991,82477677437.58824,0.001668018069379211,0.002158899606175475,0.0490881536796264 +hmrc/employment_income_income_band_12_570_to_15_000@2025,hmrc_spi,16900000000.0,16867559505.962223,16866580981.908524,-0.001919555860223488,-0.0019774566918033397,0.005790083157985169 +hmrc/employment_income_income_band_150_000_to_200_000@2025,hmrc_spi,39200000000.0,39343722658.34471,39224460536.383736,0.0036663943455283498,0.0006239932750952973,-0.30424010704330523 +hmrc/employment_income_income_band_15_000_to_20_000@2025,hmrc_spi,48600000000.0,48571104009.64969,48573626956.30167,-0.0005945677026813021,-0.0005426552201303239,-0.005191248255097822 +hmrc/employment_income_income_band_200_000_to_300_000@2025,hmrc_spi,36600000000.0,36686181384.16371,36591627859.24364,0.002354682627423813,-0.00022874701520117255,-0.21259356122226405 +hmrc/employment_income_income_band_20_000_to_30_000@2025,hmrc_spi,172000000000.0,172083482725.8886,172063615826.5224,0.00048536468539890024,0.00036985945652558084,-0.01155052288733194 +hmrc/employment_income_income_band_300_000_to_500_000@2025,hmrc_spi,29000000000.0,30564748001.398754,30301756357.25937,0.0539568276344398,0.04488815025032306,-0.9068677384116736 +hmrc/employment_income_income_band_30_000_to_40_000@2025,hmrc_spi,170000000000.0,170115166383.40378,170032447485.84415,0.000677449314139871,0.00019086756378909842,-0.04865817503507726 +hmrc/employment_income_income_band_40_000_to_50_000@2025,hmrc_spi,139000000000.0,139158516908.86105,139086852358.84,0.0011404094162665718,0.0006248371139568082,-0.05155723023097635 +hmrc/employment_income_income_band_500_000_to_1_000_000@2025,hmrc_spi,23100000000.0,23117163879.138275,23082529683.230755,0.0007430250709210021,-0.0007562907692313916,0.001326569831038959 +hmrc/employment_income_income_band_50_000_to_70_000@2025,hmrc_spi,174000000000.0,174344680401.29572,174756801223.34763,0.0019809218465271,0.004349432318089803,0.23685104715627034 +hmrc/employment_income_income_band_70_000_to_100_000@2025,hmrc_spi,118000000000.0,118035277549.29321,117956350721.91338,0.00029896228214587193,-0.00036990913632732326,0.007094685418145133 +hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025,hmrc_spi,109000.0,109048.34322357178,109161.64456558228,0.00044351581258511325,0.0014829776658924348,0.10394618533073217 +hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025,hmrc_spi,1070000.0,1071354.7379851341,1070596.143336296,0.0012661102664804904,0.0005571433049496089,-0.07089669615308815 +hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025,hmrc_spi,29000.0,29040.356709480286,29000.459478378296,0.0013916106717339878,1.5844082010203393e-05,-0.13757665897237845 +hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025,hmrc_spi,2140000.0,2141104.6531006563,2138787.0376602025,0.000516193037689881,-0.0005668048316810855,0.005061179399120448 +hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025,hmrc_spi,20000.0,19962.649101257324,20082.078704833984,-0.001867544937133789,0.004103935241699218,0.22363903045654293 +hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025,hmrc_spi,2660000.0,2661302.84004879,2659180.0798906432,0.0004897894920263075,-0.00030824064261532086,-0.018154884941098667 +hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025,hmrc_spi,10000.0,10001.05462551117,10029.502806663513,0.00010546255111694336,0.0029502806663513183,0.2844818115234375 +hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025,hmrc_spi,1450000.0,1448803.863445282,1450017.896736145,-0.0008249217618744949,1.2342576651737608e-05,-0.08125791852227573 +hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025,hmrc_spi,779000.0,778593.1363544464,778820.1164355278,-0.0005222896605309228,-0.0002309160006061598,-0.0291373659924763 +hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025,hmrc_spi,4000.0,4003.2963256835938,3993.177444458008,0.0008240814208984375,-0.0017056388854980468,0.08815574645996094 +hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025,hmrc_spi,643000.0,641976.118216753,643367.7096328735,-0.0015923511403530234,0.0005718656809852802,-0.10204854593677433 +hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025,hmrc_spi,259000.0,259416.3604233319,258208.08591270447,0.0016075692020536896,-0.0030575833486313985,0.1450014146577709 +hmrc/private_pension_income_income_band_100_000_to_150_000@2025,hmrc_spi,5430000000.0,5433440329.915841,5434683887.414151,0.0006335782533777353,0.0008625943672469966,0.022901611386926132 +hmrc/private_pension_income_income_band_12_570_to_15_000@2025,hmrc_spi,4350000000.0,4356060765.123558,4354845031.623423,0.0013932793387489758,0.0011138003732006029,-0.02794789655483729 +hmrc/private_pension_income_income_band_150_000_to_200_000@2025,hmrc_spi,1810000000.0,1812924024.293221,1806842622.6002488,0.0016154830349287275,-0.001744407403177451,0.01289243682487235 +hmrc/private_pension_income_income_band_15_000_to_20_000@2025,hmrc_spi,13600000000.0,13603170338.357073,13594692879.58194,0.0002331131144906493,-0.00039022944250443405,0.015711632801378477 +hmrc/private_pension_income_income_band_200_000_to_300_000@2025,hmrc_spi,1570000000.0,1564151609.361326,1580843500.957539,-0.0037250895787732615,0.006906688507986676,0.3181598929213415 +hmrc/private_pension_income_income_band_20_000_to_30_000@2025,hmrc_spi,30200000000.0,30210500378.603336,30205728919.41489,0.0003476946557396137,0.00018969931837385063,-0.015799533736576308 +hmrc/private_pension_income_income_band_300_000_to_500_000@2025,hmrc_spi,1120000000.0,980300037.0694891,992994511.6282674,-0.12473210975938472,-0.11339775747476125,-1.133435228462347 +hmrc/private_pension_income_income_band_30_000_to_40_000@2025,hmrc_spi,24900000000.0,24889272149.0994,24924507957.4174,-0.00043083738556628246,0.000984255317967886,0.05534179324016036 +hmrc/private_pension_income_income_band_40_000_to_50_000@2025,hmrc_spi,16900000000.0,16906004975.266615,16908386003.829512,0.0003553239802730718,0.0004962132443498014,0.014088926407672956 +hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025,hmrc_spi,640000000.0,640246080.3115848,638899817.9100064,0.0003845004868512973,-0.0017190345156149938,0.13345340287636964 +hmrc/private_pension_income_income_band_50_000_to_70_000@2025,hmrc_spi,17400000000.0,17383249921.012943,17411039971.17449,-0.0009626482176469386,0.0006344811019822921,-0.03281671156646466 +hmrc/private_pension_income_income_band_70_000_to_100_000@2025,hmrc_spi,9470000000.0,9480415417.97901,9439299568.338987,0.001099832943929211,-0.0032418618438239334,0.21420288998947223 +hmrc/property_income_count_income_band_100_000_to_150_000@2025,hmrc_spi,137000.0,136474.92591285706,137168.26479148865,-0.003832657570386455,0.0012282101568514413,-0.2604447413535014 +hmrc/property_income_count_income_band_12_570_to_15_000@2025,hmrc_spi,101000.0,101109.31782150269,101346.8582649231,0.0010823546683434212,0.0034342402467633236,0.23518855784199025 +hmrc/property_income_count_income_band_150_000_to_200_000@2025,hmrc_spi,54000.0,54171.188457489014,53825.39771270752,0.00317015662016692,-0.00323337569060149,0.006321907043457028 +hmrc/property_income_count_income_band_15_000_to_20_000@2025,hmrc_spi,232000.0,231389.88915538788,231284.48879432678,-0.0026297881233281104,-0.003084100024453525,0.04543119011254145 +hmrc/property_income_count_income_band_200_000_to_300_000@2025,hmrc_spi,41000.0,41078.52325439453,40985.660652160645,0.0019152013266958842,-0.0003497401912037919,-0.15654611354920922 +hmrc/property_income_count_income_band_20_000_to_30_000@2025,hmrc_spi,431000.0,430581.1872162819,431645.16889953613,-0.000971723396097701,0.0014969115998518163,0.05251882037541152 +hmrc/property_income_count_income_band_300_000_to_500_000@2025,hmrc_spi,23000.0,23012.888721466064,23027.067195892334,0.0005603791941767154,0.001176834604014521,0.06164554098378056 +hmrc/property_income_count_income_band_30_000_to_40_000@2025,hmrc_spi,364000.0,363327.8918809891,364464.5138530731,-0.001846450876403641,0.0012761369589920882,-0.05703139174115528 +hmrc/property_income_count_income_band_40_000_to_50_000@2025,hmrc_spi,325000.0,325168.9147930145,324922.35222148895,0.0005197378246600811,-0.00023891624157245343,-0.02808215830876277 +hmrc/property_income_count_income_band_50_000_to_70_000@2025,hmrc_spi,397000.0,396466.29116535187,397204.8216605553,-0.0013443547472245148,0.00051592357822498,-0.08284311689995348 +hmrc/property_income_count_income_band_70_000_to_100_000@2025,hmrc_spi,226000.0,226300.05749225616,225959.64861869812,0.0013276880188325866,-0.00017854593496407028,-0.11491420838685162 +hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025,hmrc_spi,85000.0,84779.2965927124,85157.46286582947,-0.002596510673971737,0.0018525043038760914,-0.07440063700956458 +hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025,hmrc_spi,444000.0,443786.3394908905,444335.54044914246,-0.0004812173628592276,0.0007557217323028289,0.027450436944360133 +hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025,hmrc_spi,40000.0,40095.42194366455,39789.439628601074,0.0023855485916137696,-0.005264009284973145,0.28784606933593754 +hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025,hmrc_spi,651000.0,649448.8898844719,649775.5322070122,-0.0023826576275393346,-0.0018809029078153971,-0.05017547197239374 +hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025,hmrc_spi,34000.0,34100.544335365295,33880.59492301941,0.0029571863342733942,-0.0035119140288409063,0.05547276945675121 +hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025,hmrc_spi,961000.0,961648.5036541545,962860.4917839216,0.0006748217004729274,0.0019359956128216513,0.1261173912348724 +hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025,hmrc_spi,21000.0,21052.293586730957,21000.487686157227,0.0024901707967122395,2.3223150344122024e-05,-0.24669476463681175 +hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025,hmrc_spi,595000.0,596358.2788336277,595769.5046725273,0.0022828215691221864,0.0012932851639114507,-0.09895364052107357 +hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025,hmrc_spi,359000.0,358874.54667305946,358798.1196374893,-0.0003494521641797674,-0.000562340842648137,0.021288867846836954 +hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025,hmrc_spi,311000.0,310717.4570353031,310817.2210073471,-0.0009084982787681162,-0.0005877138027424215,-0.032078447602569476 +hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025,hmrc_spi,143000.0,143363.71698760986,142843.02161169052,0.0025434754378312117,-0.0010977509671991521,-0.14457244706320596 +hmrc/self_employment_income_income_band_100_000_to_150_000@2025,hmrc_spi,4980000000.0,4984023895.826436,5002125371.4517975,0.0008080112101277195,0.004442845673051704,0.3634834462923984 +hmrc/self_employment_income_income_band_12_570_to_15_000@2025,hmrc_spi,4810000000.0,4805984335.611502,4814485854.718028,-0.0008348574612262591,0.000932610128488164,0.009775266726190491 +hmrc/self_employment_income_income_band_150_000_to_200_000@2025,hmrc_spi,3650000000.0,3656566481.5439396,3641379163.178382,0.0017990360394355043,-0.0023618731018131725,0.05628370623776682 +hmrc/self_employment_income_income_band_15_000_to_20_000@2025,hmrc_spi,8030000000.0,8028363000.666877,8029726117.750705,-0.00020386043999043676,-3.4107378492557246e-05,-0.016975306149787952 +hmrc/self_employment_income_income_band_200_000_to_300_000@2025,hmrc_spi,4390000000.0,4417881742.78326,4378035529.538005,0.006351194255867961,-0.0027253919047824887,-0.3625802351085472 +hmrc/self_employment_income_income_band_20_000_to_30_000@2025,hmrc_spi,15700000000.0,18832491476.593945,18880756116.185246,0.19952175010152512,0.2025959309672131,0.30741808656879754 +hmrc/self_employment_income_income_band_300_000_to_500_000@2025,hmrc_spi,4840000000.0,4854893343.750498,4842675904.852768,0.003077137138532607,0.0005528729034644513,-0.2524264235068156 +hmrc/self_employment_income_income_band_30_000_to_40_000@2025,hmrc_spi,12600000000.0,15640360964.991894,15637827479.670216,0.24129848928507094,0.24109741902144569,-0.020107026362525815 +hmrc/self_employment_income_income_band_40_000_to_50_000@2025,hmrc_spi,8730000000.0,9108844173.579672,8885513671.543478,0.04339566707670926,0.017813708080581674,-2.558195899612759 +hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025,hmrc_spi,6670000000.0,6671560517.966438,6656275570.626277,0.0002339607146084398,-0.002057635588264322,0.18236748736558825 +hmrc/self_employment_income_income_band_50_000_to_70_000@2025,hmrc_spi,8220000000.0,8246860288.349117,8222861627.814151,0.003267674981644438,0.0003481299043979088,-0.2919545077246529 +hmrc/self_employment_income_income_band_70_000_to_100_000@2025,hmrc_spi,5360000000.0,5381368863.645258,5351311047.545394,0.003986728292025737,-0.001621073219142921,-0.2365655072882816 +hmrc/state_pension_count_income_band_100_000_to_150_000@2025,hmrc_spi,74000.0,73968.48151302338,74083.94567298889,-0.00042592549968410183,0.001134400986336373,0.07084754866522713 +hmrc/state_pension_count_income_band_12_570_to_15_000@2025,hmrc_spi,1140000.0,1134548.6955971718,1134636.439702034,-0.004781845967393172,-0.0047048774543561435,-0.007696851303702883 +hmrc/state_pension_count_income_band_150_000_to_200_000@2025,hmrc_spi,21000.0,21076.303547859192,21036.434980392456,0.0036335022790091377,0.0017349990663074312,-0.18985032127017065 +hmrc/state_pension_count_income_band_15_000_to_20_000@2025,hmrc_spi,2050000.0,2048606.901837158,2045081.9775728807,-0.0006795600794351137,-0.0023990353303021046,0.17194752508669908 +hmrc/state_pension_count_income_band_200_000_to_300_000@2025,hmrc_spi,14000.0,13982.514541625977,14033.310676574707,-0.0012489613124302456,0.0023793340410505023,0.11303727286202567 +hmrc/state_pension_count_income_band_20_000_to_30_000@2025,hmrc_spi,2320000.0,2318867.7951540947,2316376.5817723274,-0.00048801933013159656,-0.0015618182015830072,0.10737988714514106 +hmrc/state_pension_count_income_band_300_000_to_500_000@2025,hmrc_spi,8000.0,8003.899812698364,8016.0708866119385,0.0004874765872955322,0.0020088608264923094,0.15213842391967772 +hmrc/state_pension_count_income_band_30_000_to_40_000@2025,hmrc_spi,1160000.0,1157248.0961830616,1157175.0187387466,-0.0023723308766710346,-0.0024353286734942734,0.006299779682323887 +hmrc/state_pension_count_income_band_40_000_to_50_000@2025,hmrc_spi,568000.0,565906.816724062,566699.9505386353,-0.003685181823834567,-0.002288819474233708,-0.1396362349600859 +hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025,hmrc_spi,3000.0,3004.0203247070312,2993.7835235595703,0.0013401082356770833,-0.0020721588134765623,0.0732050577799479 +hmrc/state_pension_count_income_band_50_000_to_70_000@2025,hmrc_spi,441000.0,436302.3439991841,438974.53312734456,-0.010652281180988467,-0.004592895402846796,-0.605938577814167 +hmrc/state_pension_count_income_band_70_000_to_100_000@2025,hmrc_spi,176000.0,176113.6406710202,175479.15962600708,0.0006456856307965857,-0.0029593203067779543,0.23136346759813686 +hmrc/state_pension_income_band_100_000_to_150_000@2025,hmrc_spi,847000000.0,847427364.7766821,848303808.7041687,0.000504562900451167,0.0015393255066926534,0.10347626062414864 +hmrc/state_pension_income_band_12_570_to_15_000@2025,hmrc_spi,11800000000.0,13033227546.5607,13033212492.867386,0.10451080903056775,0.10450953329384625,-0.00012757367214982773 +hmrc/state_pension_income_band_150_000_to_200_000@2025,hmrc_spi,265000000.0,266009583.33404294,265512754.50858057,0.003809748430350704,0.0019349226738889262,-0.18748257564617776 +hmrc/state_pension_income_band_15_000_to_20_000@2025,hmrc_spi,22200000000.0,25342727509.764053,25326176361.54487,0.14156430224162403,0.14081875502454363,-0.07455472170803945 +hmrc/state_pension_income_band_200_000_to_300_000@2025,hmrc_spi,179000000.0,178828836.30172962,179534540.62778068,-0.0009562217780468184,0.0029862604903948373,0.20300387123480187 +hmrc/state_pension_income_band_20_000_to_30_000@2025,hmrc_spi,24900000000.0,29499726951.278637,29557872946.87977,0.18472799001119025,0.18706317055742042,0.23351805462301645 +hmrc/state_pension_income_band_300_000_to_500_000@2025,hmrc_spi,96000000.0,95667021.17564905,95843214.89340216,-0.003468529420322428,-0.001633178193727508,-0.18353512265949198 +hmrc/state_pension_income_band_30_000_to_40_000@2025,hmrc_spi,12300000000.0,13973223039.1955,13973400701.728178,0.13603439343052842,0.13604883753887625,0.0014444108347833051 +hmrc/state_pension_income_band_40_000_to_50_000@2025,hmrc_spi,6020000000.0,6352584516.144807,6332412976.960441,0.055246597366246986,0.051895843348910405,-0.33507540173365813 +hmrc/state_pension_income_band_500_000_to_1_000_000@2025,hmrc_spi,43000000.0,43037970.99150249,42904568.971734256,0.0008830463140114795,-0.002219326238738243,0.13362799247267634 +hmrc/state_pension_income_band_50_000_to_70_000@2025,hmrc_spi,4660000000.0,4791615583.981081,4785714760.981318,0.028243687549588198,0.026977416519596238,-0.12662710299919597 +hmrc/state_pension_income_band_70_000_to_100_000@2025,hmrc_spi,1890000000.0,1891505349.6346827,1886420716.8490741,0.0007964812881918811,-0.0018938006089554893,0.10973193207636082 +isc.private_school_students@2025,isc,556551.0,556227.3886165619,556125.4962882996,-0.0005814586326106868,-0.0007645367840511282,0.01830781514404414 +obr.attendance_allowance@2025,obr,8492497075.074617,8495117485.085889,8482816736.632687,0.00030855589211356343,-0.0011398695055594961,0.08313136134459327 +obr.carers_allowance@2025,obr,4569403813.760573,4571134406.246751,4570928918.236375,0.0003787348539793825,0.00033376443360262403,-0.004497042037675849 +obr.child_benefit@2025,obr,13389272724.45089,15759391835.595362,15649031340.746838,0.17701626966013373,0.1687738133953518,-0.8242456264781928 +obr.council_tax@2025,obr,50925163826.30539,47022874245.53085,47161572620.27391,-0.07662792394904008,-0.07390435146891754,-0.27235724801225464 +obr.esa@2025,obr,7206287181.538654,6475729628.614429,6509898925.556877,-0.10137780170568216,-0.09663620647339889,-0.47415952322832633 +obr.income_tax@2025,obr,331437583074.4429,289208975664.497,289277484990.5292,-0.1274104373385473,-0.12720373378550823,-0.02067035530390615 +obr.jobseekers_allowance@2025,obr,280558748.04472804,281315294.25617826,280696853.353428,0.0026965696729214336,0.0004922509444544145,-0.2204318728467019 +obr.ni@2025,obr,200081395082.7125,196836566204.77274,196935189863.2001,-0.016217544247921527,-0.015724626561164107,-0.04929176867574207 +obr.ni_employee@2025,obr,49544363784.26465,47811612495.26749,47858392837.82478,-0.03497373175568935,-0.034029520568297854,-0.09442111873914985 +obr.ni_employer@2025,obr,145324007512.71753,146121664326.81866,146176809372.04532,0.005488816526280636,0.005868279260418547,0.03794627341379107 +obr.ni_self_employed@2025,obr,2902816090.4147716,2903289600.529053,2899987872.7277045,0.0001631209486006385,-0.0009743013676980546,0.08111804190974162 +obr.pension_credit@2025,obr,6146422389.476461,6146934201.258123,6135357481.668367,8.326986810055244e-05,-0.0018002192343693627,0.17169493662688104 +obr.pip@2025,obr,36910059270.5278,36900612286.28908,36925162975.16164,-0.0002559460598392224,0.00040920293633597463,0.015325687649675224 +obr.sdlt@2025,obr,15406516698.785578,15467288072.986925,15428332402.652102,0.003944523956290371,0.0014160049473248791,-0.25285190089654913 +obr.state_pension@2025,obr,146185954351.57382,137018135866.62624,137856714380.9764,-0.06271340174651249,-0.05697701949235002,-0.5736382254162474 +obr.statutory_maternity_pay@2025,obr,3194800881.520547,3195978838.32002,3189762668.959949,0.00036871055291328326,-0.0015770036216466764,0.12082930687333931 +obr.tv_licence_fee@2025,obr,3872000000.0,3873761399.8596377,3872382206.1125503,0.000454906988542804,9.871025634045935e-05,-0.03561967322023447 +obr.vat@2025,obr,180168938685.41794,192246685136.8141,188915490408.41504,0.06703567518086105,0.048546390886327666,-1.8489284294533386 +obr.winter_fuel_allowance@2025,obr,1911040880.4619167,1911426611.002743,1910612883.536038,0.00020184316555964303,-0.000223960110039777,0.002211694448013397 +ons.household_composition.couple_3_plus_children_households@2025,ons_household_composition,931000.0,930534.1579246521,931079.7128439706,-0.0005003674278709993,8.56206702154978e-05,-0.041474675765550154 +ons.household_composition.couple_no_children_households@2025,ons_household_composition,8119000.0,8127232.394597758,8122550.28512754,0.0010139665719617697,0.00043728108480602524,-0.05766854871557444 +ons.household_composition.couple_non_dependent_children_only_households@2025,ons_household_composition,1848000.0,1848949.091872692,1848643.6012821198,0.0005135778531883702,0.0003482690920561423,-0.016530876113222792 +ons.household_composition.couple_under_3_children_households@2025,ons_household_composition,5439000.0,5435166.614212768,5437756.176064661,-0.00070479606310569,-0.0002286861436549416,-0.04761099194507484 +ons.household_composition.lone_households_over_65@2025,ons_household_composition,4254000.0,4252432.091497421,4248398.414824963,-0.00036857275566025747,-0.0013167807181564137,0.09482079624961563 +ons.household_composition.lone_households_under_65@2025,ons_household_composition,4316000.0,4318892.271175861,4322439.578588963,0.0006701277052505465,0.0014920246962378486,0.08218969909873021 +ons.household_composition.lone_parent_dependent_children_households@2025,ons_household_composition,1835000.0,1836541.8386135101,1837227.925176859,0.0008402390264360391,0.0012141281617759684,0.03738891353399292 +ons.land.corporate_land_value@2025,ons_land,2103053000000.0,2104176810488.435,2103604690730.7883,0.0005343709780186512,0.00026232849613791475,-0.02720424818807365 +ons.land.household_land_value@2025,ons_land,4559831000000.0,4565947015244.548,4563374916325.898,0.0013412811230389572,0.000777203437122656,-0.056407768591630124 +ons.land.land_value@2025,ons_land,7117771000000.0,6670123826357.194,6666979607884.736,-0.0628914829716783,-0.06333322498226814,0.044174201058982954 +ons.population.age_0_9_by_region@2025,ons_population,7553013.0,7548459.472192787,7548722.283398651,-0.0006028756745438365,-0.0005680801292609205,-0.0034795545282915942 +ons.population.age_10_19_by_region@2025,ons_population,8331437.0,8333422.468993913,8332644.024840746,0.0002383105092090815,0.00014487594886045167,-0.009343456034862982 +ons.population.age_20_29_by_region@2025,ons_population,8715225.0,8720363.863340972,8720482.013663668,0.0005896420736093436,0.000603198846119083,0.0013556772509739409 +ons.population.age_30_39_by_region@2025,ons_population,9572397.0,9578059.739127213,9568319.801818706,0.0005915696065690898,-0.0004259328338862152,-0.01656367726828746 +ons.population.age_40_49_by_region@2025,ons_population,8622506.0,8628194.977913845,8626453.783576507,0.0006597824244883484,0.00045784642846373447,-0.02019359960246139 +ons.population.age_50_59_by_region@2025,ons_population,9036816.0,9042277.203098414,9045035.894011678,0.0006043282388857387,0.0009096006836565195,0.030527244477078084 +ons.population.age_60_69_by_region@2025,ons_population,7861034.0,7861485.1418612115,7860634.059489641,5.738963362981365e-05,-5.0876323694651546e-05,-0.0006513309935162106 +ons.population.age_70_79_by_region@2025,ons_population,5998605.0,6000614.517294719,5998942.530552461,0.0003349974360236895,5.6268174427356365e-05,-0.027872926159633316 +ons.population.age_80_89_by_region@2025,ons_population,2965168.0,2966814.0157957296,2963996.148547109,0.0005551172128289488,-0.00039520575322908634,-0.01599114595998625 +ons.population.female_0_4@2025,ons_population,1744355.0,1743699.807838207,1743168.7396233138,-0.00037560712228467785,-0.0006800567411371139,0.030444961885243604 +ons.population.female_10_14@2025,ons_population,2052052.0,2052205.282996416,2051795.0773920142,7.469742307509357e-05,-0.00012520277653090215,0.005050535345580857 +ons.population.female_15_19@2025,ons_population,2002835.0,2004860.128251325,2003983.0051205268,0.0010111308476859584,0.0005731900633485866,-0.04379407843373718 +ons.population.female_20_24@2025,ons_population,2034609.0,2037147.6792116165,2036555.1377780382,0.0012477479513835416,0.0009565168433041233,-0.029123110807941832 +ons.population.female_25_29@2025,ons_population,2291610.0,2292759.5235373974,2291465.6625120216,0.0005016226746249949,-6.298518856978066e-05,-0.043863748605521426 +ons.population.female_30_34@2025,ons_population,2463301.0,2463948.0245893113,2463085.207978487,0.0002626656625850156,-8.760278240985784e-05,-0.017506288017515775 +ons.population.female_35_39@2025,ons_population,2472291.0,2473338.7593197986,2471379.8381912,0.0004238009683320269,-0.00036854957964088864,-0.005525138869113828 +ons.population.female_40_44@2025,ons_population,2333109.0,2334914.0438110065,2334637.1026509395,0.0007736645870409276,0.0006549641062374227,-0.011870048080350488 +ons.population.female_45_49@2025,ons_population,2088285.0,2089847.22929223,2089528.1243758958,0.0007480919952161616,0.0005952848274521102,-0.015280716776405148 +ons.population.female_50_54@2025,ons_population,2255231.0,2257543.0681118965,2257976.108002578,0.0010252023459665616,0.0012172181042996962,0.01920157583331346 +ons.population.female_55_59@2025,ons_population,2360202.0,2360934.607371209,2361993.0836861883,0.00031040028404737786,0.000758868811308663,0.04484685272612852 +ons.population.female_5_9@2025,ons_population,1941658.0,1940220.2585179806,1940357.8192880154,-0.0007404710211682101,-0.0006696239564251966,-0.007084706474301355 +ons.population.female_60_64@2025,ons_population,2193915.0,2193132.0257413387,2194246.8747710334,-0.00035688450038459565,0.00015127056929434992,-0.02056139310902457 +ons.population.female_65_69@2025,ons_population,1838574.0,1840358.8587129172,1838558.82406044,0.0009707842670010528,-8.254190236529247e-06,-0.09625300767645235 +ons.population.female_70_74@2025,ons_population,1622996.0,1621609.9994883537,1621519.268737793,-0.0008539765419300298,-0.0009098797915749831,0.005590324964495331 +ons.population.female_75_79@2025,ons_population,1551183.0,1552933.98634199,1553046.769363917,0.0011288070730468712,0.001201514820570458,0.007270774752358685 +ons.population.female_80_84@2025,ons_population,1024480.0,1024766.7017660249,1023252.0092911829,0.0002798510132212691,-0.0011986478104181104,0.09187967971968412 +ons.population.female_85_89@2025,ons_population,665267.0,664940.6974301338,665210.8195628271,-0.0004904836251703157,-8.444795423924449e-05,-0.04060356709310712 +ons.population.female_90_plus@2025,ons_population,414716.0,414769.0346069336,414773.7953701019,0.0001278817478312719,0.00013936132221069048,0.0011479574379418597 +ons.population.male_0_4@2025,ons_population,1829801.0,1829108.9949276554,1828379.686600219,-0.0003781859734170875,-0.0007767584561277469,0.03985724827106594 +ons.population.male_10_14@2025,ons_population,2152800.0,2152375.857488394,2152309.54913353,-0.00019701900390478282,-0.00022781998628303298,0.003080098237825016 +ons.population.male_15_19@2025,ons_population,2123750.0,2123981.200257778,2124556.3931946754,0.00010886415904798951,0.0003797025048501215,0.027083834580213198 +ons.population.male_20_24@2025,ons_population,2131646.0,2133220.850448011,2133277.699726614,0.0007387954885618696,0.0007654646815719729,0.002666919301010334 +ons.population.male_25_29@2025,ons_population,2257360.0,2257235.8101439476,2259183.5136469947,-5.501552966846169e-05,0.0008078080797899836,0.07527925501215219 +ons.population.male_30_34@2025,ons_population,2333326.0,2334199.291704178,2331995.9773750305,0.00037426904949323686,-0.0005700114878801687,0.019574243838693182 +ons.population.male_35_39@2025,ons_population,2303479.0,2306573.663513926,2301858.7782739885,0.0013434737255802454,-0.0007033802895583094,-0.0640093436021936 +ons.population.male_40_44@2025,ons_population,2196013.0,2197786.6315259933,2195449.743415176,0.0008076598480944089,-0.0002564905512053266,-0.05511692968890823 +ons.population.male_45_49@2025,ons_population,2005099.0,2005647.0732846146,2006838.813134496,0.0002733397625825949,0.0008676943804251562,0.059435461784256134 +ons.population.male_50_54@2025,ons_population,2164862.0,2165640.8346800804,2166320.062389802,0.0003597618139541522,0.0006735128566172752,0.0313751042663123 +ons.population.male_55_59@2025,ons_population,2256521.0,2258158.6929352283,2258746.6399331093,0.0007257601126815784,0.0009863147442941073,0.026055463161252897 +ons.population.male_5_9@2025,ons_population,2037199.0,2035430.410908943,2036816.037887102,-0.0008681474372689942,-0.0001879846362078555,-0.06801628010611388 +ons.population.male_60_64@2025,ons_population,2094462.0,2093618.0714159012,2095362.2053232193,-0.00040293334713106083,0.0004298026525280952,0.002686930539703438 +ons.population.male_65_69@2025,ons_population,1734083.0,1734376.1859910544,1732466.1553349495,0.00016907264015298044,-0.0009323917396402056,0.07633190994872252 +ons.population.male_70_74@2025,ons_population,1473758.0,1473803.7468049526,1474650.7112116814,3.1040920526043934e-05,0.0006057379920457538,0.057469707151970986 +ons.population.male_75_79@2025,ons_population,1350668.0,1352266.7846594225,1349725.7812390695,0.0011836992209946992,-0.0006975946427474904,-0.04861045782472088 +ons.population.male_80_84@2025,ons_population,815910.0,816995.0910081972,816715.9077620615,0.0013299150742081443,0.0009877410033722533,-0.0342174070835891 +ons.population.male_85_89@2025,ons_population,459511.0,460111.52559137344,458817.4119310379,0.0013068796859562527,-0.0015094047127535515,0.020252502679729882 +ons.population.male_90_plus@2025,ons_population,210520.0,210449.15379333496,210098.8139667511,-0.0003365295775462619,-0.0020006936787426437,0.16641641011963818 +ons.population.scotland_babies_under_1@2025,ons_population,46776.0,46753.46699523926,46650.48211669922,-0.0004817214973649347,-0.0026833821468441347,0.22016606494792 +ons.population.scotland_children_under_16@2025,ons_population,896833.0,895881.6839752197,894863.0286102295,-0.0010607504683483697,-0.0021965866440803446,0.11358361757319749 +ons.population.uk_total@2025,ons_population,69281437.0,69304909.58801906,69290103.14923601,0.0003388005364129227,0.00012508616465343414,-0.021371437175948856 +ons.public_sector_employment@2025,ons_employment,6146000.0,6140910.768561363,6143860.296098232,-0.0008280558800255092,-0.00034814576989387094,-0.04799101101316383 +scotgov.council_tax_stock.band_a@2025,council_tax_stock,498707.0,497793.0453109741,498474.34790802,-0.0018326486073503658,-0.0004665105803206702,-0.13661380270296955 +scotgov.council_tax_stock.band_b@2025,council_tax_stock,583705.0,584170.3162002563,581630.644203186,0.0007971769990943159,-0.0035537742469465994,0.2756597247852283 +scotgov.council_tax_stock.band_c@2025,council_tax_stock,426388.0,425280.1085510254,425186.0961608887,-0.002598317609723091,-0.0028188031537269534,0.022048554400386222 +scotgov.council_tax_stock.band_d@2025,council_tax_stock,369621.0,368587.2019920349,368700.5122909546,-0.0027969136168266625,-0.0024903555508085586,-0.030655806601810394 +scotgov.council_tax_stock.band_e@2025,council_tax_stock,366881.0,367981.4059123993,365745.9590911865,0.0029993537752003837,-0.003093757672960651,0.009440389776026745 +scotgov.council_tax_stock.band_f@2025,council_tax_stock,221282.0,220549.76114463806,221041.26977157593,-0.0033090755477713438,-0.0010878888857840776,-0.2221186661987266 +scotgov.council_tax_stock.band_g@2025,council_tax_stock,142084.0,141802.03342437744,141480.20031356812,-0.0019845061767866795,-0.004249596621941139,0.22650904451544593 +scotgov.council_tax_stock.band_h@2025,council_tax_stock,14481.0,14489.340209960938,14445.208251953125,0.0005759415759227608,-0.002471635111309647,0.18956935353868862 +scotgov.council_tax_stock.total@2025,council_tax_stock,2623149.0,2620653.2127456665,2616704.237991333,-0.0009514470029470289,-0.002456879883173618,0.1505432880226589 +scotgov.scottish_child_payment_spending@2025,scotgov_social_security,471000000.0,471340018.6017812,470980100.84276366,0.0007219078594080455,-4.224874147842391e-05,-0.06796591179296216 +slc.borrowers.plan_5_above_threshold@2025,slc_borrowers,35000.0,35015.98388671875,35081.273193359375,0.0004566824776785714,0.0023220912388392857,0.18654087611607142 +slc.repayments.england_plan_1@2025,slc_repayments,1852699178.55,1850754153.6308398,1848829124.2502878,-0.0010498330984754826,-0.0020888735443500587,0.10390404458745761 +slc.repayments.england_plan_2@2025,slc_repayments,2778253361.64,2777872810.1758494,2783404384.285944,-0.00013697507556538675,0.0018540507201630723,0.17170756445976856 +slc.repayments.england_total_higher_education@2025,slc_repayments,5018231834.949999,5016466956.444836,5021850511.156866,-0.00035169329819947985,0.0007211058248972418,0.036941252669776194 +slc.support.adult_dependants_grant_recipients@2025,slc_student_support,18611.0,15676.6904296875,15762.217529296875,-0.1576653361083499,-0.15306982272328865,-0.4595513385061256 +slc.support.adult_dependants_grant_spend@2025,slc_student_support,55364916.81,55573867.57324219,55877061.14135742,0.0037740644307162484,0.009250340483938307,0.5476276053222059 +slc.support.maintenance_loan_recipients@2025,slc_student_support,1159761.0,1164623.2449188232,1158359.0033187866,0.004192454237401708,-0.0012088668968980496,-0.2983587340503658 +slc.support.maintenance_loan_spend@2025,slc_student_support,8591659718.080004,8628531693.376953,8576016578.514992,0.0042916009836093975,-0.0018207354665237816,-0.24708655170856156 +slc.support.parents_learning_allowance_recipients@2025,slc_student_support,99645.0,90431.08807373047,90318.60095214844,-0.09246737845621487,-0.09359625719154561,0.11288787353307406 +slc.support.parents_learning_allowance_spend@2025,slc_student_support,181421659.32,183032522.26123047,182804848.32714844,0.008879110395463645,0.007624166884664589,-0.12549435107990564 +voa.council_tax_stock.band_a@2025,council_tax_stock,6103320.0,6107296.999644431,6106488.17078698,0.0006516125067063968,0.0005190897391877876,-0.013252276751860914 +voa.council_tax_stock.band_b@2025,council_tax_stock,5016580.0,5023958.854512419,5019941.210148968,0.0014708934199033246,0.0006700202426688706,-0.0800873177234454 +voa.council_tax_stock.band_c@2025,council_tax_stock,5654450.0,5656055.638030529,5659464.145677079,0.0002839600722491175,0.0008867609895002072,0.060280091725108974 +voa.council_tax_stock.band_d@2025,council_tax_stock,4035220.0,4035927.0324764946,4034540.265619569,0.00017521534798463392,-0.00016845038942883104,-0.000676495855580288 +voa.council_tax_stock.band_e@2025,council_tax_stock,2528140.0,2527976.882118713,2525878.8736705044,-6.45209052057597e-05,-0.0008943833527793444,0.08298624475735847 +voa.council_tax_stock.band_f@2025,council_tax_stock,1343220.0,1345912.8241853714,1344068.872639656,0.0020047528963024665,0.0006319684338053832,-0.13727844624970834 +voa.council_tax_stock.band_g@2025,council_tax_stock,911160.0,912219.1403989792,910256.6156177521,0.001162408796456371,-0.0009914662433029597,-0.01709425531534114 +voa.council_tax_stock.band_h@2025,council_tax_stock,154470.0,154569.6538925171,154799.60537719727,0.0006451342818481895,0.002133782463891148,0.14886481820429584 +voa.council_tax_stock.total@2025,council_tax_stock,25746570.0,25763917.025259446,25755437.759537708,0.0006737606313946422,0.0003444248899060346,-0.03293357414886076 diff --git a/docs/uk-cgt-observation-year-875.md b/docs/uk-cgt-observation-year-875.md new file mode 100644 index 000000000..aa02d23fd --- /dev/null +++ b/docs/uk-cgt-observation-year-875.md @@ -0,0 +1,124 @@ +# CGT observation year and individual scope + +The FY2024–25 dataset uses HMRC's three individual observations for that year: +551,000 taxpayers, £119.258bn gains and £22.503bn liability. Calibration remains +indexed at 2025 and exported source data remains dated 2024. The contract pins +exact Chronicle keys, individual scope and `tax_year: 2024`; trust-inclusive +national totals cannot satisfy these references. + +`measurement_period: 2024` forces the CGT outcome calculation to use 2024 rather +than the default calibration period, and disables the stored-column shortcut. +The dated aliases bind a variable and year, refuse a mismatched binding, and may +not be persisted in the source H5. Gains and the taxpayer proxy share the 2024 +annual exempt amount (£3,000) and gains array. The proxy selects gains above the +allowance; it does not identify every administrative taxpayer below that +threshold. The gains input is net of losses before the allowance; the aggregate +binding makes no additional loss or allowance deduction. + +## Observed-year fit and cash diagnostic + +For this accepted FY2024–25 deliverable, the three published individual +observations replace the former trust-inclusive gains/count and OBR cash fit. +This explicitly supersedes the former FY2025–26 solve disposition described in +[#875](https://github.com/PolicyEngine/microcosm/issues/875) **for this observed-year +acceptance unit**. The historical issue body and earlier deliverable remain part +of the record; a scoped decision record does not close the issue or settle the +general self-assessment liability-to-cash translation. +The forward-year reconciliation remains separate work. + +The unchanged March 2026 OBR FY2025–26 cash forecast (£21.801546197bn) remains a +separately pinned diagnostic outside fitting. Its exact key, fiscal year, +source-projection assertion, value and source survive when the fact is available. +Absent, incompatible or duplicate diagnostic data produces explicit `unavailable` +metadata, the expected identity and a reason, with no numeric substitute. It does +not remove any independently valid HMRC observation. A malformed committed +cash declaration remains a compilation error; so do missing, duplicate or +incompatible fitted HMRC observations. No cash row returns to the matrix. + +The former active `obr.capital_gains_tax@2025` fit exemption is retired because +that row is no longer fitted. Its exact historical reason, approver, +adjudication and dates are preserved in the +[aggregate evidence](evidence/uk-cgt-889/calibration-comparison.json). +This retirement creates no new human signature, renewal or expiry. Merged #892 +independently retired the five UC/pension fit exemptions. Their composition with +this PR leaves the active target-fit exemption register empty; gate thresholds +are unchanged and HMRC liability has no exemption. + +The recorded 9b5/cc9 comparison used 366 targets across 21 families. With `family_equal`, +OBR has 19 rows instead of 20 and `hmrc_cgt` has three instead of two. Each retained +OBR row changes from weight 1/420 to 1/399; gains/count change from 1/42 to 1/63; +the replacement tax row changes from 1/420 to 1/63. These 22 changes follow family +membership. The comparison therefore combines dating, individual scope, liability +comparator and objective weighting; it is not an isolated causal year effect. + +**Applicability, 10 September 2026:** this PR is rebased onto main `45231f9e`, +which preserves #892 and #877 from the `141bface` feature baseline. The later +#899 changes only CI run scheduling and its documentation. Main's two additional +UC payment-tail measure exclusions reduce the expected default fitted roster to +364 of 415 references. +Those exclusions apply before solving and are distinct from target-fit exemptions. +The original 366-row objective, fitted weights and failed gate maps remain +historical evidence. No fit or gate certification on the rebased head is claimed. + +## Dating, revision and materialization + +The #881 `year_rule` mechanism resolves release-relative survey/calibration years +for source construction, policy lookups and predictor materialization. A fixed +administrative observation must keep its date when the release advances, so its +`measurement_period` is a separate target contract. A future shared generic +variable/period resolver may simplify the implementation; automatically replacing +2024 with the survey year would change the present observation's meaning. + +The provisional HMRC observations use exact aggregate keys. A different-key +revision alongside the old observation leaves the old key selected. Removing the +pinned key or duplicating it fails compilation. The authoring field +`matched_fact_count_at_or_before_period` is descriptive metadata, not a runtime +revision guard. A lone altered value under the same key is accepted by the +compiler if artifact verification is bypassed; immutable facts and manifest +hashes prevent that alteration in the authenticated build path. + +To adopt a revision, authenticate a new Chronicle artifact, review its year, +population and values, deliberately update changed keys and feed hashes, and +regenerate references, membership, relevant public fixtures and parity receipts. +Rerun strict-selection, real-feed and dated-export checks; refresh numerical +evidence if fitted values change. Never loosen selectors to choose the latest +publication silently. + +Both national and local paths resolve the dated arrays before materialization. +The rowwise builder resolves each block, aligns by entity IDs, injects the alias +columns and then builds the target matrix. Scoring uses the same resolve/inject +route. The adapter's refusal of an unresolved alias is intentional. The national +and local parametrized integration tests exercise the real resolver with distinct +2024/2025 outcomes, fit weights and restore the original base-year HDF columns; +a separate UK2.97 engine case verifies the calculation date. The source-column +restoration does not reverse the fitted weights. These tests do not certify a +full local calibration. + +## Source, dependency and evidence boundary + +The lock remains PolicyEngine-UK 2.97.0 / Core 3.31.0. National targets use Chronicle +`ec7169b5db40b9f54117c80f70f14efc1dd0fedd`; local targets retain the separate `6fb700e` +artifact. The four CGT/OBR facts are identical across those feeds. The #891 paid +UC source windows and family classification, and #892's explicit monthly-window +metadata, are preserved. + +Source Tables 2/3 remain the 2025 publication's FY2023–24 distribution, mapped into +the 2024 build. Donor selection, carrier count, gain amounts, ages and geography +are unchanged. Older source-stage prose describes the preceding two-target or +trust-inclusive surface; the current target contract controls the three fitted +individual observations. Distribution fences remain active. No source-vintage, +tail, age or liability-model repair is implemented here. + +Merged [#892](https://github.com/PolicyEngine/microcosm/pull/892) supplies the #883 +graph prerequisite, its serialized fixture and the claimant-role regression. +The rebase drops this PR's duplicate prerequisite commits and retains the upstream +coverage. Merged #877's size-selection and checkpoint behavior, corrected local +private-rent target composition and attested calibration identities are also +preserved. This PR does not claim a new source build or full local calibration. + +The [historical matched comparison](../experiments/889-cgt-observation-year.md) +records the 9b5/ec7 candidate and cc9/ec7 control on the identical source. Its +£108.032bn gains remain 9.41% below HMRC, despite liability and taxpayer totals +being close. Both that comparison and the older 30479731/6fb comparison retain +their original code and target-surface provenance. Neither historical national +fit, diagnostic export nor unit tests certify a releasable dataset. diff --git a/experiments/889-cgt-observation-year.md b/experiments/889-cgt-observation-year.md new file mode 100644 index 000000000..048dd893a --- /dev/null +++ b/experiments/889-cgt-observation-year.md @@ -0,0 +1,128 @@ +# Observed FY2024–25 CGT calibration comparison + +In the recorded 9b5/cc9 comparison, the observed-year contract brings taxpayer +count and liability close to the individual HMRC observations, while gains remain +9.41% low. These are historical national fits on one unchanged source H5. They +combine the measurement-year correction, +individual scope, liability comparator and automatic family weighting changes; +they do not isolate the effect of any one change. + +**Applicability, 10 September 2026:** the rebase onto main `45231f9e` preserves +merged #892 and #877 from the `141bface` feature baseline. The later #899 changes +only CI run scheduling and its documentation. The original JSON, CSV, 366-row +objective and gate maps below remain unchanged. Main now declares 51 measure +exclusions, giving an expected 364-row default fitting surface, and the combined +target-fit exemption register is empty. The old two empty-band and five +stale-exemption failures are historical +run outcomes, not a verdict for the rebased surface. No current-head paired fit, +unchanged fitted weights, release-gate pass or full local calibration is claimed. + +| Common FY2024–25 individual measure | HMRC target | Under control weights | Under candidate weights | Control error | Candidate error | +| --- | ---: | ---: | ---: | ---: | ---: | +| Taxpayers | 551,000 | 583,538.709 | 551,037.296 | +5.9054% | +0.0068% | +| Gains (£bn) | 119.258 | 127.484860 | 108.031570 | +6.8984% | −9.4136% | +| Liability (£bn) | 22.503 | 26.986389 | 22.653870 | +19.9235% | +0.6704% | + +Both columns evaluate the same captured 2024 outcomes. The control's native 2025 +cash-target error is a different comparison and is not substituted into this +table. Cash receipts have different timing and population scope from disposal-year +individual liability. + +The [JSON receipt](../docs/evidence/uk-cgt-889/calibration-comparison.json) contains +full-precision values, exact HMRC and OBR identities, options, hashes, original +gate results, concentration metrics and all 22 changed objective weights. The +[363-row CSV](../docs/evidence/uk-cgt-889/target-comparison.csv) contains every +unchanged non-CGT target, both estimates and both errors. Every corresponding +non-CGT target value and household coefficient row was checked identical. + +## Trade-offs and remaining gates + +Gains' absolute error worsens from 6.90% to 9.41%; being just inside the 10% +diagnostic threshold does not establish an adequate gains model. Household ESS +falls from 14,049.762 to 13,725.441. Among the same 707 gain-above-allowance carriers, +ESS falls from 490.704 to 384.586. The 692 FRS origin groups do not imply 692 +independent CGT donors. These fits remain sensitive to their limited support. + +Among 363 non-CGT rows, the number within 10% rises from 347 to 348, and both fits +have 361 within 25%; neither threshold gains a new miss. The two empty childless +couple UC payment bands remain at −100%. Both original runs exit with a failed +terminal gate and no staged calibrated H5. Five stale UC/pension exemptions also +appear in both original failure receipts. Their disposition is separate from +this PR's retirement of the dormant OBR cash exemption. Original failed receipts +are preserved, including the historical dormant OBR entry in the candidate. + +The diagnostic HDF audit verifies all 218 original person/benefit-unit/household +columns and exact captured fitted weights at base period 2024. That audit is not +a passing release export. The local integration tests cover the resolver and +HDF route on synthetic cases; no full local calibration is certified here. + +## Scoped supersession and historical record + +For the accepted FY2024–25 release, three individual observations are the fitted +CGT acceptance unit. This supersedes #875's previous FY2025–26 fit disposition +only for that observed-year deliverable. The OBR March 2026 FY2025–26 forecast +remains unchanged as optional diagnostic provenance, with explicit unavailable +status if its exact fact cannot be used. No general payment-lag translation, +forward-year gains level or replacement distribution prior is inferred. + +The JSON receipt archives the exact former `obr.capital_gains_tax@2025` signed +exemption, including its original reason, approver and approval/expiry dates. +This PR retires that entry; merged #892 independently retired the other five +fit exemptions, so the combined active register is empty. HMRC liability has no +exemption. This records a scoped implementation disposition without a new human +signature or closure of #875's reconciliation work. The historical issue body and +signed ruling remain intact alongside any scoped follow-up decision record. + +The frozen incumbent parity fixture remains historical evidence. Current signed +differences identify the new individual values, the added HMRC liability row and +the cash row absent from the fit; they do not overwrite the incumbent's values. +The original national calibration battery excludes release-cut-owned compile +parity. The new real-feed 2023/2025 compile-parity checks are separate validation; +the recorded national fits do not establish parity or current release readiness. + +## Provenance and reproduction + +Numerical candidate: `9b5ac7c52f8a3742940674dd2b58a7595ea24db6`. +Control: `cc9c953c72b003406f4aeec8ae5e82bd211099bc`. +Source H5 SHA256: +`03a63ecc1d0b3064d42e8b412fa4a28c587a79bd153ff2ffebc2715f4b316e33`. +Both use UK 2.97.0, Core 3.31.0 and the same locked environment; the receipt records +the full lock and installed-version identities. National Chronicle is `ec7169b5`: +facts `4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5`, +manifest `a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f`. +Local Chronicle remains independently pinned to `6fb700e`. + +Both solves use 1,500 Adam updates, learning rate 0.02, seed 0, `family_equal`, +free household mass, cap 10, no sparsity penalty and `best_feasible_loss` iterate +selection (control epoch 1333; candidate 1422). The defaults are not overridden +in the library. These recorded runs used 366 targets and 21 families. +Under this treatment, 19 retained OBR weights change from 1/420 to 1/399; +gains/count change from 1/42 to 1/63; cash-to-liability changes from 1/420 to 1/63. + +A reviewer with authorized access to the exact source can use +`tools/calibrate_uk_national_dataset.py` in the two pinned checkouts, with the +recorded H5 and Chronicle SHA arguments, `--epochs 1500 --learning-rate 0.02 +--target-weight-rule family_equal --target-loss-cap 10`, separate output paths +and non-release identifiers. The two runs must start from identical household +IDs and initial weights. Preserve the original gate failures; do not bypass +them to obtain an apparent passing release. Private saved matrices/weights are +identified by SHA in the receipt and are not published here. + +For public contract verification, authenticate the national artifact against its +committed manifest, run `tools/build_uk_ledger_compile_parity_signed_differences.py +--surface national --ledger-facts --output-dir `, +and compare the two national receipts. The full-feed test also applies the real +2023 and 2025 compile-parity gates. National and local reference regeneration +must each use their own authenticated feed. The committed CSV and JSON expose +full-precision estimates, targets, errors and concentration statistics for audit. +Recomputing weighted outcomes or ESS from microdata requires the authenticated +private captures; those records are not included in this public receipt. + +Post-run review repairs alter optional diagnostic availability, the active +exemption register, parity explanations, tests and documentation. They preserve +the captured source and numerical result arrays. The subsequent main rebase also +inherits a changed current fitting surface and calibration source identities; +these historical results do not establish current-head numerical equivalence. +Both the original 30479731/6fb run and the 9b5/cc9 comparison remain historical. +Source-vintage, age support, tail allocation and the generic liability mechanism +remain separate, unimplemented follow-ups. diff --git a/packages/microcosm-build/src/microcosm/build/target_materialization.py b/packages/microcosm-build/src/microcosm/build/target_materialization.py index 592774add..2629e4507 100644 --- a/packages/microcosm-build/src/microcosm/build/target_materialization.py +++ b/packages/microcosm-build/src/microcosm/build/target_materialization.py @@ -152,6 +152,9 @@ def resolve_target_measures( source frame rather than on the restored output. """ + validate_period = getattr(provider, "validate_period", None) + if callable(validate_period): + validate_period(period) contract = _measure_resolution_contract( registry, provider, contract_targets=contract_targets ) @@ -484,12 +487,16 @@ def materialize_target_bindings( ) skipped: list[MaterializationSkip] = [] for spec in registry.specs: - if hasattr(adapter, "has_column") and adapter.has_column( - spec.entity, spec.measure - ): - continue contract_target_id = spec.metadata.get("contract_target_id") target = contract_targets.get(str(contract_target_id)) + binding = target["bindings"]["policyengine"] if target is not None else {} + if ( + hasattr(adapter, "has_column") + and adapter.has_column(spec.entity, spec.measure) + and "measurement_period" not in binding + and not binding.get("require_matching_fact_period") + ): + continue if target is None: skipped.append( MaterializationSkip( @@ -499,14 +506,23 @@ def materialize_target_bindings( ) ) continue - binding = target["bindings"]["policyengine"] + # A period-constrained binding must validate its fact and prepare again. + # A pre-existing column has no period provenance and may be stale. kind = binding.get("kind") try: + measurement_period = binding.get("measurement_period", period) + if binding.get("require_matching_fact_period") and str( + spec.metadata.get("ledger_fact_period") + ) != str(measurement_period): + raise ValueError( + f"observation period {spec.metadata.get('ledger_fact_period')!r} " + f"does not match declared measurement period {measurement_period}" + ) if kind: provider = provider_registry.get(str(kind)) if provider is None: raise ValueError(f"unsupported binding kind {kind!r}") - values = provider(adapter, binding, period) + values = provider(adapter, binding, measurement_period) else: band = None if binding.get("groupby_variable"): 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 95d9a7109..560699408 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 @@ -2,10 +2,10 @@ "compiled_count": 415, "counts_by_kind": { "calibration_drift": 172, - "fixture_only": 267, - "ledger_only": 45 + "fixture_only": 268, + "ledger_only": 46 }, - "difference_count": 484, + "difference_count": 486, "differences": [ { "fixture_value": 1608000.0, @@ -322,6 +322,13 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "fixture_value": 21801546197.09165, + "kind": "fixture_only", + "name": "obr.capital_gains_tax", + "period": 2025, + "reason": "PR #889 retains the exact March 2026 OBR FY2025-26 cash forecast as diagnostic provenance outside the FY2024-25 observation fit. The frozen incumbent fixture keeps its fitted cash row, so it is fixture-only on the current surface. This scoped change does not settle the general liability-to-cash translation tracked by #875." + }, { "fixture_value": 44117237614.71528, "kind": "fixture_only", @@ -2016,6 +2023,13 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 22503000000.0, + "name": "hmrc.cgt.liability_total", + "period": 2025, + "reason": "PR #889 adds HMRC FY2024-25 individuals-only liability of GBP 22,503,000,000 to the observed-year fit. The historical fixture has no equivalent liability row; this is a declared ledger-only observation, not a cash-receipts reconciliation." + }, { "kind": "ledger_only", "ledger_value": 1800000000.0, @@ -2202,82 +2216,82 @@ { "fixture_value": 6700000.0, "kind": "calibration_drift", - "ledger_value": 6758888.888888889, + "ledger_value": 6197311.0, "name": "dwp.uc.households", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 1222944.0, "kind": "calibration_drift", - "ledger_value": 1278537.0, + "ledger_value": 1190123.8333333333, "name": "dwp.uc.households_children_1", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 1058967.0, "kind": "calibration_drift", - "ledger_value": 1100617.5555555555, + "ledger_value": 1049895.5, "name": "dwp.uc.households_children_2", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 473500.0, "kind": "calibration_drift", - "ledger_value": 494553.22222222225, + "ledger_value": 477887.6666666667, "name": "dwp.uc.households_children_3", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 166790.0, "kind": "calibration_drift", - "ledger_value": 174668.88888888888, + "ledger_value": 170713.66666666666, "name": "dwp.uc.households_children_4", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 75910.0, "kind": "calibration_drift", - "ledger_value": 77376.77777777778, + "ledger_value": 76320.08333333333, "name": "dwp.uc.households_children_5_or_more", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 231368.0, "kind": "calibration_drift", - "ledger_value": 284345.55555555556, + "ledger_value": 241130.91666666666, "name": "dwp.uc.households_couple_no_children", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 839379.0, "kind": "calibration_drift", - "ledger_value": 899534.6666666666, + "ledger_value": 826160.8333333334, "name": "dwp.uc.households_couple_with_children", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 2868011.0, "kind": "calibration_drift", - "ledger_value": 3446962.0, + "ledger_value": 2990070.1666666665, "name": "dwp.uc.households_single_no_children", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 2156879.0, "kind": "calibration_drift", - "ledger_value": 2226220.0, + "ledger_value": 2138780.1666666665, "name": "dwp.uc.households_single_with_children", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2025 incumbent baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "fixture_value": 14000.0, @@ -3090,18 +3104,18 @@ { "fixture_value": 67727478991.59665, "kind": "calibration_drift", - "ledger_value": 127316000000.0, + "ledger_value": 119258000000.0, "name": "hmrc.cgt.gains_total", "period": 2025, - "reason": "Ledger carries the HMRC 2023-24 outturn value GBP 65,937,000,000 and holds it by identity under the current doctrine; the incumbent Fixture B row is GBP 67,727,478,991.60 at 2025 because it carries a forecast/uprated value. Signed as a doctrine consequence, not a binding error." + "reason": "PR #889 selects HMRC FY2024-25 individuals-only observed gains of GBP 119,258,000,000, measured in 2024 at calibration index 2025. The frozen incumbent fixture retains its historical forecast/uprated GBP 67,727,478,991.60 value. This explicit observation-year and population-scope change does not rewrite the historical fixture." }, { "fixture_value": 378000.0, "kind": "calibration_drift", - "ledger_value": 584000.0, + "ledger_value": 551000.0, "name": "hmrc.cgt.taxpayers_total", "period": 2025, - "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + "reason": "PR #889 selects the HMRC FY2024-25 individuals-only observation of 551,000 taxpayers, measured in 2024 at calibration index 2025. The frozen incumbent fixture retains its historical 378,000 count." }, { "fixture_value": 1236000000.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json index 03601262a..cd4d9c7fb 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 222, + "compiled_count": 230, "counts_by_kind": { "calibration_drift": 12, "fixture_only": 125, - "ledger_only": 198 + "ledger_only": 206 }, - "difference_count": 335, + "difference_count": 343, "differences": [ { "fixture_value": 82000.0, @@ -912,17 +912,73 @@ }, { "kind": "ledger_only", - "ledger_value": 69861000000.0, - "name": "hmrc.cgt.gains_total", + "ledger_value": 6197311.0, + "name": "dwp.uc.households", "period": 2023, - "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "kind": "ledger_only", - "ledger_value": 403000.0, - "name": "hmrc.cgt.taxpayers_total", + "ledger_value": 1190123.8333333333, + "name": "dwp.uc.households_children_1", "period": 2023, - "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 1049895.5, + "name": "dwp.uc.households_children_2", + "period": 2023, + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 477887.6666666667, + "name": "dwp.uc.households_children_3", + "period": 2023, + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 170713.66666666666, + "name": "dwp.uc.households_children_4", + "period": 2023, + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 76320.08333333333, + "name": "dwp.uc.households_children_5_or_more", + "period": 2023, + "reason": "Inherited PR #891 contract with #892 source-window averaging: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 241130.91666666666, + "name": "dwp.uc.households_couple_no_children", + "period": 2023, + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 826160.8333333334, + "name": "dwp.uc.households_couple_with_children", + "period": 2023, + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 2990070.1666666665, + "name": "dwp.uc.households_single_no_children", + "period": 2023, + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." + }, + { + "kind": "ledger_only", + "ledger_value": 2138780.1666666665, + "name": "dwp.uc.households_single_with_children", + "period": 2023, + "reason": "Inherited PR #891 contract: current paid-UC counts use the explicit January-December 2025 source windows on the ec7169 national feed. This compares that declaration with the frozen 2023 production baseline; it does not redatum the observations to the comparison year or create a new year ruling." }, { "kind": "ledger_only", diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json index caf6e5244..1e9d92c1d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json @@ -1,13 +1,5 @@ { "schema_version": 2, "description": "Reviewed target-fit exclusions for the UK terminal battery (schema 2 per #610). Each entry defers one calibration target whose |relative error| breaches the 25% release bound, with the defect diagnosed, tracked, and owned elsewhere; the receipt records the reasoning, approver, adjudication reference, approval date, and expiry. The gate keeps the target BOUND in calibration (exclusion applies to the release fence only, never the solve), reports dormant entries, FAILS stale ones (targets back inside the bound), and FAILS expired ones until the adjudication is renewed, so this register cannot rot.", - "exclusions": { - "obr.capital_gains_tax@2025": { - "reason": "Vintage conflict, not a fit defect: the Chronicle re-pin (microcosm#874) put HMRC's 2024-25 CGT outturn on the feed (£127.3bn of chargeable gains, 584k taxpayers, against £69.9bn / 403k in 2023-24 — the forestalling year ahead of the 30 October 2024 rate rise) and the doctrine binds it at face value at the 2025 period; the frame fits both HMRC rows within 0.3% and 2025-26 rates on those gains give £31.4bn of liability (24.7% effective) against OBR's £21.8bn FY2025-26 receipts and HMRC's realised 19.0% on the same gains (+44.2% at the composed calibration; −25% with the 2023-24 gains). The facts stay bound as published; the deliverable is a declared 2024-25 → 2025 translation of the gains total under the WS-C reconciliation layer (#875: the index ruling, applying uprating_index in the compile step, the taxpayer count flat at 584k, the cash-lag mapping for self-assessed OBR lines). While in force the calibrated 2025-26 base carries ~40% more CGT liability than OBR expects.", - "approved_by": "juaristi22", - "adjudication": "microcosm#875", - "approved_on": "2026-09-05", - "expires_on": "2026-10-05" - } - } + "exclusions": {} } diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json index add5eb481..43a7de252 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 @@ -38,7 +38,7 @@ "geography_level": "country", "geography_id": "K02000001" }, - "obr.capital_gains_tax": { + "hmrc.cgt.liability_total": { "geography_level": "country", "geography_id": "K02000001" }, @@ -879,6 +879,11 @@ "slc.repayments.england_total_higher_education" ], "uprating_holds": [ + { + "name": "hmrc.cgt.liability_total", + "from": "2024", + "to": "2025" + }, { "name": "isc.private_school_students", "from": "2024-01", @@ -2786,18 +2791,18 @@ } ] }, - "obr.capital_gains_tax": { + "hmrc.cgt.liability_total": { "status": "active", "candidates": [ { - "name": "obr.capital_gains_tax", + "name": "hmrc.cgt.liability_total", "status": "active", - "matched_fact_count_overall": 7, - "matched_fact_count_at_or_before_period": 2, + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 21801546197.09165, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_93699bb9caa7ec0d6833f420" + "resolved_value": 22503000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_222c397017de7bff0a6583a7" } ] }, @@ -4727,12 +4732,12 @@ { "name": "hmrc.cgt.taxpayers_total", "status": "active", - "matched_fact_count_overall": 38, - "matched_fact_count_at_or_before_period": 38, + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 584000.0, + "resolved_value": 551000.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_ec8cf88ffb8304ce72228e8b" + "resolved_fact_key": "ledger_aggregate_fact_v2_31d709fc393c2bf4d04efca5" } ] }, @@ -4742,12 +4747,12 @@ { "name": "hmrc.cgt.gains_total", "status": "active", - "matched_fact_count_overall": 38, - "matched_fact_count_at_or_before_period": 38, + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, "resolved_period": 2025, - "resolved_value": 127316000000.0, + "resolved_value": 119258000000.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_a9969c2a306f713f6bb203fc" + "resolved_fact_key": "ledger_aggregate_fact_v2_12060d20a417d85d67cf24e8" } ] }, 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 d523ea422..8ab2aeccd 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -1,6 +1,6 @@ { "country": "uk", - "description": "UK active-subset Ledger target references for the FRS 2024-25 line. Rows are generated from the national rows in uk_population_targets.json: name is the contract target_id or an incumbent-compatible fan-out row name; ledger_selector is the contract selector plus geography pins; entity is from_entity, then map_to, then household; measure is the prepared-column metric name or fan-out row name; family is the contract family; period is the model and calibration year 2025. Observation windows are declared separately from the FRS 2024-25 survey vintage. Observed values stay in Ledger facts and resolve through each reference's declared value operation. Deferred classes and geography-pin decisions are recorded in uk/target_reference_membership.json. metadata.measure_kind records that measures are prepared columns produced from the contract binding payload referenced by metadata.contract_target_id.", + "description": "UK active-subset Ledger target references for the FRS 2024-25 line. Rows are generated from the national rows in uk_population_targets.json: name is the contract target_id or an incumbent-compatible fan-out row name; ledger_selector is the contract selector plus geography pins; entity is from_entity, then map_to, then household; measure is the prepared-column metric name or fan-out row name; family is the contract family; period is the model and calibration year 2025, distinct from the FRS 2024-25 base period 2024. Observation windows are declared separately; metadata.measurement_period records observed-year exceptions. Observed values stay in Ledger facts and resolve through each reference's declared value operation. Deferred classes and geography-pin decisions are recorded in uk/target_reference_membership.json. metadata.measure_kind records that measures are prepared columns produced from the contract binding payload referenced by metadata.contract_target_id.", "allowed_value_operations": [ "identity", "sum", @@ -146,23 +146,31 @@ "assertion_policy": "allow_source_projection" }, { - "name": "obr.capital_gains_tax", + "name": "hmrc.cgt.liability_total", "ledger_selector": { - "source_name": "obr", - "source_concept": "obr.capital_gains_tax", - "entity_name": "person", + "source_name": "hmrc", + "source_concept": "hmrc.cgt_tax_individuals", + "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit", + "aggregate_fact_key": "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7", + "period_type": "tax_year", + "period_value": 2024, "geography_level": "country", "geography_id": "K02000001" }, "entity": "person", - "measure": "obr/capital_gains_tax", - "family": "obr", + "measure": "hmrc/cgt_liability", + "family": "hmrc_cgt", "period": 2025, "metadata": { - "contract_target_id": "obr.capital_gains_tax", - "measure_kind": "prepared_column" + "contract_target_id": "hmrc.cgt.liability_total", + "measure_kind": "prepared_column", + "observation_basis": "individuals_observed_disposal_year_2024_liability", + "measurement_period": "2024", + "source_period_policy": "exact_observation" }, - "assertion_policy": "allow_source_projection" + "uprating_from_period": "2024", + "uprating_to_period": 2025 }, { "name": "obr.sdlt", @@ -4000,8 +4008,12 @@ "name": "hmrc.cgt.taxpayers_total", "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_taxpayers_total", + "source_concept": "hmrc.cgt_taxpayers_individuals", "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit", + "aggregate_fact_key": "ledger.aggregate_fact.v2:31d709fc393c2bf4d04efca5", + "period_type": "tax_year", + "period_value": 2024, "geography_level": "country", "geography_id": "K02000001" }, @@ -4011,7 +4023,10 @@ "period": 2025, "metadata": { "contract_target_id": "hmrc.cgt.taxpayers_total", - "measure_kind": "prepared_column" + "measure_kind": "prepared_column", + "observation_basis": "individuals_observed_disposal_year_2024_net_gains_and_aea", + "measurement_period": "2024", + "source_period_policy": "exact_observation" }, "uprating_from_period": "2024", "uprating_to_period": 2025 @@ -4020,9 +4035,12 @@ "name": "hmrc.cgt.gains_total", "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_gains_total", + "source_concept": "hmrc.cgt_gains_individuals", "groupby_dimension": "hmrc.cgt_table1_line", "entity_name": "tax_unit", + "aggregate_fact_key": "ledger.aggregate_fact.v2:12060d20a417d85d67cf24e8", + "period_type": "tax_year", + "period_value": 2024, "geography_level": "country", "geography_id": "K02000001" }, @@ -4032,7 +4050,10 @@ "period": 2025, "metadata": { "contract_target_id": "hmrc.cgt.gains_total", - "measure_kind": "prepared_column" + "measure_kind": "prepared_column", + "observation_basis": "individuals_observed_disposal_year_2024_net_gains_and_aea", + "measurement_period": "2024", + "source_period_policy": "exact_observation" }, "uprating_from_period": "2024", "uprating_to_period": 2025 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 2cd2e33f1..693281eb7 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 @@ -20,8 +20,8 @@ "pinned_ref": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3", "pinned_version": "1.56.16", "registry_rows": 652, - "mapped_rows": 610, - "excluded_rows": 42, + "mapped_rows": 609, + "excluded_rows": 43, "mapped": { "dwp/benefit_capped_households": "dwp.benefit_cap.capped_households", "dwp/esa_claimants": "dwp.esa_claimants", @@ -319,7 +319,6 @@ "hmrc/state_pension_income_band_50_000_to_70_000": "hmrc.spi.state_pension.amount_by_total_income_band", "hmrc/state_pension_income_band_70_000_to_100_000": "hmrc.spi.state_pension.amount_by_total_income_band", "obr/attendance_allowance": "obr.attendance_allowance", - "obr/capital_gains_tax": "obr.capital_gains_tax", "obr/carers_allowance": "obr.carers_allowance", "obr/child_benefit": "obr.child_benefit", "obr/council_tax": "obr.council_tax", @@ -676,7 +675,8 @@ "ons/tenure_england_owned_with_mortgage": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", "ons/tenure_england_rented_privately": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", "ons/tenure_england_social_rent": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", - "ons/tenure_england_total": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134)." + "ons/tenure_england_total": "England tenure counts come from an LA-grain workbook uk-data code-sums; ruled non-portable as national facts on chronicle#133 - moved to the wave-3 LA package (chronicle#134).", + "obr/capital_gains_tax": "Observed FY2024-25 treatment (#875): the incumbent OBR cash forecast is retained only as diagnostic provenance. It has no same-basis liability mapping and is removed from fitting; no source value is adjusted." }, "unmapped_declarations": { "hmrc.salary_sacrifice.it_relief_basic_rate": "New declaration backed by chronicle#139 salary-sacrifice facts; the incumbent source CSV is still 410-Gone at 12a1e028 and its rows are silently suppressed by the bare-except drop in build_loss_matrix.py:376-394.", @@ -696,7 +696,8 @@ "dft.bus_fare_receipts.england_outside_london": "#789 consumer target.", "dft.bus_net_support.england_outside_london": "#789 consumer target.", "dft.bus_fare_receipts.uk": "#789 consumer target.", - "dft.bus_net_support.uk": "#789 consumer target." + "dft.bus_net_support.uk": "#789 consumer target.", + "hmrc.cgt.liability_total": "Observed FY2024-25 individuals liability from the pinned HMRC Table 1 fact. No incumbent same-basis liability target; OBR cash is a separate diagnostic." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -736,7 +737,7 @@ "obr.ni_self_employed", "obr.vat", "obr.fuel_duties", - "obr.capital_gains_tax", + "hmrc.cgt.liability_total", "obr.sdlt", "obr.attendance_allowance", "obr.carers_allowance", @@ -1574,34 +1575,41 @@ } }, { - "target_id": "obr.capital_gains_tax", - "family": "obr", + "target_id": "hmrc.cgt.liability_total", + "family": "hmrc_cgt", "geography_levels": [ "country" ], "measurement": { "entity": "person", "concept": "uk.tax.capital_gains_tax.amount", - "map_to": "household" + "map_to": "household", + "observation_basis": "individuals_observed_disposal_year_2024_liability" }, "bindings": { "policyengine": { - "metric_name": "obr/capital_gains_tax", - "value_variable": "capital_gains_tax", + "metric_name": "hmrc/cgt_liability", + "value_variable": "cgt_2024_tax", "from_entity": "person", - "map_to": "household" + "map_to": "household", + "notes": "Individuals-only observed FY2024-25 liability from HMRC Table 1, including the published provisional status. Measure the same cgt_2024_tax engine array as the dated diagnostic control. The original OBR FY2025-26 cash forecast survives separately as unresolved diagnostic provenance; it is not a liability target or an identified forward-year bridge (microcosm#875).", + "measurement_period": 2024, + "require_matching_fact_period": true }, "axiom": { - "metric_name": "obr/capital_gains_tax", + "metric_name": "hmrc/cgt_liability", "status": "pending", "value_rule": "uk.tax.capital_gains_tax.amount" } }, - "assertion_policy": "allow_source_projection", "ledger_selector": { - "source_name": "obr", - "source_concept": "obr.capital_gains_tax", - "entity_name": "person" + "source_name": "hmrc", + "source_concept": "hmrc.cgt_tax_individuals", + "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit", + "aggregate_fact_key": "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7", + "period_type": "tax_year", + "period_value": 2024 } }, { @@ -3118,19 +3126,22 @@ "operator": ">", "value": "gov.hmrc.cgt.annual_exempt_amount" } - ] + ], + "observation_basis": "individuals_observed_disposal_year_2024_net_gains_and_aea" }, "bindings": { "policyengine": { "metric_name": "hmrc/cgt_taxpayers", "kind": "parameter_gated_threshold", "gate_parameter": "gov.hmrc.cgt.annual_exempt_amount", - "gated_variable": "capital_gains", + "gated_variable": "cgt_2024_gains", "gate_comparison": ">", "value_variable": "person_count", "from_entity": "person", "map_to": "household", - "notes": "A CGT taxpayer means gains above the annual exempt amount in force that year, read live from the parameter tree - gating only the count (not the amount) would target a mean gain over two different populations (sources/hmrc_cgt.py:1-46)." + "notes": "Individuals-only observed FY2024-25 net gains after losses and before AEA. Both gains and taxpayer proxy use engine disposal year 2024 and its AEA, while other calibration families may use 2025. The source fact period must match. Persisted gains remain unchanged. A 2025 projection is separate: the imputed non-taxpayer remainder piles up at the AEA and must not be uprated into a calibrated incidence forecast without supporting evidence (microcosm#875).", + "measurement_period": 2024, + "require_matching_fact_period": true }, "axiom": { "metric_name": "hmrc/cgt_taxpayers", @@ -3140,8 +3151,12 @@ }, "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_taxpayers_total", - "groupby_dimension": "hmrc.cgt_table1_line" + "source_concept": "hmrc.cgt_taxpayers_individuals", + "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit", + "aggregate_fact_key": "ledger.aggregate_fact.v2:31d709fc393c2bf4d04efca5", + "period_type": "tax_year", + "period_value": 2024 } }, { @@ -3160,19 +3175,22 @@ "operator": ">", "value": "gov.hmrc.cgt.annual_exempt_amount" } - ] + ], + "observation_basis": "individuals_observed_disposal_year_2024_net_gains_and_aea" }, "bindings": { "policyengine": { "metric_name": "hmrc/capital_gains_total", "kind": "parameter_gated_threshold", "gate_parameter": "gov.hmrc.cgt.annual_exempt_amount", - "gated_variable": "capital_gains", + "gated_variable": "cgt_2024_gains", "gate_comparison": ">", - "value_variable": "capital_gains", + "value_variable": "cgt_2024_gains", "from_entity": "person", "map_to": "household", - "notes": "Gains summed over people whose gains exceed the annual exempt amount (sources/hmrc_cgt.py:86-104). Also the single-homing successor for populace's UK_CGT_TARGET_SPECS (microcosm#622 item 6)." + "notes": "Individuals-only observed FY2024-25 net gains after losses and before AEA. Both gains and taxpayer proxy use engine disposal year 2024 and its AEA, while other calibration families may use 2025. The source fact period must match. Persisted gains remain unchanged. A 2025 projection is separate: the imputed non-taxpayer remainder piles up at the AEA and must not be uprated into a calibrated incidence forecast without supporting evidence (microcosm#875).", + "measurement_period": 2024, + "require_matching_fact_period": true }, "axiom": { "metric_name": "hmrc/capital_gains_total", @@ -3182,9 +3200,12 @@ }, "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_gains_total", + "source_concept": "hmrc.cgt_gains_individuals", "groupby_dimension": "hmrc.cgt_table1_line", - "entity_name": "tax_unit" + "entity_name": "tax_unit", + "aggregate_fact_key": "ledger.aggregate_fact.v2:12060d20a417d85d67cf24e8", + "period_type": "tax_year", + "period_value": 2024 } }, { @@ -13936,5 +13957,33 @@ }, "selector_note": "VOA counts dwellings; absent cells are signed deferrals and binding is fenced by voa_dwellings_vs_household_frame." } - ] + ], + "diagnostic_references": { + "obr.capital_gains_tax": { + "attach_to_target": "hmrc.cgt.liability_total", + "required_period_type": "fiscal_year", + "required_assertion": "source_projection", + "reference": { + "name": "obr.capital_gains_tax", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.capital_gains_tax", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/capital_gains_tax", + "family": "obr", + "period": 2025, + "metadata": { + "diagnostic_role": "cash_receipts_forecast_unreconciled" + }, + "assertion_policy": "allow_source_projection", + "period_match_policy": "exact", + "ledger_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420" + }, + "notes": "Original March 2026 OBR FY2025-26 cash forecast retained unchanged as diagnostic provenance only. No liability-to-cash payment bridge is identified; never insert this diagnostic into the fitting registry." + } + } } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/fiscal_targets.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/fiscal_targets.py index be7fa2794..609e22df6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/fiscal_targets.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/fiscal_targets.py @@ -65,18 +65,18 @@ UK_CGT_TARGET_COVERAGE_REQUIREMENTS: tuple[TargetCoverageRequirement, ...] = ( TargetCoverageRequirement( requirement_id="uk_capital_gains", - label="HMRC capital gains totals and taxpayer counts", + label="HMRC individual capital gains, taxpayer counts and liability", accepted_names=( "hmrc.cgt.gains_total", "hmrc.cgt.taxpayers_total", + "hmrc.cgt.liability_total", ), - min_matches=2, + min_matches=3, notes=( - "Without both facts the gains distribution is unanchored: the " - "published populace-uk release has 1.47m CGT taxpayers against " - "HMRC's 378k. A revenue-side target constrains what CGT raises, " - "not how gains are spread across households, so it does not " - "substitute for these." + "All three facts describe individuals in observed FY2024-25. " + "Liability alone cannot anchor the gains distribution or incidence. " + "The separately retained OBR cash forecast is an unresolved " + "diagnostic and cannot substitute for observed liability." ), ), ) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py index bb8f9b9b5..59966e3ba 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py @@ -6,7 +6,7 @@ import math import re from collections.abc import Iterable, Mapping -from dataclasses import dataclass +from dataclasses import dataclass, replace from functools import lru_cache from importlib import resources as importlib_resources from typing import Any @@ -266,6 +266,15 @@ def compile_uk_target_registry( registry = validate_uc_source_month_coverage( restamped, registry, candidate_facts ) + if reference.name == "hmrc.cgt.liability_total": + cash_metadata = _cgt_cash_diagnostic_metadata(fact_rows) + registry = TargetRegistry( + ( + replace(row, metadata={**row.metadata, **cash_metadata}) + for row in registry.specs + ), + country="uk", + ) except ValueError as error: unsupported.append( { @@ -282,6 +291,79 @@ def compile_uk_target_registry( ) +def _cgt_cash_diagnostic_metadata( + facts: tuple[Mapping[str, Any], ...], +) -> dict[str, str]: + """Retain the original forecast without adding a cash row to fitting. + + The cash period and exact Chronicle fact identity are consumer declarations, + independent of the calibration period. The normal TargetSpec metadata path + carries this receipt into both national and local registries. Unavailable + diagnostic data must not disable independently observed HMRC targets. + """ + contract = json.loads( + importlib_resources.files("microcosm.build.uk") + .joinpath(UK_POPULATION_TARGETS_RESOURCE) + .read_text(encoding="utf-8") + ) + try: + declaration = contract["diagnostic_references"]["obr.capital_gains_tax"] + if declaration["attach_to_target"] != "hmrc.cgt.liability_total": + raise ValueError("unexpected receiving target") + reference = LedgerTargetReference(**declaration["reference"]) + if not reference.ledger_fact_key: + raise ValueError("the original forecast must have an exact fact pin") + if ( + reference.name != "obr.capital_gains_tax" + or reference.period_match_policy != "exact" + or reference.assertion_policy != "allow_source_projection" + or declaration["required_period_type"] != "fiscal_year" + or declaration["required_assertion"] != "source_projection" + ): + raise ValueError("expected an exactly dated OBR cash forecast declaration") + except (KeyError, TypeError, ValueError) as error: + raise ValueError(f"Invalid CGT cash diagnostic declaration: {error}") from error + + metadata = { + "cgt_cash_diagnostic_role": "diagnostic_only_not_in_fit", + "cgt_cash_reconciliation_status": "unresolved", + } + try: + candidates = tuple( + fact + for fact in _candidate_facts_for_reference(facts, reference) + if fact.get("aggregate_fact_key") == reference.ledger_fact_key + and fact.get("period", {}).get("type") + == declaration["required_period_type"] + and fact.get("assertion") == declaration["required_assertion"] + ) + (cash,) = compile_ledger_target_references( + candidates, [reference], country="uk" + ).specs + if cash.metadata["ledger_fact_period"] != str(reference.period): + raise ValueError("forecast period does not match its declaration") + except ValueError as error: + return { + **metadata, + "cgt_cash_diagnostic_status": "unavailable", + "cgt_cash_diagnostic_unavailable_reason": str(error), + "cgt_cash_diagnostic_expected_fact_key": reference.ledger_fact_key, + "cgt_cash_diagnostic_expected_period": str(reference.period), + "cgt_cash_diagnostic_expected_period_type": declaration[ + "required_period_type" + ], + "cgt_cash_diagnostic_expected_assertion": declaration["required_assertion"], + } + return { + **metadata, + "cgt_cash_diagnostic_status": "available", + "cgt_cash_diagnostic_value_gbp": str(cash.value), + "cgt_cash_diagnostic_period": str(cash.period), + "cgt_cash_diagnostic_source": cash.source, + **{f"cgt_cash_diagnostic_{key}": value for key, value in cash.metadata.items()}, + } + + def load_uk_local_area_crosswalk() -> dict[str, Any]: """The committed local-area crosswalk (roster + vintages per level).""" 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 dcbc451e3..8f80941d7 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 @@ -3,6 +3,7 @@ from __future__ import annotations import json +import re import warnings from datetime import date from importlib import resources as importlib_resources @@ -42,6 +43,24 @@ {"uc_calibration_family_type", "uc_calibration_child_count"} ) +# Reserved, transient measurement names: using the model's input name here +# would let a persisted base-period column bypass requested-year calculation. +# Both the taxpayer mask and amount must use the same engine-year net gains. +_CGT_CALIBRATION_VARIABLES = { + "cgt_calibration_gains": "capital_gains", + "cgt_calibration_tax": "capital_gains_tax", +} +_CGT_DATED_MEASURE = re.compile(r"^cgt_(20[0-9]{2})_(gains|tax)$") + + +def _cgt_model_measure(variable: str, default_year: int) -> tuple[str, int] | None: + if variable in _CGT_CALIBRATION_VARIABLES: + return _CGT_CALIBRATION_VARIABLES[variable], default_year + match = _CGT_DATED_MEASURE.fullmatch(variable) + if match: + return _CGT_CALIBRATION_VARIABLES[f"cgt_calibration_{match[2]}"], int(match[1]) + return None + def _uc_calibration_composition( frame: Any, simulation: Any, year: int @@ -91,6 +110,16 @@ def compute_uk_measure_input( ) -> tuple[np.ndarray, str]: """Compute one policyengine-uk variable at the requested entity grain.""" + cgt_measure = _cgt_model_measure(variable, year) + if cgt_measure is not None: + if entity != "person": + raise KeyError(f"CGT calibration measures are person-only: {entity}") + model_variable, measure_year = cgt_measure + values, route = compute_uk_measure_input( + frame, simulation, entity, model_variable, measure_year + ) + return values, f"engine_period:{measure_year}:{model_variable}:{route}" + if variable in UC_TARGET_VARIABLES: if entity != "benunit": raise KeyError(f"UC statistical measurements are benunit-only: {entity}") @@ -269,17 +298,72 @@ def __init__( if frame is None: frame, _provenance = load_uk_national_frame(source_path) self.frame = frame + reserved = { + str(name) + for name in frame.table("person") + if _cgt_model_measure(str(name), self.year) is not None + } + if reserved: + raise ValueError( + "CGT calibration measures must not be persisted as source inputs: " + f"{sorted(reserved)}" + ) self.simulation = factory(dataset=str(source_path)) validate_uc_claimant_input(self.simulation, frame.table("person"), self.year) + self.contract_targets = _uk_contract_targets() + bound_cgt_periods = {} + for target_id, target in self.contract_targets.items(): + binding = target["bindings"]["policyengine"] + for key in ("gated_variable", "value_variable"): + name = str(binding.get(key, "")) + cgt_measure = _cgt_model_measure(name, self.year) + if cgt_measure is None: + continue + model_variable, measure_year = cgt_measure + if int(binding.get("measurement_period", self.year)) != measure_year: + raise ValueError( + f"CGT amount/threshold period mismatch: {target_id}" + ) + bound_cgt_periods[name] = { + "model_variable": model_variable, + "measurement_period": measure_year, + } self._receipt = { "mode": mode, "source_path": str(source_path), "policyengine_uk_version": _policyengine_uk_version(policyengine_uk), + "cgt_period_contract": { + "version": "uk-cgt-measurement-v2", + "input_period": getattr(frame, "metadata", {}).get("time_period"), + "calibration_period": self.year, + "default_engine_period": self.year, + "bound_measurements": bound_cgt_periods, + "dated_measures": { + "naming": "cgt__", + "period": "explicit_disposal_year_in_variable_name", + "policy_threshold_period": "binding.measurement_period", + }, + "model_variables": dict(_CGT_CALIBRATION_VARIABLES), + "gains_basis": "after_losses_before_annual_exempt_amount", + "losses_treatment": "already_in_net_gains_no_second_deduction", + "population": "individuals", + "taxpayer_proxy": "engine_year_net_gains_above_engine_year_aea", + "gate_parameter": "gov.hmrc.cgt.annual_exempt_amount", + "input_mutation": False, + }, } - self.contract_targets = _uk_contract_targets() + self._uc_tcl_measures_used: set[str] = set() self._uc_paid_measures_used: set[str] = set() + def validate_period(self, period: int | str) -> None: + """Refuse thresholds and simulated inputs from different periods.""" + if str(period) != str(self.year): + raise ValueError( + f"UK measurement period {self.year} does not match target period " + f"{period}." + ) + def knows(self, entity: str, variable: str) -> bool: """Whether a route in :func:`compute_uk_measure_input` reaches here. @@ -295,6 +379,9 @@ def knows(self, entity: str, variable: str) -> bool: | UC_PAID_TARGET_VARIABLES ): return entity == "benunit" + cgt_measure = _cgt_model_measure(variable, self.year) + if cgt_measure is not None: + return entity == "person" and self.knows(entity, cgt_measure[0]) definition = self.simulation.tax_benefit_system.variables.get(variable) if definition is None or entity not in _ENTITY_ID: return False @@ -311,6 +398,8 @@ def knows(self, entity: str, variable: str) -> bool: return getattr(definition, "value_type", None) in (int, float) def entity_for(self, variable: str) -> str | None: + if _cgt_model_measure(variable, self.year) is not None: + return "person" if ( variable in _UC_CALIBRATION_VARIABLES diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/national_calibration.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/national_calibration.py index 93bffc2b8..ba7cd6d5d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/national_calibration.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/national_calibration.py @@ -67,6 +67,8 @@ def __init__( # The materialization period is the declared calibration year the # registry was compiled at — never the input frame's base-year # time_period, which lags it (survey 2024, calibration 2025). + # A binding can separately declare its observed measurement period, + # as the three individual CGT rows do for FY2024-25. if not isinstance(period, int) or isinstance(period, bool) or period <= 0: raise ValueError( f"period must be the declared calibration year, got {period!r}." diff --git a/packages/microcosm-build/tests/fixtures/uk_target_reference_feed_rows.jsonl b/packages/microcosm-build/tests/fixtures/uk_target_reference_feed_rows.jsonl index ca82107f6..530b94d7d 100644 --- a/packages/microcosm-build/tests/fixtures/uk_target_reference_feed_rows.jsonl +++ b/packages/microcosm-build/tests/fixtures/uk_target_reference_feed_rows.jsonl @@ -7,18 +7,18 @@ {"aggregate_fact_key": "ledger.aggregate_fact.v2:882329821c90dc683aa778d8", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "slc", "canonical_concept": "slc.student_loan_net_repayments_plan_2_full_time", "concept_alignment_key": "ledger.concept_alignment.v2:5a6738918c70cab40798a5ed", "evidence_notes": "Student loans in England FY2024-25 (corrected tables, slcsp012025_Corrected), Table 1A ICR balance sheet, row 'Net repayments posted during the financial year', financial year 2024-25 column block, column: Plan 2 Full-time. GBP million.", "evidence_url": "https://www.gov.uk/government/statistics/student-loans-in-england-2024-to-2025", "relation": "source_label", "source_concept": "slc.student_loan_net_repayments_plan_2_full_time"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "student_loan_borrower"}, "geography": {"id": "E92000001", "level": "country", "vintage": "current"}, "label": "England 2024 fiscal year sum slc student loan net repayments plan 2 full time for person [slc Student loans in England, financial year 2024-25 (corrected tables), Table 1A slcsp012025_Corrected.xlsx slcsp01_2025_corrected]", "layout": {"groupby_dimension": "slc.repayment_plan", "groupby_ordinal": 0, "groupby_value_id": "net_repayments", "groupby_value_label": "Net repayments posted during the financial year", "measure_id": "plan_2_full_time", "measure_label": "Net repayments FY2024-25, Plan 2 Full-time", "measure_ordinal": 1, "record_set_id": "slc.repayments_2025.table_1a.fy2024", "record_set_spec_hash": "b748f6aeb2b7ad68bfb560a9", "record_set_spec_id": "slc.repayments_2025.table_1a.fy2024.v1", "source_column_id": "plan_2_full_time", "source_row_id": "net_repayments", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:a959c4f2a5576cd283af852a", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:0f682109e58dfad1ad28acd6", "ledger.source_cell.v1:60e6539baafd94e56648671a", "ledger.source_cell.v1:446cc4b0c7a9f20af575ec37", "ledger.source_cell.v1:b3d5f4758ba698ba4a4578d4"], "source_record_id": "slc.repayments_2025.table_1a.fy2024.net_repayments.plan_2_full_time", "source_row_keys": []}, "observed_measure": {"source_concept": "slc.student_loan_net_repayments_plan_2_full_time", "source_measure_id": "plan_2_full_time", "source_name": "slc", "source_table": "Student loans in England, financial year 2024-25 (corrected tables), Table 1A", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:ea46f749cb24645a1742ac79", "period": {"type": "fiscal_year", "value": 2024}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:61a154dcb37f426f85982478", "source": {"extracted_at": "2026-08-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/slc/slc-student-loan-repayments-england-2025/2025/a9ee065ba2d6af4be8584022ac50302f22f7229919e4171cf132039b0ca26aac/slcsp012025_Corrected.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/slc/slc-student-loan-repayments-england-2025/2025/a9ee065ba2d6af4be8584022ac50302f22f7229919e4171cf132039b0ca26aac/slcsp012025_Corrected.xlsx", "source_file": "slcsp012025_Corrected.xlsx", "source_name": "slc", "source_sha256": "a9ee065ba2d6af4be8584022ac50302f22f7229919e4171cf132039b0ca26aac", "source_size_bytes": 332185, "source_table": "Student loans in England, financial year 2024-25 (corrected tables), Table 1A", "url": "https://assets.publishing.service.gov.uk/media/6943ee619273c48f554cf5c5/slcsp012025_Corrected.xlsx", "vintage": "slcsp01_2025_corrected"}, "source_release_key": "ledger.source_release.v2:91e47f96684950159cb0210d", "source_series_key": "ledger.source_series.v2:513fa8b0e1881aafe14a47bf", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:02442c1ef61cbc68cc27ca5c", "universe_constraints": {"domain": "student_loans"}, "value": 2683104312.0299997, "value_type": "number"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:a82c84f67b40867564d2c847", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.spi_employment_income_amount", "concept_alignment_key": "ledger.concept_alignment.v2:954e6c895535b23e4c7805cb", "evidence_notes": "SPI collated tables 2023-24, Table_3_6, column: Employment income (Amount); taxpayers in thousands, amounts GBP million.", "evidence_url": "https://www.gov.uk/government/statistics/personal-incomes-statistics-for-the-tax-year-2023-to-2024", "relation": "source_label", "source_concept": "hmrc.spi_employment_income_amount"}, "dimension_set_key": "ledger.dimension_set.v2:2abee80869ae40d61ee490c3", "dimensions": {"total_income_lower_bound": 12570}, "entity": {"name": "person", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 tax year sum hmrc spi employment income amount for person (total income lower bound=12570) [hmrc SPI collated Tables 3.1 to 3.11, tax year 2023-24: income by range of total income Collated_Tables_3_1_to_3_11_2324.ods spi_2023_24]", "layout": {"groupby_dimension": "hmrc.total_income_band", "groupby_ordinal": 0, "groupby_value_id": "band_12570", "groupby_value_label": "Total income from GBP 12 570", "measure_id": "employment_amount", "measure_label": "Employment (amount)", "measure_ordinal": 3, "record_set_id": "hmrc.spi_2324.table_3_6", "record_set_spec_hash": "5d819678ed0074660bcee770", "record_set_spec_id": "hmrc.spi_2324.table_3_6.v1", "source_column_id": "employment_amount", "source_row_id": "band_12570", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:18e235114b5444256783fd7a", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:cfbcf3282db1fcb71a277b00", "ledger.source_cell.v1:057369c1997d122b69f47027"], "source_record_id": "hmrc.spi_2324.table_3_6.band_12570.employment_amount", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.spi_employment_income_amount", "source_measure_id": "employment_amount", "source_name": "hmrc", "source_table": "SPI collated Tables 3.1 to 3.11, tax year 2023-24: income by range of total income", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:631d0596c3c14bb4621a9da2", "period": {"type": "tax_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:debc6506b4121d8c968f8b4b", "source": {"extracted_at": "2026-08-06", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/hmrc/hmrc-spi-income-bands-2023-24/2024/ad063b06b2bdeef8600dbbb09d48153337a4966f8c7eea50df7a2e0304ebd73e/Collated_Tables_3_1_to_3_11_2324.ods", "raw_r2_uri": "r2://ledger-raw/raw/hmrc/hmrc-spi-income-bands-2023-24/2024/ad063b06b2bdeef8600dbbb09d48153337a4966f8c7eea50df7a2e0304ebd73e/Collated_Tables_3_1_to_3_11_2324.ods", "source_file": "Collated_Tables_3_1_to_3_11_2324.ods", "source_name": "hmrc", "source_sha256": "ad063b06b2bdeef8600dbbb09d48153337a4966f8c7eea50df7a2e0304ebd73e", "source_size_bytes": 166693, "source_table": "SPI collated Tables 3.1 to 3.11, tax year 2023-24: income by range of total income", "url": "https://assets.publishing.service.gov.uk/media/69f1f12d2fae53a03709682f/Collated_Tables_3_1_to_3_11_2324.ods", "vintage": "spi_2023_24"}, "source_release_key": "ledger.source_release.v2:cf26a12e28615db0aa77c564", "source_series_key": "ledger.source_series.v2:90b4b7a93b4bedd73c4fd852", "survey_instrument": "Survey of Personal Incomes", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:1b19141149ccab3a1cc4207e", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": 12570, "variable": "total_income_lower_bound"}], "domain": "personal_incomes"}, "value": 16900000000, "value_type": "integer"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:d928e7da0fbfe088ca1a30d7", "aggregation": {"method": "sum"}, "assertion": "source_projection", "concept_alignment": {"authority": "obr", "canonical_concept": "obr.income_tax", "concept_alignment_key": "ledger.concept_alignment.v2:c6c41e9a05252a482bf75215", "evidence_notes": "OBR EFO March 2026 detailed forecast tables, sheet 3.4, row 6 ('Income tax (gross of tax credits)'), GBP billion.", "evidence_url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", "relation": "source_label", "source_concept": "obr.income_tax"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "resident_population"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2025 fiscal year projected sum obr income tax for person [obr EFO March 2026 detailed forecast tables: receipts efo_receipts.xlsx efo_march_2026]", "layout": {"groupby_dimension": "obr.efo_line", "groupby_ordinal": 0, "groupby_value_id": "income_tax", "groupby_value_label": "Income tax (gross of tax credits)", "measure_id": "amount", "measure_label": "Income tax (gross of tax credits), FY2025-26", "measure_ordinal": 0, "record_set_id": "obr.efo_2026_03.receipts.income_tax.fy2025", "record_set_spec_hash": "e2d3c601ace5447a5fe449bc", "record_set_spec_id": "obr.efo_2026_03.receipts.income_tax.fy2025.v1", "source_column_id": "amount", "source_row_id": "income_tax", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:ac779b21d033c2c724a112ca", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:916eb6e55cfdecb1aaae6b03", "ledger.source_cell.v1:487ced430603f1287c1595a1"], "source_record_id": "obr.efo_2026_03.receipts.income_tax.fy2025.income_tax.amount", "source_row_keys": []}, "observed_measure": {"source_concept": "obr.income_tax", "source_measure_id": "amount", "source_name": "obr", "source_table": "EFO March 2026 detailed forecast tables: receipts", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:954247698e8178993728e76b", "period": {"type": "fiscal_year", "value": 2025}, "provenance_class": "model_output", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:1cda5b118cdb34e16de09a41", "source": {"extracted_at": "2026-08-06", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/obr/obr-efo-receipts-march-2026/2026/f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28/efo_receipts.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/obr/obr-efo-receipts-march-2026/2026/f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28/efo_receipts.xlsx", "source_file": "efo_receipts.xlsx", "source_name": "obr", "source_sha256": "f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28", "source_size_bytes": 187899, "source_table": "EFO March 2026 detailed forecast tables: receipts", "url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", "vintage": "efo_march_2026"}, "source_release_key": "ledger.source_release.v2:cd7332ed9168974f4875f7c7", "source_series_key": "ledger.source_series.v2:dae31655351be8d2e0736a5d", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:ecb00e907376ba856934e4ad", "universe_constraints": {"domain": "public_sector_finances"}, "value": 331437583074.4429, "value_type": "number"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:a328029c7fdf199c7bb8ed72","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-04 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"April 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_04.total_units","record_set_spec_hash":"4b5a84f57f36e8654216696a","record_set_spec_id":"dwp.uc_deductions.month2025_04.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:460f79382edab88773973ef5","lineage":{"source_cell_keys":["ledger.source_cell.v1:dd1d91de62f0f227a5d2158c","ledger.source_cell.v1:43004e85396ce7be9004f6d1"],"source_record_id":"dwp.uc_deductions.month2025_04.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-04"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:e4d7cc18902f0908808e62ec","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:90803eebc1970c036317afd2","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6380000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:8166527e94709e1cf6f05d83","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-05 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"May 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_05.total_units","record_set_spec_hash":"0c949577abc5d27616f8349d","record_set_spec_id":"dwp.uc_deductions.month2025_05.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:9e623691a35d8e3b1bde5368","lineage":{"source_cell_keys":["ledger.source_cell.v1:7e171e5eb2301b4bb9fc3d1b","ledger.source_cell.v1:b181dacd39f539b014c2b1ff"],"source_record_id":"dwp.uc_deductions.month2025_05.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-05"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:8fd726b2e9e0a4f811e835e7","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:2b33c933b0135dfa7ed509e4","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:a90579c0ebd5dbf68afff710","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-06 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"June 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_06.total_units","record_set_spec_hash":"28c08eaae7fbb7ad17c1ac13","record_set_spec_id":"dwp.uc_deductions.month2025_06.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:422b2ea82994dae684f67b76","lineage":{"source_cell_keys":["ledger.source_cell.v1:187cc3e9db9f8b0be51eaf51","ledger.source_cell.v1:cfed2d23ccf618b5ab6aebe6"],"source_record_id":"dwp.uc_deductions.month2025_06.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-06"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:1c029a40f45e74ca403873b5","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:ae7cf0037f9e218e85e35c73","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:d941d4d411e201f422109b86","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-07 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"July 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_07.total_units","record_set_spec_hash":"340bf32fe9ab41eb16239dd6","record_set_spec_id":"dwp.uc_deductions.month2025_07.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:e487647ff402c5001b8073dc","lineage":{"source_cell_keys":["ledger.source_cell.v1:89a075156cfc8d032f47b86b","ledger.source_cell.v1:e550caea5042fa74aa2dec68"],"source_record_id":"dwp.uc_deductions.month2025_07.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-07"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:4c90cf3499b64cce5b22397d","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:91c69f13e601d44a6d06f319","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:ade75a0fb6b3ed6458572b31","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-08 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"August 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_08.total_units","record_set_spec_hash":"b9e0181d5c9445df25901f77","record_set_spec_id":"dwp.uc_deductions.month2025_08.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:963853d12edc803f7a330997","lineage":{"source_cell_keys":["ledger.source_cell.v1:f5ee3feedf046059caacb746","ledger.source_cell.v1:56677aaa6b0d4dfe8b94edf4"],"source_record_id":"dwp.uc_deductions.month2025_08.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-08"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:52bab6c2d4d29a967fd77aa1","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:12208a0616c70228706137fb","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:a9c3416e28feeef8e244bb05","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-09 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"September 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_09.total_units","record_set_spec_hash":"c0ed641837240192393c72fc","record_set_spec_id":"dwp.uc_deductions.month2025_09.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:0179c54da44d6faf702d48c6","lineage":{"source_cell_keys":["ledger.source_cell.v1:eb5385892a237a0f74d03fbd","ledger.source_cell.v1:29737e7d00ba6bee57052178"],"source_record_id":"dwp.uc_deductions.month2025_09.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-09"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:c0186e43ac2877c66fb53791","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:59c6763a019f8187de881a1f","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6960000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:e903b85f11e958e665e109ce","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-10 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"October 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_10.total_units","record_set_spec_hash":"e363a40ffe8ba5be1d5d1374","record_set_spec_id":"dwp.uc_deductions.month2025_10.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:08fa70b4c9a1e3c9786f3a07","lineage":{"source_cell_keys":["ledger.source_cell.v1:eb41b6281a4c461864a78e92","ledger.source_cell.v1:e24183b55c7b9706b6845c3f"],"source_record_id":"dwp.uc_deductions.month2025_10.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-10"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:7a65f23de0b76a649e66f052","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:368a9e8dbf1a2f98d4553d7a","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6960000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:3f7a2cac5cb15ff130737128","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-11 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"November 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_11.total_units","record_set_spec_hash":"4aad47485f95ab3d7d4d1c7b","record_set_spec_id":"dwp.uc_deductions.month2025_11.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:626e91b656d1641442c0f52b","lineage":{"source_cell_keys":["ledger.source_cell.v1:4c67a56211c72ee9c72e24b1","ledger.source_cell.v1:9d66ea77298496b49d57e5eb"],"source_record_id":"dwp.uc_deductions.month2025_11.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-11"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:95d829a31671e6c36f7dea1c","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:c56f7dc6f3c50e99ab7f9bef","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6960000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:3270b0f656838ddd01b1ac5f","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"December 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_12.total_units","record_set_spec_hash":"16402b5f5a5582752fcbed2f","record_set_spec_id":"dwp.uc_deductions.month2025_12.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:50f5e4ff94e17c8653a224d6","lineage":{"source_cell_keys":["ledger.source_cell.v1:f8d9331a5f2fdc078091e6d3","ledger.source_cell.v1:4e93cb84089e9349b2920ecb"],"source_record_id":"dwp.uc_deductions.month2025_12.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:64e68c0ee81b5671623a62da","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:f6a6850862a484d6deda79cf","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":7170000,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:867e898d362e2ee81b1cc0e9","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:09dda486cf7db778ead24cee","evidence_notes":"Stat-Xplore 'Households on Universal Credit' dataset, April to December 2025, Great Britain, dimensioned by Family Type x Child Entitlement (Yes/No child element in the award); query echoed in the archived API response. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.","evidence_url":"https://stat-xplore.dwp.gov.uk/","relation":"source_label","source_concept":"dwp.uc_households"},"dimension_set_key":"ledger.dimension_set.v2:ae9c0d568952f7be7b3de1f9","dimensions":{"child_entitlement":"No","family_type":"Single, no children"},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=No, family type=Single, no children) [dwp Households on Universal Credit by family type and child entitlement, April to December 2025 uc_households_by_family_type_and_child_entitlement_april_december_2025.json stat_xplore_2026_09_03]","layout":{"groupby_dimension":"dwp.uc_family_type","groupby_ordinal":0,"groupby_value_id":"single_no_children__child_entitlement_no","groupby_value_label":"Single, no children, No","measure_id":"benefit_units","measure_label":"Universal Credit benefit units","measure_ordinal":0,"record_set_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12","record_set_spec_hash":"dab983bf1f93719dc9bae15f","record_set_spec_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.v1","source_column_id":"value","source_row_id":"single_no_children__child_entitlement_no","table_record_kind":"detail"},"legacy_fact_key":"ledger.fact.v1:fab9f35da80a56fdda84f8e6","lineage":{"source_cell_keys":["ledger.source_cell.v1:10a71527160c9d4a18317afe","ledger.source_cell.v1:0c41fe6b0bac0d72d333912b","ledger.source_cell.v1:824115f66eda83ea3c5ab675","ledger.source_cell.v1:00831bec4108708177b8fcc7"],"source_record_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.single_no_children__child_entitlement_no.benefit_units","source_row_keys":["ledger.source_row.v1:92309fe1032298725d412418"]},"observed_measure":{"source_concept":"dwp.uc_households","source_measure_id":"benefit_units","source_name":"dwp","source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:6558eead1d59f9127b44b69c","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:a770bf82683e66343b177403","source":{"extracted_at":"2026-09-03","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","raw_r2_uri":"r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_file":"uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_name":"dwp","source_sha256":"e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57","source_size_bytes":7982,"source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","url":"https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table","vintage":"stat_xplore_2026_09_03"},"source_release_key":"ledger.source_release.v2:53a9199f091f47dccea365ad","source_series_key":"ledger.source_series.v2:3dc492a8c67367b1a504f325","universe_constraint_set_key":"ledger.universe_constraint_set.v2:8d094e2ba14699028215a5f8","universe_constraints":{"constraints":[{"operator":"==","role":"filter","value":"No","variable":"child_entitlement"},{"operator":"==","role":"filter","value":"Single, no children","variable":"family_type"}],"domain":"universal_credit"},"value":3725304,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:85f76449349c19bb159a6c91","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:09dda486cf7db778ead24cee","evidence_notes":"Stat-Xplore 'Households on Universal Credit' dataset, April to December 2025, Great Britain, dimensioned by Family Type x Child Entitlement (Yes/No child element in the award); query echoed in the archived API response. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.","evidence_url":"https://stat-xplore.dwp.gov.uk/","relation":"source_label","source_concept":"dwp.uc_households"},"dimension_set_key":"ledger.dimension_set.v2:495eb430d4b772790312eba1","dimensions":{"child_entitlement":"Yes","family_type":"Single, no children"},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=Yes, family type=Single, no children) [dwp Households on Universal Credit by family type and child entitlement, April to December 2025 uc_households_by_family_type_and_child_entitlement_april_december_2025.json stat_xplore_2026_09_03]","layout":{"groupby_dimension":"dwp.uc_family_type","groupby_ordinal":1,"groupby_value_id":"single_no_children__child_entitlement_yes","groupby_value_label":"Single, no children, Yes","measure_id":"benefit_units","measure_label":"Universal Credit benefit units","measure_ordinal":0,"record_set_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12","record_set_spec_hash":"dab983bf1f93719dc9bae15f","record_set_spec_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.v1","source_column_id":"value","source_row_id":"single_no_children__child_entitlement_yes","table_record_kind":"detail"},"legacy_fact_key":"ledger.fact.v1:bc0d92df043c9f40a9effc06","lineage":{"source_cell_keys":["ledger.source_cell.v1:27b4e92b5513ed83d579d3ac","ledger.source_cell.v1:0c41fe6b0bac0d72d333912b","ledger.source_cell.v1:c3571d34e1e2c350b14a2207","ledger.source_cell.v1:c7f95e839229727bd51ec527"],"source_record_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.single_no_children__child_entitlement_yes.benefit_units","source_row_keys":["ledger.source_row.v1:082c4210d73f3e7e341900b6"]},"observed_measure":{"source_concept":"dwp.uc_households","source_measure_id":"benefit_units","source_name":"dwp","source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:6558eead1d59f9127b44b69c","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:01d64fbeac1b570c39341979","source":{"extracted_at":"2026-09-03","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","raw_r2_uri":"r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_file":"uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_name":"dwp","source_sha256":"e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57","source_size_bytes":7982,"source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","url":"https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table","vintage":"stat_xplore_2026_09_03"},"source_release_key":"ledger.source_release.v2:53a9199f091f47dccea365ad","source_series_key":"ledger.source_series.v2:3dc492a8c67367b1a504f325","universe_constraint_set_key":"ledger.universe_constraint_set.v2:2b63c9d7c2f0f41b9658107d","universe_constraints":{"constraints":[{"operator":"==","role":"filter","value":"Single, no children","variable":"family_type"},{"operator":"==","role":"filter","value":"Yes","variable":"child_entitlement"}],"domain":"universal_credit"},"value":0,"value_type":"integer"} -{"aggregate_fact_key":"ledger.aggregate_fact.v2:5aa061e9646fbdc02bd4a085","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"hmrc","canonical_concept":"hmrc.cgt_gains_total","concept_alignment_key":"ledger.concept_alignment.v2:34d7a5f81f71c492efa47670","evidence_notes":"HMRC CGT statistics 2026, Table 5.2, 2023-24; counts are thousands and amounts are GBP millions. Totals may not sum due to rounding.","evidence_url":"https://www.gov.uk/government/statistics/capital-gains-tax-statistics","relation":"source_label","source_concept":"hmrc.cgt_gains_total"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"tax_unit","role":"taxpayer"},"geography":{"id":"K02000001","level":"country","vintage":"current"},"label":"United Kingdom 2023 tax year sum hmrc cgt gains total for tax unit [hmrc Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region Table_5_2026_Regional_and_country_statistics.ods cgt_statistics_2026]","layout":{"groupby_dimension":"geography","groupby_ordinal":13,"groupby_value_id":"united_kingdom","groupby_value_label":"All","measure_id":"gains_total","measure_label":"Chargeable gains","measure_ordinal":1,"record_set_id":"hmrc.cgt_table5_2026.country_region.ty2023","record_set_spec_hash":"8833b02c01989c693a472337","record_set_spec_id":"hmrc.cgt_table5_2026.country_region.ty2023.v1","source_column_id":"gains_total","source_row_id":"united_kingdom","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:8407be8451e6db778f937a9c","lineage":{"source_cell_keys":["ledger.source_cell.v1:548faaf161cadaa95bace267","ledger.source_cell.v1:8c159702fdca46b498e490e0"],"source_record_id":"hmrc.cgt_table5_2026.country_region.ty2023.united_kingdom.gains_total","source_row_keys":[]},"observed_measure":{"source_concept":"hmrc.cgt_gains_total","source_measure_id":"gains_total","source_name":"hmrc","source_table":"Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region","unit":"gbp"},"observed_measure_key":"ledger.observed_measure.v2:43fb4aa41756b5bb790f9aea","period":{"type":"tax_year","value":2023},"period_coverage":{"basis":"tax","end_date":"2024-04-05","notes":"HMRC marks the 2023-24 statistics as provisional.","source_period_label":"2023 to 2024 tax year","start_date":"2023-04-06"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:6ad7e1343da03e00fadd6fcd","source":{"extracted_at":"2026-09-03","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/uk/hmrc/hmrc-cgt-country-region-2026/2026/dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509/Table_5_2026_Regional_and_country_statistics.ods","raw_r2_uri":"r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-country-region-2026/2026/dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509/Table_5_2026_Regional_and_country_statistics.ods","source_file":"Table_5_2026_Regional_and_country_statistics.ods","source_name":"hmrc","source_sha256":"dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509","source_size_bytes":6754,"source_table":"Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region","url":"https://assets.publishing.service.gov.uk/media/6a7b2444114277b327805c10/Table_5_2026_Regional_and_country_statistics.ods","vintage":"cgt_statistics_2026"},"source_release_key":"ledger.source_release.v2:d10fd3dc0ffe6f47c4a6b18f","source_series_key":"ledger.source_series.v2:9da935e197cb0f11c42670b5","universe_constraint_set_key":"ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb","universe_constraints":{"domain":"capital_gains_tax"},"value":69861000000,"value_type":"integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:a328029c7fdf199c7bb8ed72", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-04 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "April 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_04.total_units", "record_set_spec_hash": "4b5a84f57f36e8654216696a", "record_set_spec_id": "dwp.uc_deductions.month2025_04.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:460f79382edab88773973ef5", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:dd1d91de62f0f227a5d2158c", "ledger.source_cell.v1:43004e85396ce7be9004f6d1"], "source_record_id": "dwp.uc_deductions.month2025_04.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-04"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:e4d7cc18902f0908808e62ec", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:90803eebc1970c036317afd2", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6380000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:8166527e94709e1cf6f05d83", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-05 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "May 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_05.total_units", "record_set_spec_hash": "0c949577abc5d27616f8349d", "record_set_spec_id": "dwp.uc_deductions.month2025_05.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:9e623691a35d8e3b1bde5368", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:7e171e5eb2301b4bb9fc3d1b", "ledger.source_cell.v1:b181dacd39f539b014c2b1ff"], "source_record_id": "dwp.uc_deductions.month2025_05.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-05"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:8fd726b2e9e0a4f811e835e7", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:2b33c933b0135dfa7ed509e4", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6600000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:a90579c0ebd5dbf68afff710", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-06 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "June 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_06.total_units", "record_set_spec_hash": "28c08eaae7fbb7ad17c1ac13", "record_set_spec_id": "dwp.uc_deductions.month2025_06.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:422b2ea82994dae684f67b76", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:187cc3e9db9f8b0be51eaf51", "ledger.source_cell.v1:cfed2d23ccf618b5ab6aebe6"], "source_record_id": "dwp.uc_deductions.month2025_06.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-06"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:1c029a40f45e74ca403873b5", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:ae7cf0037f9e218e85e35c73", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6600000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:d941d4d411e201f422109b86", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-07 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "July 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_07.total_units", "record_set_spec_hash": "340bf32fe9ab41eb16239dd6", "record_set_spec_id": "dwp.uc_deductions.month2025_07.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:e487647ff402c5001b8073dc", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:89a075156cfc8d032f47b86b", "ledger.source_cell.v1:e550caea5042fa74aa2dec68"], "source_record_id": "dwp.uc_deductions.month2025_07.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-07"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:4c90cf3499b64cce5b22397d", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:91c69f13e601d44a6d06f319", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6600000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:ade75a0fb6b3ed6458572b31", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-08 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "August 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_08.total_units", "record_set_spec_hash": "b9e0181d5c9445df25901f77", "record_set_spec_id": "dwp.uc_deductions.month2025_08.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:963853d12edc803f7a330997", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:f5ee3feedf046059caacb746", "ledger.source_cell.v1:56677aaa6b0d4dfe8b94edf4"], "source_record_id": "dwp.uc_deductions.month2025_08.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-08"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:52bab6c2d4d29a967fd77aa1", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:12208a0616c70228706137fb", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6600000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:a9c3416e28feeef8e244bb05", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-09 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "September 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_09.total_units", "record_set_spec_hash": "c0ed641837240192393c72fc", "record_set_spec_id": "dwp.uc_deductions.month2025_09.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:0179c54da44d6faf702d48c6", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:eb5385892a237a0f74d03fbd", "ledger.source_cell.v1:29737e7d00ba6bee57052178"], "source_record_id": "dwp.uc_deductions.month2025_09.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-09"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:c0186e43ac2877c66fb53791", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:59c6763a019f8187de881a1f", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6960000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:e903b85f11e958e665e109ce", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-10 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "October 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_10.total_units", "record_set_spec_hash": "e363a40ffe8ba5be1d5d1374", "record_set_spec_id": "dwp.uc_deductions.month2025_10.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:08fa70b4c9a1e3c9786f3a07", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:eb41b6281a4c461864a78e92", "ledger.source_cell.v1:e24183b55c7b9706b6845c3f"], "source_record_id": "dwp.uc_deductions.month2025_10.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-10"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:7a65f23de0b76a649e66f052", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:368a9e8dbf1a2f98d4553d7a", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6960000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:3f7a2cac5cb15ff130737128", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-11 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "November 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_11.total_units", "record_set_spec_hash": "4aad47485f95ab3d7d4d1c7b", "record_set_spec_id": "dwp.uc_deductions.month2025_11.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:626e91b656d1641442c0f52b", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:4c67a56211c72ee9c72e24b1", "ledger.source_cell.v1:9d66ea77298496b49d57e5eb"], "source_record_id": "dwp.uc_deductions.month2025_11.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-11"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:95d829a31671e6c36f7dea1c", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:c56f7dc6f3c50e99ab7f9bef", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 6960000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:3270b0f656838ddd01b1ac5f", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:f926aa77f065d747d171dac7", "evidence_notes": "Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026", "relation": "source_label", "source_concept": "dwp.uc_benefit_units"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-12 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]", "layout": {"groupby_dimension": "dwp.uc_deductions_month", "groupby_ordinal": 0, "groupby_value_id": "month", "groupby_value_label": "December 2025", "measure_id": "total_units", "measure_label": "Total UC benefit units", "measure_ordinal": 0, "record_set_id": "dwp.uc_deductions.month2025_12.total_units", "record_set_spec_hash": "16402b5f5a5582752fcbed2f", "record_set_spec_id": "dwp.uc_deductions.month2025_12.total_units.v1", "source_column_id": "total_units", "source_row_id": "month", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:50f5e4ff94e17c8653a224d6", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:f8d9331a5f2fdc078091e6d3", "ledger.source_cell.v1:4e93cb84089e9349b2920ecb"], "source_record_id": "dwp.uc_deductions.month2025_12.total_units.month.total_units", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_benefit_units", "source_measure_id": "total_units", "source_name": "dwp", "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:33357036d21a31ac02d72984", "period": {"type": "month", "value": "2025-12"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:64e68c0ee81b5671623a62da", "source": {"extracted_at": "2026-08-19", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods", "source_file": "universal-credit-deductions-march-2025-to-february-2026.ods", "source_name": "dwp", "source_sha256": "307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b", "source_size_bytes": 148671, "source_table": "Universal Credit deductions statistics March 2025 to February 2026, Table 1", "url": "https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods", "vintage": "uc_deductions_2026_05_12"}, "source_release_key": "ledger.source_release.v2:fbd0f132a18af51870b6097e", "source_series_key": "ledger.source_series.v2:f6a6850862a484d6deda79cf", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4", "universe_constraints": {"domain": "universal_credit"}, "value": 7170000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:867e898d362e2ee81b1cc0e9", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:09dda486cf7db778ead24cee", "evidence_notes": "Stat-Xplore 'Households on Universal Credit' dataset, April to December 2025, Great Britain, dimensioned by Family Type x Child Entitlement (Yes/No child element in the award); query echoed in the archived API response. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:ae9c0d568952f7be7b3de1f9", "dimensions": {"child_entitlement": "No", "family_type": "Single, no children"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=No, family type=Single, no children) [dwp Households on Universal Credit by family type and child entitlement, April to December 2025 uc_households_by_family_type_and_child_entitlement_april_december_2025.json stat_xplore_2026_09_03]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 0, "groupby_value_id": "single_no_children__child_entitlement_no", "groupby_value_label": "Single, no children, No", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12", "record_set_spec_hash": "dab983bf1f93719dc9bae15f", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.v1", "source_column_id": "value", "source_row_id": "single_no_children__child_entitlement_no", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:fab9f35da80a56fdda84f8e6", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:10a71527160c9d4a18317afe", "ledger.source_cell.v1:0c41fe6b0bac0d72d333912b", "ledger.source_cell.v1:824115f66eda83ea3c5ab675", "ledger.source_cell.v1:00831bec4108708177b8fcc7"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.single_no_children__child_entitlement_no.benefit_units", "source_row_keys": ["ledger.source_row.v1:92309fe1032298725d412418"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type and child entitlement, April to December 2025", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:6558eead1d59f9127b44b69c", "period": {"type": "month", "value": "2025-12"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:a770bf82683e66343b177403", "source": {"extracted_at": "2026-09-03", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json", "source_file": "uc_households_by_family_type_and_child_entitlement_april_december_2025.json", "source_name": "dwp", "source_sha256": "e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57", "source_size_bytes": 7982, "source_table": "Households on Universal Credit by family type and child entitlement, April to December 2025", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_03"}, "source_release_key": "ledger.source_release.v2:53a9199f091f47dccea365ad", "source_series_key": "ledger.source_series.v2:3dc492a8c67367b1a504f325", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:8d094e2ba14699028215a5f8", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "No", "variable": "child_entitlement"}, {"operator": "==", "role": "filter", "value": "Single, no children", "variable": "family_type"}], "domain": "universal_credit"}, "value": 3725304, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:85f76449349c19bb159a6c91", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:09dda486cf7db778ead24cee", "evidence_notes": "Stat-Xplore 'Households on Universal Credit' dataset, April to December 2025, Great Britain, dimensioned by Family Type x Child Entitlement (Yes/No child element in the award); query echoed in the archived API response. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:495eb430d4b772790312eba1", "dimensions": {"child_entitlement": "Yes", "family_type": "Single, no children"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=Yes, family type=Single, no children) [dwp Households on Universal Credit by family type and child entitlement, April to December 2025 uc_households_by_family_type_and_child_entitlement_april_december_2025.json stat_xplore_2026_09_03]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 1, "groupby_value_id": "single_no_children__child_entitlement_yes", "groupby_value_label": "Single, no children, Yes", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12", "record_set_spec_hash": "dab983bf1f93719dc9bae15f", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.v1", "source_column_id": "value", "source_row_id": "single_no_children__child_entitlement_yes", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:bc0d92df043c9f40a9effc06", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:27b4e92b5513ed83d579d3ac", "ledger.source_cell.v1:0c41fe6b0bac0d72d333912b", "ledger.source_cell.v1:c3571d34e1e2c350b14a2207", "ledger.source_cell.v1:c7f95e839229727bd51ec527"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.single_no_children__child_entitlement_yes.benefit_units", "source_row_keys": ["ledger.source_row.v1:082c4210d73f3e7e341900b6"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type and child entitlement, April to December 2025", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:6558eead1d59f9127b44b69c", "period": {"type": "month", "value": "2025-12"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:01d64fbeac1b570c39341979", "source": {"extracted_at": "2026-09-03", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json", "source_file": "uc_households_by_family_type_and_child_entitlement_april_december_2025.json", "source_name": "dwp", "source_sha256": "e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57", "source_size_bytes": 7982, "source_table": "Households on Universal Credit by family type and child entitlement, April to December 2025", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_03"}, "source_release_key": "ledger.source_release.v2:53a9199f091f47dccea365ad", "source_series_key": "ledger.source_series.v2:3dc492a8c67367b1a504f325", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:2b63c9d7c2f0f41b9658107d", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "Single, no children", "variable": "family_type"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "child_entitlement"}], "domain": "universal_credit"}, "value": 0, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:5aa061e9646fbdc02bd4a085", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.cgt_gains_total", "concept_alignment_key": "ledger.concept_alignment.v2:34d7a5f81f71c492efa47670", "evidence_notes": "HMRC CGT statistics 2026, Table 5.2, 2023-24; counts are thousands and amounts are GBP millions. Totals may not sum due to rounding.", "evidence_url": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "relation": "source_label", "source_concept": "hmrc.cgt_gains_total"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "tax_unit", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 tax year sum hmrc cgt gains total for tax unit [hmrc Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region Table_5_2026_Regional_and_country_statistics.ods cgt_statistics_2026]", "layout": {"groupby_dimension": "geography", "groupby_ordinal": 13, "groupby_value_id": "united_kingdom", "groupby_value_label": "All", "measure_id": "gains_total", "measure_label": "Chargeable gains", "measure_ordinal": 1, "record_set_id": "hmrc.cgt_table5_2026.country_region.ty2023", "record_set_spec_hash": "8833b02c01989c693a472337", "record_set_spec_id": "hmrc.cgt_table5_2026.country_region.ty2023.v1", "source_column_id": "gains_total", "source_row_id": "united_kingdom", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:8407be8451e6db778f937a9c", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:548faaf161cadaa95bace267", "ledger.source_cell.v1:8c159702fdca46b498e490e0"], "source_record_id": "hmrc.cgt_table5_2026.country_region.ty2023.united_kingdom.gains_total", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.cgt_gains_total", "source_measure_id": "gains_total", "source_name": "hmrc", "source_table": "Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:43fb4aa41756b5bb790f9aea", "period": {"type": "tax_year", "value": 2023}, "period_coverage": {"basis": "tax", "end_date": "2024-04-05", "notes": "HMRC marks the 2023-24 statistics as provisional.", "source_period_label": "2023 to 2024 tax year", "start_date": "2023-04-06"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:6ad7e1343da03e00fadd6fcd", "source": {"extracted_at": "2026-09-03", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/hmrc/hmrc-cgt-country-region-2026/2026/dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509/Table_5_2026_Regional_and_country_statistics.ods", "raw_r2_uri": "r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-country-region-2026/2026/dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509/Table_5_2026_Regional_and_country_statistics.ods", "source_file": "Table_5_2026_Regional_and_country_statistics.ods", "source_name": "hmrc", "source_sha256": "dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509", "source_size_bytes": 6754, "source_table": "Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region", "url": "https://assets.publishing.service.gov.uk/media/6a7b2444114277b327805c10/Table_5_2026_Regional_and_country_statistics.ods", "vintage": "cgt_statistics_2026"}, "source_release_key": "ledger.source_release.v2:d10fd3dc0ffe6f47c4a6b18f", "source_series_key": "ledger.source_series.v2:9da935e197cb0f11c42670b5", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", "universe_constraints": {"domain": "capital_gains_tax"}, "value": 69861000000, "value_type": "integer"} {"aggregate_fact_key":"ledger.aggregate_fact.v2:8f37a13228973c48fc995636","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:860b334af7b847863e2a3cca","evidence_notes":"DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.","evidence_url":"https://stat-xplore.dwp.gov.uk/","relation":"source_label","source_concept":"dwp.uc_households"},"dimension_set_key":"ledger.dimension_set.v2:5545826c91c747d11abed49d","dimensions":{"family_type":"Single, no children"},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit (family type=Single, no children) [dwp Households on Universal Credit by family type, April to December 2025 uc_households_by_family_type_april_december_2025.json stat_xplore_2026_08_21]","layout":{"groupby_dimension":"dwp.uc_family_type","groupby_ordinal":0,"groupby_value_id":"single_no_children","groupby_value_label":"Single, no children","measure_id":"benefit_units","measure_label":"Universal Credit benefit units","measure_ordinal":0,"record_set_id":"dwp.statx.uc_benefit_units.family_type.month2025_12","record_set_spec_hash":"357b86a76459eaa25b8e4970","record_set_spec_id":"dwp.statx.uc_benefit_units.family_type.month2025_12.v1","source_column_id":"value","source_row_id":"single_no_children","table_record_kind":"detail"},"legacy_fact_key":"ledger.fact.v1:a55361780162a5f037bb4269","lineage":{"source_cell_keys":["ledger.source_cell.v1:81dac94b4efac9d470df5212","ledger.source_cell.v1:75fe7cb0782ae4a1d4b2b998","ledger.source_cell.v1:a93f2173e0f33aec12a6f616"],"source_record_id":"dwp.statx.uc_benefit_units.family_type.month2025_12.single_no_children.benefit_units","source_row_keys":["ledger.source_row.v1:19555d267fc2d26a980bb8af"]},"observed_measure":{"source_concept":"dwp.uc_households","source_measure_id":"benefit_units","source_name":"dwp","source_table":"Households on Universal Credit by family type, April to December 2025","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:0b509058163e2c841aa5b37e","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:6c2b863ec0432f9ad07848de","source":{"extracted_at":"2026-08-21","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-households-family-type-april-december-2025/2025/44d67348da8c34465611ac00efdfcb80a69ad0f52e788d53f82517b34594377f/uc_households_by_family_type_april_december_2025.json","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-households-family-type-april-december-2025/2025/44d67348da8c34465611ac00efdfcb80a69ad0f52e788d53f82517b34594377f/uc_households_by_family_type_april_december_2025.json","source_file":"uc_households_by_family_type_april_december_2025.json","source_name":"dwp","source_sha256":"44d67348da8c34465611ac00efdfcb80a69ad0f52e788d53f82517b34594377f","source_size_bytes":6719,"source_table":"Households on Universal Credit by family type, April to December 2025","url":"https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table","vintage":"stat_xplore_2026_08_21"},"source_release_key":"ledger.source_release.v2:9f8efed9887bd5a010eaade7","source_series_key":"ledger.source_series.v2:422a6a7d47249f00aab1204c","universe_constraint_set_key":"ledger.universe_constraint_set.v2:f3eacc541532777e223cccae","universe_constraints":{"constraints":[{"operator":"==","role":"filter","value":"Single, no children","variable":"family_type"}],"domain":"universal_credit"},"value":3725304,"value_type":"integer"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:f2bce3d09b025c858987e320", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:08f8c4aaef975d6b11f3aab3", "evidence_notes": "DWP UC_Households cube cells for April 2023 to May 2026, by family type, payment indicator and child entitlement, preserve the publisher labels and value URIs. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:16b7c39486d78e799586f669", "dimensions": {"child_entitlement": "No", "family_type": "Single, no children", "payment_indicator": "Yes"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-01 month count dwp uc benefit units for benefit unit (child entitlement=No, family type=Single, no children, payment indicator=Yes) [dwp Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026 uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json stat_xplore_2026_09_08]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 2, "groupby_value_id": "single_no_children__payment_indicator_yes__child_entitlement_no", "groupby_value_label": "Single, no children, Yes, No", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_01", "record_set_spec_hash": "5bbe157959325a2bc1c13aa4", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_01.v1", "source_column_id": "value", "source_row_id": "single_no_children__payment_indicator_yes__child_entitlement_no", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:4f9fb1cda80d3ce45a9f5439", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:2543ef8500edb27f02d5c4e6", "ledger.source_cell.v1:606a534ed95398c6fd197c77", "ledger.source_cell.v1:b2d3d9753d8f7d6d9ffc92bd", "ledger.source_cell.v1:e33ac450f2b135a47ae0bc64", "ledger.source_cell.v1:da7056934d78be4ee312f5e8"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_01.single_no_children__payment_indicator_yes__child_entitlement_no.benefit_units", "source_row_keys": ["ledger.source_row.v1:4665639f919acff2d7be56ff"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:a09cccfae59dd42ceb46e057", "period": {"type": "month", "value": "2025-01"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:e8dc2a443026d7ed7038c3e7", "source": {"extracted_at": "2026-09-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_file": "uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_name": "dwp", "source_sha256": "f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550", "source_size_bytes": 22466, "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_08"}, "source_release_key": "ledger.source_release.v2:6872f79870d0a90db8362a75", "source_series_key": "ledger.source_series.v2:1e9c367200b51b6b2a9e979f", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:0589dd87023041726f275ebd", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "No", "variable": "child_entitlement"}, {"operator": "==", "role": "filter", "value": "Single, no children", "variable": "family_type"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "payment_indicator"}], "domain": "universal_credit"}, "value": 2563319, "value_type": "integer"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:c70741fd7dce8ea798addf6b", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:08f8c4aaef975d6b11f3aab3", "evidence_notes": "DWP UC_Households cube cells for April 2023 to May 2026, by family type, payment indicator and child entitlement, preserve the publisher labels and value URIs. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:c7ff39c1ae46e8482082e780", "dimensions": {"child_entitlement": "Yes", "family_type": "Single, no children", "payment_indicator": "Yes"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-01 month count dwp uc benefit units for benefit unit (child entitlement=Yes, family type=Single, no children, payment indicator=Yes) [dwp Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026 uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json stat_xplore_2026_09_08]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 3, "groupby_value_id": "single_no_children__payment_indicator_yes__child_entitlement_yes", "groupby_value_label": "Single, no children, Yes, Yes", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_01", "record_set_spec_hash": "5bbe157959325a2bc1c13aa4", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_01.v1", "source_column_id": "value", "source_row_id": "single_no_children__payment_indicator_yes__child_entitlement_yes", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:4d8b72f7f47b55fcd1f77d39", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:1c313c4d4c76a6b717854c42", "ledger.source_cell.v1:606a534ed95398c6fd197c77", "ledger.source_cell.v1:557a418274f15177d946c484", "ledger.source_cell.v1:cb77118f25f4b4e4ffbd494e", "ledger.source_cell.v1:9b344a7fcc17a1ae52a26039"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_01.single_no_children__payment_indicator_yes__child_entitlement_yes.benefit_units", "source_row_keys": ["ledger.source_row.v1:4dbaa5cd7320ab2fcb98b22f"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:a09cccfae59dd42ceb46e057", "period": {"type": "month", "value": "2025-01"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:439d783df4e86219a61b78e6", "source": {"extracted_at": "2026-09-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_file": "uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_name": "dwp", "source_sha256": "f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550", "source_size_bytes": 22466, "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_08"}, "source_release_key": "ledger.source_release.v2:6872f79870d0a90db8362a75", "source_series_key": "ledger.source_series.v2:1e9c367200b51b6b2a9e979f", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:16d6b0b5f779bdd2c29e1448", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "Single, no children", "variable": "family_type"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "child_entitlement"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "payment_indicator"}], "domain": "universal_credit"}, "value": 0, "value_type": "integer"} @@ -140,3 +140,7 @@ {"aggregate_fact_key": "ledger.aggregate_fact.v2:1a76243d3f616b19eaed3e0a", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:08f8c4aaef975d6b11f3aab3", "evidence_notes": "DWP UC_Households cube cells for April 2023 to May 2026, by family type, payment indicator and child entitlement, preserve the publisher labels and value URIs. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:daad9feaec975f8ae0394df2", "dimensions": {"child_entitlement": "Yes", "family_type": "Couple, with children", "payment_indicator": "Yes"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=Yes, family type=Couple, with children, payment indicator=Yes) [dwp Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026 uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json stat_xplore_2026_09_08]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 15, "groupby_value_id": "couple_with_children__payment_indicator_yes__child_entitlement_yes", "groupby_value_label": "Couple, with children, Yes, Yes", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12", "record_set_spec_hash": "3c229c1669874f43878e57cc", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12.v1", "source_column_id": "value", "source_row_id": "couple_with_children__payment_indicator_yes__child_entitlement_yes", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:306a3468e6c18aeb774b6ac3", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:93229df8d1e89e603732899a", "ledger.source_cell.v1:606a534ed95398c6fd197c77", "ledger.source_cell.v1:74b1490723cf7ffe2301760f", "ledger.source_cell.v1:d1f1523a0d42bc0c0c273cc8", "ledger.source_cell.v1:7d6dd386f8637894d5ee3928"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12.couple_with_children__payment_indicator_yes__child_entitlement_yes.benefit_units", "source_row_keys": ["ledger.source_row.v1:9329c9f753a61e622acbfefd"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:a09cccfae59dd42ceb46e057", "period": {"type": "month", "value": "2025-12"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:e91c12e936b80912539fc282", "source": {"extracted_at": "2026-09-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_file": "uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_name": "dwp", "source_sha256": "f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550", "source_size_bytes": 22466, "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_08"}, "source_release_key": "ledger.source_release.v2:6872f79870d0a90db8362a75", "source_series_key": "ledger.source_series.v2:7fb31f6c00c414c098598aad", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:52b3ac853cd223288e91de1a", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "Couple, with children", "variable": "family_type"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "child_entitlement"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "payment_indicator"}], "domain": "universal_credit"}, "value": 775582, "value_type": "integer"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:472205ab32cb0d3fd4429e03", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:08f8c4aaef975d6b11f3aab3", "evidence_notes": "DWP UC_Households cube cells for April 2023 to May 2026, by family type, payment indicator and child entitlement, preserve the publisher labels and value URIs. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:db2c7c902a159fb3d3bb606d", "dimensions": {"child_entitlement": "No", "family_type": "Unknown or missing family type", "payment_indicator": "Yes"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=No, family type=Unknown or missing family type, payment indicator=Yes) [dwp Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026 uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json stat_xplore_2026_09_08]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 18, "groupby_value_id": "unknown_or_missing_family_type__payment_indicator_yes__child_entitlement_no", "groupby_value_label": "Unknown or missing family type, Yes, No", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12", "record_set_spec_hash": "3c229c1669874f43878e57cc", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12.v1", "source_column_id": "value", "source_row_id": "unknown_or_missing_family_type__payment_indicator_yes__child_entitlement_no", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:8cf9251856f095dd41d03762", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:d2e9b3c554f3eaab7ec46b5a", "ledger.source_cell.v1:606a534ed95398c6fd197c77", "ledger.source_cell.v1:a47de826f4ab59efc2682c02", "ledger.source_cell.v1:deac1a081f7bff96e2ae804d", "ledger.source_cell.v1:774d94e0fc41c2010f836a50"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12.unknown_or_missing_family_type__payment_indicator_yes__child_entitlement_no.benefit_units", "source_row_keys": ["ledger.source_row.v1:4c9668a7afcfcf6a34b2a948"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:a09cccfae59dd42ceb46e057", "period": {"type": "month", "value": "2025-12"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:a917ad77355083d87120562f", "source": {"extracted_at": "2026-09-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_file": "uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_name": "dwp", "source_sha256": "f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550", "source_size_bytes": 22466, "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_08"}, "source_release_key": "ledger.source_release.v2:6872f79870d0a90db8362a75", "source_series_key": "ledger.source_series.v2:7fb31f6c00c414c098598aad", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:ae6ec7d380eb3be11ea4e406", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "No", "variable": "child_entitlement"}, {"operator": "==", "role": "filter", "value": "Unknown or missing family type", "variable": "family_type"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "payment_indicator"}], "domain": "universal_credit"}, "value": 0, "value_type": "integer"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:71c060f3f2a732e2f836a5d8", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_benefit_units", "concept_alignment_key": "ledger.concept_alignment.v2:08f8c4aaef975d6b11f3aab3", "evidence_notes": "DWP UC_Households cube cells for April 2023 to May 2026, by family type, payment indicator and child entitlement, preserve the publisher labels and value URIs. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.", "evidence_url": "https://stat-xplore.dwp.gov.uk/", "relation": "source_label", "source_concept": "dwp.uc_households"}, "dimension_set_key": "ledger.dimension_set.v2:0669a58d943af8c31456ac2d", "dimensions": {"child_entitlement": "Yes", "family_type": "Unknown or missing family type", "payment_indicator": "Yes"}, "entity": {"name": "benefit_unit", "role": "universal_credit_unit_of_assessment"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=Yes, family type=Unknown or missing family type, payment indicator=Yes) [dwp Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026 uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json stat_xplore_2026_09_08]", "layout": {"groupby_dimension": "dwp.uc_family_type", "groupby_ordinal": 19, "groupby_value_id": "unknown_or_missing_family_type__payment_indicator_yes__child_entitlement_yes", "groupby_value_label": "Unknown or missing family type, Yes, Yes", "measure_id": "benefit_units", "measure_label": "Universal Credit benefit units", "measure_ordinal": 0, "record_set_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12", "record_set_spec_hash": "3c229c1669874f43878e57cc", "record_set_spec_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12.v1", "source_column_id": "value", "source_row_id": "unknown_or_missing_family_type__payment_indicator_yes__child_entitlement_yes", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:7af7bf378c0819a9735f92d3", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:05e697819331ebac2b921b5d", "ledger.source_cell.v1:606a534ed95398c6fd197c77", "ledger.source_cell.v1:769247748b2f68de4fcfe22b", "ledger.source_cell.v1:66416d6193aa80c0ee972a4d", "ledger.source_cell.v1:884505764cf5e99f6613bb4e"], "source_record_id": "dwp.statx.uc_benefit_units.family_type_payment_indicator_child_entitlement.month2025_12.unknown_or_missing_family_type__payment_indicator_yes__child_entitlement_yes.benefit_units", "source_row_keys": ["ledger.source_row.v1:1de61b4677dcbd14f42eda59"]}, "observed_measure": {"source_concept": "dwp.uc_households", "source_measure_id": "benefit_units", "source_name": "dwp", "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:a09cccfae59dd42ceb46e057", "period": {"type": "month", "value": "2025-12"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:6c90486fb3711b6d7971e7a9", "source": {"extracted_at": "2026-09-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "raw_r2_uri": "r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-payment-indicator-child-entitlement-april-2023-may-2026/2025/f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550/uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_file": "uc_households_by_family_type_payment_indicator_and_child_entitlement_april_2023_may_2026.json", "source_name": "dwp", "source_sha256": "f4fb46fefd66a20b8d6d12c051a224743b6754fee53e1cee0be5ead4d34de550", "source_size_bytes": 22466, "source_table": "Households on Universal Credit by family type, payment indicator and child entitlement, April 2023 to May 2026", "url": "https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table", "vintage": "stat_xplore_2026_09_08"}, "source_release_key": "ledger.source_release.v2:6872f79870d0a90db8362a75", "source_series_key": "ledger.source_series.v2:7fb31f6c00c414c098598aad", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:6b83817d0f0fde335b6c9654", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "Unknown or missing family type", "variable": "family_type"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "child_entitlement"}, {"operator": "==", "role": "filter", "value": "Yes", "variable": "payment_indicator"}], "domain": "universal_credit"}, "value": 1246, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:31d709fc393c2bf4d04efca5", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.cgt_taxpayers_individuals", "concept_alignment_key": "ledger.concept_alignment.v2:8bfdd3520a6413c3b60f4a2b", "evidence_notes": "CGT statistics 2026 release, Table 1, year of disposal 2024 to 2025; counts in thousands, amounts GBP million. Provisional per publication notes.", "evidence_url": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "relation": "source_label", "source_concept": "hmrc.cgt_taxpayers_individuals"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "tax_unit", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2024 tax year count hmrc cgt taxpayers individuals for tax unit [hmrc Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods cgt_statistics_2026]", "layout": {"groupby_dimension": "hmrc.cgt_table1_line", "groupby_ordinal": 0, "groupby_value_id": "ty2024", "groupby_value_label": "Year of disposal 2024 to 2025", "measure_id": "individuals_count", "measure_label": "CGT individuals", "measure_ordinal": 0, "record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", "record_set_spec_hash": "a6e2cfe0ff499a7803f235b9", "record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", "source_column_id": "individuals_count", "source_row_id": "ty2024", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:2944e255963210efe631cbb3", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:dee75435ee62f34ab74b09f8", "ledger.source_cell.v1:a9d77284a3d10fb3af258097"], "source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.individuals_count", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.cgt_taxpayers_individuals", "source_measure_id": "individuals_count", "source_name": "hmrc", "source_table": "Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:4cc22757ebd4fd8bdb5b45ad", "period": {"type": "tax_year", "value": 2024}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:813226f79ce5af29f274cef7", "source": {"extracted_at": "2026-09-03", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/hmrc/hmrc-cgt-statistics-2026/2026/d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "raw_r2_uri": "r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-statistics-2026/2026/d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "source_file": "Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "source_name": "hmrc", "source_sha256": "d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef", "source_size_bytes": 9696, "source_table": "Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal", "url": "https://assets.publishing.service.gov.uk/media/6a7b23f1bbafcd1db3b6e420/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "vintage": "cgt_statistics_2026"}, "source_release_key": "ledger.source_release.v2:a894879170042e399a418f69", "source_series_key": "ledger.source_series.v2:d55b5fe72802837d324640b3", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", "universe_constraints": {"domain": "capital_gains_tax"}, "value": 551000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:12060d20a417d85d67cf24e8", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.cgt_gains_individuals", "concept_alignment_key": "ledger.concept_alignment.v2:712eab328c2a6a07c0e261c8", "evidence_notes": "CGT statistics 2026 release, Table 1, year of disposal 2024 to 2025; counts in thousands, amounts GBP million. Provisional per publication notes.", "evidence_url": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "relation": "source_label", "source_concept": "hmrc.cgt_gains_individuals"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "tax_unit", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2024 tax year sum hmrc cgt gains individuals for tax unit [hmrc Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods cgt_statistics_2026]", "layout": {"groupby_dimension": "hmrc.cgt_table1_line", "groupby_ordinal": 0, "groupby_value_id": "ty2024", "groupby_value_label": "Year of disposal 2024 to 2025", "measure_id": "individuals_gains", "measure_label": "Chargeable gains, individuals", "measure_ordinal": 1, "record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", "record_set_spec_hash": "a6e2cfe0ff499a7803f235b9", "record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", "source_column_id": "individuals_gains", "source_row_id": "ty2024", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:81f33d75ccbf5ee5117b3c7c", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:9f9a66fb7d3db43416f3e800", "ledger.source_cell.v1:5597f55e10149171c3df201b"], "source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.individuals_gains", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.cgt_gains_individuals", "source_measure_id": "individuals_gains", "source_name": "hmrc", "source_table": "Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:eefc11e7f0292ad4350062e8", "period": {"type": "tax_year", "value": 2024}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:1c1a1339fa42073bcb95e119", "source": {"extracted_at": "2026-09-03", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/hmrc/hmrc-cgt-statistics-2026/2026/d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "raw_r2_uri": "r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-statistics-2026/2026/d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "source_file": "Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "source_name": "hmrc", "source_sha256": "d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef", "source_size_bytes": 9696, "source_table": "Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal", "url": "https://assets.publishing.service.gov.uk/media/6a7b23f1bbafcd1db3b6e420/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "vintage": "cgt_statistics_2026"}, "source_release_key": "ledger.source_release.v2:a894879170042e399a418f69", "source_series_key": "ledger.source_series.v2:d55b5fe72802837d324640b3", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", "universe_constraints": {"domain": "capital_gains_tax"}, "value": 119258000000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.cgt_tax_individuals", "concept_alignment_key": "ledger.concept_alignment.v2:0e8155d8bbb3cf7e0eb4bb42", "evidence_notes": "CGT statistics 2026 release, Table 1, year of disposal 2024 to 2025; counts in thousands, amounts GBP million. Provisional per publication notes.", "evidence_url": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "relation": "source_label", "source_concept": "hmrc.cgt_tax_individuals"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "tax_unit", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2024 tax year sum hmrc cgt tax individuals for tax unit [hmrc Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods cgt_statistics_2026]", "layout": {"groupby_dimension": "hmrc.cgt_table1_line", "groupby_ordinal": 0, "groupby_value_id": "ty2024", "groupby_value_label": "Year of disposal 2024 to 2025", "measure_id": "individuals_tax", "measure_label": "CGT liabilities, individuals", "measure_ordinal": 2, "record_set_id": "hmrc.cgt_statistics_2026.table1.ty2024", "record_set_spec_hash": "a6e2cfe0ff499a7803f235b9", "record_set_spec_id": "hmrc.cgt_statistics_2026.table1.ty2024.v1", "source_column_id": "individuals_tax", "source_row_id": "ty2024", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:e3a856b99a58164c4ee798dc", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:7ae12aa033db19c6b7c480e5", "ledger.source_cell.v1:0345a2081096157996666e2c"], "source_record_id": "hmrc.cgt_statistics_2026.table1.ty2024.ty2024.individuals_tax", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.cgt_tax_individuals", "source_measure_id": "individuals_tax", "source_name": "hmrc", "source_table": "Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:bf19586c602a63e134a08e54", "period": {"type": "tax_year", "value": 2024}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:9bcc5d8064b3b8a364fb8093", "source": {"extracted_at": "2026-09-03", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/uk/hmrc/hmrc-cgt-statistics-2026/2026/d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "raw_r2_uri": "r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-statistics-2026/2026/d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "source_file": "Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "source_name": "hmrc", "source_sha256": "d1413c30486f590d952d6e9c8940af6356ec796414418781412a89ba4c90c1ef", "source_size_bytes": 9696, "source_table": "Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal", "url": "https://assets.publishing.service.gov.uk/media/6a7b23f1bbafcd1db3b6e420/Table_1_2026_Taxpayer_numbers_gains_and_tax_liabilities.ods", "vintage": "cgt_statistics_2026"}, "source_release_key": "ledger.source_release.v2:a894879170042e399a418f69", "source_series_key": "ledger.source_series.v2:d55b5fe72802837d324640b3", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", "universe_constraints": {"domain": "capital_gains_tax"}, "value": 22503000000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420", "aggregation": {"method": "sum"}, "assertion": "source_projection", "concept_alignment": {"authority": "obr", "canonical_concept": "obr.capital_gains_tax", "concept_alignment_key": "ledger.concept_alignment.v2:6c86ad1687d5a175a53410d0", "evidence_notes": "OBR EFO March 2026 detailed forecast tables, sheet 3.8, row 22 ('Capital gains tax'), GBP billion.", "evidence_url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", "relation": "source_label", "source_concept": "obr.capital_gains_tax"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "resident_population"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2025 fiscal year projected sum obr capital gains tax for person [obr EFO March 2026 detailed forecast tables: receipts efo_receipts.xlsx efo_march_2026]", "layout": {"groupby_dimension": "obr.efo_line", "groupby_ordinal": 0, "groupby_value_id": "capital_gains_tax", "groupby_value_label": "Capital gains tax", "measure_id": "amount", "measure_label": "Capital gains tax, FY2025-26", "measure_ordinal": 0, "record_set_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025", "record_set_spec_hash": "3a29ebe1ae930bffc01419d0", "record_set_spec_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025.v1", "source_column_id": "amount", "source_row_id": "capital_gains_tax", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:4ae0218b8aabc16818fee69b", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:f48d3b937b9cd014045e594c", "ledger.source_cell.v1:8273082e0a8219d26d7f94d9"], "source_record_id": "obr.efo_2026_03.receipts.capital_gains_tax.fy2025.capital_gains_tax.amount", "source_row_keys": []}, "observed_measure": {"source_concept": "obr.capital_gains_tax", "source_measure_id": "amount", "source_name": "obr", "source_table": "EFO March 2026 detailed forecast tables: receipts", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:6bdb8644c98a705e2c4d4d26", "period": {"type": "fiscal_year", "value": 2025}, "provenance_class": "model_output", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:543340b7e41c1c5d710aafde", "source": {"extracted_at": "2026-08-06", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/obr/obr-efo-receipts-march-2026/2026/f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28/efo_receipts.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/obr/obr-efo-receipts-march-2026/2026/f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28/efo_receipts.xlsx", "source_file": "efo_receipts.xlsx", "source_name": "obr", "source_sha256": "f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28", "source_size_bytes": 187899, "source_table": "EFO March 2026 detailed forecast tables: receipts", "url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", "vintage": "efo_march_2026"}, "source_release_key": "ledger.source_release.v2:cd7332ed9168974f4875f7c7", "source_series_key": "ledger.source_series.v2:6a7181a404bd1ee595a688f2", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:ecb00e907376ba856934e4ad", "universe_constraints": {"domain": "public_sector_finances"}, "value": 21801546197.09165, "value_type": "number"} diff --git a/packages/microcosm-build/tests/test_target_materialization.py b/packages/microcosm-build/tests/test_target_materialization.py index 2a6d2c860..4c81e6173 100644 --- a/packages/microcosm-build/tests/test_target_materialization.py +++ b/packages/microcosm-build/tests/test_target_materialization.py @@ -158,6 +158,54 @@ def test_prepared_column_path_materializes_filtered_values(): ] +@pytest.mark.parametrize("fact_period", [2024, 2025]) +@pytest.mark.parametrize("require_matching_fact_period", [None, False, True]) +def test_existing_measure_respects_fact_guard_at_default_measurement_period( + fact_period, require_matching_fact_period +): + class ExistingMeasureAdapter(StubAdapter): + def has_column(self, entity, variable): + return variable in self.tables[entity] + + adapter = ExistingMeasureAdapter() + adapter.set_column("person", "income_measure", [999.0, 999.0, 999.0]) + registry = TargetRegistry( + [ + TargetSpec( + name="income", + entity="person", + measure="income_measure", + value=60.0, + source="test", + metadata={ + "contract_target_id": "income", + "ledger_fact_period": str(fact_period), + }, + ) + ], + country="uk", + ) + binding = {"value_variable": "income"} + if require_matching_fact_period is not None: + binding["require_matching_fact_period"] = require_matching_fact_period + contract = {"income": {"bindings": {"policyengine": binding}}} + + result = materialize_target_bindings(adapter, registry, contract, period=2025) + + if require_matching_fact_period and fact_period != 2025: + assert len(result.skipped) == 1 + assert "observation period '2024'" in result.skipped[0].reason + assert "measurement period 2025" in result.skipped[0].reason + else: + assert not result.skipped + expected = ( + [10.0, 20.0, 30.0] + if require_matching_fact_period and fact_period == 2025 + else [999.0, 999.0, 999.0] + ) + assert adapter.tables["person"]["income_measure"].tolist() == expected + + def test_generic_provider_kinds_materialize_expected_columns(): registry = TargetRegistry( [ diff --git a/packages/microcosm-build/tests/test_uk_cgt_observation_period.py b/packages/microcosm-build/tests/test_uk_cgt_observation_period.py new file mode 100644 index 000000000..88d7952f2 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_cgt_observation_period.py @@ -0,0 +1,242 @@ +"""Dated CGT measurements retain base-year rows through both calibration paths.""" + +from __future__ import annotations + +import importlib.util +from pathlib import Path +from types import SimpleNamespace + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.uk_runtime import measure_simulation +from microcosm.build.uk_runtime.measure_simulation import UKMeasureResolver +from microcosm.build.uk_runtime.national_calibration import UKNationalCalibrationStage +from microcosm.build.uk_runtime.national_doctrine import UKNationalSolveDoctrine +from microcosm.build.uk_runtime.national_frame import ( + load_uk_national_frame, + uk_national_frame, + write_uk_national_frame, +) +from microcosm.calibrate import TargetRegistry, TargetSpec +from microcosm.frame import WeightKind + + +def _frame(): + ids = np.arange(3, dtype=np.int64) + return uk_national_frame( + person=pd.DataFrame( + { + "person_id": ids, + "person_benunit_id": ids, + "person_household_id": ids, + "age": [40, 50, 60], + "capital_gains": [3000.0, 5000.0, 20000.0], + } + ), + benunit=pd.DataFrame({"benunit_id": ids}), + household=pd.DataFrame( + { + "household_id": ids, + "household_weight": [2.0, 3.0, 5.0], + "region": "LONDON", + "council_tax": 0.0, + "rent": 0.0, + "tenure_type": "OWNED_OUTRIGHT", + } + ), + time_period="2024", + weight_kind=WeightKind.DESIGN, + ) + + +def _registry(): + return TargetRegistry( + [ + TargetSpec( + name=name, + entity="person", + measure=measure, + value=value, + period=2025, + source="synthetic observation-year integration fixture", + family="hmrc_cgt", + metadata={"contract_target_id": name, "ledger_fact_period": "2024"}, + ) + for name, measure, value in [ + ("hmrc.cgt.taxpayers_total", "hmrc/cgt_taxpayers", 16.0), + ("hmrc.cgt.gains_total", "hmrc/capital_gains_total", 230000.0), + ("hmrc.cgt.liability_total", "hmrc/cgt_liability", 32760.0), + ] + ], + country="uk", + ) + + +class _Simulation: + def __init__(self): + self.calls = [] + self.tax_benefit_system = SimpleNamespace( + variables={ + name: SimpleNamespace( + entity=SimpleNamespace(key="person"), value_type=float + ) + for name in ("capital_gains", "capital_gains_tax") + } + ) + + def calculate(self, variable, year): + self.calls.append((variable, year)) + gains = np.array([3000.0, 5000.0, 20000.0]) * (1 if year == 2024 else 1.1) + return ( + gains if variable == "capital_gains" else np.maximum(gains - 3000, 0) * 0.18 + ) + + +def _assert_export(original, fitted, path): + # Both source bytes and output period survive; fitted weights do not revert. + assert fitted.metadata["time_period"] == "2024" + for entity in original.entities: + columns = [c for c in original.table(entity) if c != "household_weight"] + pd.testing.assert_frame_equal( + original.table(entity)[columns], fitted.table(entity)[columns] + ) + assert not np.array_equal( + original.weights_for("household").values, fitted.weights_for("household").values + ) + write_uk_national_frame(fitted, path) + reread, _ = load_uk_national_frame(path) + assert reread.metadata["time_period"] == "2024" + np.testing.assert_array_equal( + reread.table("person").capital_gains, original.table("person").capital_gains + ) + np.testing.assert_array_equal( + reread.weights_for("household").values, fitted.weights_for("household").values + ) + assert not any( + str(c).startswith("cgt_2024_") or "/" in str(c) for c in reread.table("person") + ) + + +@pytest.mark.parametrize("route", ["national", "local"]) +def test_dated_cgt_fit_restores_base2024_values_with_fitted_weights( + monkeypatch, tmp_path, route +): + pytest.importorskip("tables") + pytest.importorskip("h5py") + original = _frame() + simulation = _Simulation() + monkeypatch.setattr( + measure_simulation, + "_policyengine_uk_module", + lambda: SimpleNamespace(__version__="test"), + ) + + def resolver_factory(**kwargs): + kwargs.setdefault("simulation_source", None) + return UKMeasureResolver( + **kwargs, microsimulation_factory=lambda **_: simulation + ) + + registry = _registry() + if route == "national": + resolver = resolver_factory( + frame=original, scratch_dir=tmp_path / "engine", year=2025 + ) + stage = UKNationalCalibrationStage( + registry, + band_edge_registry=registry, + period=2025, + doctrine=UKNationalSolveDoctrine(epochs=2), + measure_resolver=resolver, + ) + fitted = stage(original) + receipt = stage.manifest["measure_resolution"]["provider"][ + "cgt_period_contract" + ] + else: + from microcosm.build.uk_runtime.local_rowwise import ( + build_uk_rowwise_local_matrix, + solve_uk_rowwise_weights_under_doctrine, + ) + + spec = importlib.util.spec_from_file_location( + "cgt_rowwise_builder", + Path(__file__).resolve().parents[3] / "tools/build_uk_rowwise_candidate.py", + ) + builder = importlib.util.module_from_spec(spec) + spec.loader.exec_module(builder) + monkeypatch.setattr( + builder, + "compute_household_metrics", + lambda _sim, _area, *, period, household_ids: pd.DataFrame( + {"households": np.ones(len(household_ids))}, index=household_ids + ), + ) + prepared, restore, national, metrics, engine_receipt = ( + builder._resolve_candidate_engine_surface( + original, + registry, + period=2025, + scratch_dir=tmp_path / "engine", + resolver_factory=resolver_factory, + ) + ) + receipt = engine_receipt["cgt_period_contract"] + local = build_uk_rowwise_local_matrix( + metrics["constituency"], + pd.Series(["A", "A", "A"], index=[0, 1, 2]), + pd.DataFrame({"code": ["A"], "households": [20.0]}), + ) + result = solve_uk_rowwise_weights_under_doctrine( + prepared, + local, + bound_families=["census_households/constituency", "national/hmrc_cgt"], + national_rows=national, + restore=restore, + epochs=2, + ) + fitted = result.frame + assert all(spec.period == 2025 for spec in registry.specs) + assert receipt["input_period"] == "2024" + assert receipt["calibration_period"] == 2025 + assert receipt["bound_measurements"] == { + "cgt_2024_gains": { + "model_variable": "capital_gains", + "measurement_period": 2024, + }, + "cgt_2024_tax": { + "model_variable": "capital_gains_tax", + "measurement_period": 2024, + }, + } + assert set(simulation.calls) == { + ("capital_gains", 2024), + ("capital_gains_tax", 2024), + } + _assert_export(original, fitted, tmp_path / f"{route}.h5") + + +@pytest.mark.requires_uk +def test_actual_engine_resolves_observed_cgt_without_relabelling_source(tmp_path): + frame = _frame() + resolver = UKMeasureResolver( + simulation_source=None, frame=frame, scratch_dir=tmp_path, year=2025 + ) + gains, route = resolver.compute("person", "cgt_2024_gains") + tax, _ = resolver.compute("person", "cgt_2024_tax") + np.testing.assert_array_equal(gains, frame.table("person").capital_gains) + np.testing.assert_array_equal( + tax, np.asarray(resolver.simulation.calculate("capital_gains_tax", 2024)) + ) + assert route == "engine_period:2024:capital_gains:native" + assert (gains > 3000).tolist() == [False, True, True] + assert tax[0] == 0 and np.all(tax[1:] > 0) + # A separate forward calculation crosses the fixed AEA; it is not the fit. + future, _ = resolver.compute("person", "cgt_2025_gains") + assert future[0] > 3000 + assert frame.metadata["time_period"] == "2024" + np.testing.assert_array_equal( + frame.table("person").capital_gains, [3000, 5000, 20000] + ) diff --git a/packages/microcosm-build/tests/test_uk_cgt_targets.py b/packages/microcosm-build/tests/test_uk_cgt_targets.py index 8284ee8f4..07984d7a0 100644 --- a/packages/microcosm-build/tests/test_uk_cgt_targets.py +++ b/packages/microcosm-build/tests/test_uk_cgt_targets.py @@ -1,13 +1,16 @@ """Tests for the UK capital gains Ledger target references. -The published populace-uk surface carries no capital gains targets, which -leaves the gains distribution unanchored (1.47m CGT taxpayers against HMRC's -378k). These tests pin the declared facts, their provenance, and the coverage -requirement that makes their absence a build failure rather than a silence. +These tests pin individuals-only facts, provenance and required coverage. +The fixture also contains historical trust-inclusive totals; those must not +enter a person-level calibration by accident. """ import json +from copy import deepcopy from pathlib import Path +from types import SimpleNamespace + +import pytest from microcosm.build.country_spec import load_country_spec from microcosm.build.ledger_targets import compile_ledger_target_references @@ -17,10 +20,25 @@ UK_CGT_TARGET_SPECS, UK_FISCAL_TARGET_REGISTRY, ) +from microcosm.build.uk_runtime.ledger_targets import compile_uk_target_registry +from microcosm.calibrate import TargetRegistry FIXTURE_FEED_ROWS = ( Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" ) +CGT_TARGET_NAMES = { + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", + "hmrc.cgt.liability_total", +} + + +def _facts(): + return [ + json.loads(line) + for line in FIXTURE_FEED_ROWS.read_text().splitlines() + if line.strip() + ] def _compiled_cgt_registry(): @@ -28,14 +46,28 @@ def _compiled_cgt_registry(): references = [ reference for reference in spec.target_references - if reference.name in {"hmrc.cgt.gains_total", "hmrc.cgt.taxpayers_total"} + if reference.name in CGT_TARGET_NAMES ] - facts = [ - json.loads(line) - for line in FIXTURE_FEED_ROWS.read_text().splitlines() - if line.strip() - ] - return compile_ledger_target_references(facts, references, country="uk") + return compile_ledger_target_references(_facts(), references, country="uk") + + +@pytest.fixture +def compile_cgt(monkeypatch): + # Exercise the production compiler on the three reviewed references only; + # regeneration tests separately verify the complete national/UC roster. + from microcosm.build.uk_runtime import ledger_targets + + references = tuple( + r + for r in load_country_spec("uk").target_references + if r.name in CGT_TARGET_NAMES + ) + monkeypatch.setattr( + ledger_targets, + "load_country_spec", + lambda country: SimpleNamespace(target_references=references), + ) + return compile_uk_target_registry def test_inline_cgt_target_specs_are_retired(): @@ -43,12 +75,12 @@ def test_inline_cgt_target_specs_are_retired(): assert len(UK_FISCAL_TARGET_REGISTRY) == 0 -def test_compiled_references_declare_gains_total_and_taxpayer_count(): +def test_compiled_references_declare_three_observed_cgt_totals(): registry = _compiled_cgt_registry() - assert {spec.name for spec in registry.specs} == { - "hmrc.cgt.gains_total", - "hmrc.cgt.taxpayers_total", + assert {spec.name for spec in registry.specs} == CGT_TARGET_NAMES + assert "obr.capital_gains_tax" not in { + reference.name for reference in load_country_spec("uk").target_references } @@ -59,20 +91,62 @@ def test_every_compiled_fact_carries_provenance(): assert spec.family == "hmrc_cgt" -def test_compiled_facts_match_hmrc_2023_24_outturn(): +def test_compiled_facts_match_hmrc_2024_25_individuals_observations(): by_name = {spec.name: spec for spec in _compiled_cgt_registry().specs} - assert by_name["hmrc.cgt.gains_total"].value == 65_937_000_000 - assert by_name["hmrc.cgt.taxpayers_total"].value == 378_000 + assert by_name["hmrc.cgt.gains_total"].value == 119_258_000_000 + assert by_name["hmrc.cgt.taxpayers_total"].value == 551_000 + liability = by_name["hmrc.cgt.liability_total"] + # Verbatim Chronicle 6fb700e Table 1 provisional observation, not OBR cash. + assert liability.value == 22_503_000_000 + assert liability.metadata["ledger_aggregate_fact_key"] == ( + "ledger.aggregate_fact.v2:222c397017de7bff0a6583a7" + ) assert all(spec.period == 2025 for spec in by_name.values()) assert all( - spec.metadata["ledger_fact_period"] == "2023" for spec in by_name.values() + spec.metadata["measurement_period"] == "2024" for spec in by_name.values() + ) + assert all( + spec.metadata["source_period_policy"] == "exact_observation" + for spec in by_name.values() + ) + assert all( + spec.metadata["ledger_fact_period"] == "2024" for spec in by_name.values() + ) + + +def test_individual_scope_is_pinned_to_table1_not_age_marginals(): + references = load_country_spec("uk").target_references + cgt = [r for r in references if r.name.startswith("hmrc.cgt.")] + assert len(cgt) == 3 + expected_keys = { + "hmrc.cgt.taxpayers_total": "31d709fc393c2bf4d04efca5", + "hmrc.cgt.gains_total": "12060d20a417d85d67cf24e8", + "hmrc.cgt.liability_total": "222c397017de7bff0a6583a7", + } + for reference in cgt: + assert reference.ledger_selector["aggregate_fact_key"] == ( + "ledger.aggregate_fact.v2:" + expected_keys[reference.name] + ) + assert reference.ledger_selector["period_type"] == "tax_year" + assert reference.ledger_selector["period_value"] == 2024 + assert {r.ledger_selector["source_concept"] for r in cgt} == { + "hmrc.cgt_gains_individuals", + "hmrc.cgt_taxpayers_individuals", + "hmrc.cgt_tax_individuals", + } + assert all( + r.ledger_selector["groupby_dimension"] == "hmrc.cgt_table1_line" for r in cgt ) def test_measures_are_declared_columns(): """The registry refuses callables, so measures must be prepared columns.""" measures = {spec.measure for spec in _compiled_cgt_registry().specs} - assert measures == {"hmrc/capital_gains_total", "hmrc/cgt_taxpayers"} + assert measures == { + "hmrc/capital_gains_total", + "hmrc/cgt_taxpayers", + "hmrc/cgt_liability", + } assert set(UK_CGT_REQUIRED_COLUMNS) == { "uk_cgt_measure_gains_amount", "uk_cgt_measure_taxpayer_count", @@ -93,11 +167,221 @@ def test_registry_is_uk_and_content_addressed(): assert UK_FISCAL_TARGET_REGISTRY.version -def test_coverage_requires_both_facts(): - """A build that drops either fact must fail the gate, not pass quietly.""" +def test_coverage_requires_all_three_observed_facts(): + """A build that drops liability, gains or counts must fail coverage.""" (requirement,) = UK_CGT_TARGET_COVERAGE_REQUIREMENTS - assert requirement.min_matches == 2 - assert set(requirement.accepted_names) == { - "hmrc.cgt.gains_total", - "hmrc.cgt.taxpayers_total", + assert requirement.min_matches == 3 + assert set(requirement.accepted_names) == CGT_TARGET_NAMES + + +def test_original_cash_forecast_survives_only_as_diagnostic_metadata( + tmp_path, compile_cgt +): + compilation = compile_cgt(_facts(), target_period=2025) + by_name = {spec.name: spec for spec in compilation.registry.specs} + assert "obr.capital_gains_tax" not in by_name + metadata = by_name["hmrc.cgt.liability_total"].metadata + assert metadata["cgt_cash_diagnostic_status"] == "available" + assert metadata["cgt_cash_diagnostic_role"] == "diagnostic_only_not_in_fit" + assert metadata["cgt_cash_reconciliation_status"] == "unresolved" + assert float(metadata["cgt_cash_diagnostic_value_gbp"]) == 21_801_546_197.09165 + assert metadata["cgt_cash_diagnostic_period"] == "2025" + assert metadata["cgt_cash_diagnostic_ledger_period_type"] == "fiscal_year" + assert metadata["cgt_cash_diagnostic_ledger_assertion"] == "source_projection" + assert metadata["cgt_cash_diagnostic_ledger_aggregate_fact_key"] == ( + "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420" + ) + assert "obr.uk" in metadata["cgt_cash_diagnostic_source"] + # TargetSpec's normal serialization is used in national/local receipts. + path = compilation.registry.to_json(tmp_path / "registry.json") + restored = TargetRegistry.from_json(path) + assert metadata == next( + spec.metadata + for spec in restored.specs + if spec.name == "hmrc.cgt.liability_total" + ) + + +@pytest.mark.parametrize( + "cash_change", + [ + "missing", + "wrong_year", + "observation", + "different_forecast", + "wrong_period_type", + "duplicate", + ], +) +def test_missing_cash_diagnostic_does_not_remove_observed_targets( + cash_change, compile_cgt, tmp_path +): + facts = _facts() + cash = [ + fact + for fact in facts + if fact["observed_measure"]["source_concept"] == "obr.capital_gains_tax" + ] + assert cash + if cash_change == "missing": + facts = [fact for fact in facts if fact not in cash] + elif cash_change == "duplicate": + facts.append(deepcopy(cash[0])) + else: + for fact in cash: + if cash_change == "wrong_year": + fact["period"]["value"] = 2026 + elif cash_change == "observation": + fact["assertion"] = "observation" + elif cash_change == "wrong_period_type": + fact["period"]["type"] = "tax_year" + else: + fact["aggregate_fact_key"] = "ledger.aggregate_fact.v2:replacement" + fact["value"] += 1 + compilation = compile_cgt(facts, target_period=2025) + assert not compilation.unsupported + by_name = {spec.name: spec for spec in compilation.registry.specs} + assert {name: spec.value for name, spec in by_name.items()} == { + "hmrc.cgt.gains_total": 119_258_000_000, + "hmrc.cgt.taxpayers_total": 551_000, + "hmrc.cgt.liability_total": 22_503_000_000, } + metadata = by_name["hmrc.cgt.liability_total"].metadata + assert metadata["cgt_cash_diagnostic_status"] == "unavailable" + assert metadata["cgt_cash_diagnostic_unavailable_reason"] + assert metadata["cgt_cash_diagnostic_expected_fact_key"] == ( + "ledger.aggregate_fact.v2:93699bb9caa7ec0d6833f420" + ) + assert metadata["cgt_cash_diagnostic_expected_period"] == "2025" + assert metadata["cgt_cash_diagnostic_expected_period_type"] == "fiscal_year" + assert metadata["cgt_cash_diagnostic_expected_assertion"] == "source_projection" + assert "cgt_cash_diagnostic_value_gbp" not in metadata + assert "cgt_cash_diagnostic_source" not in metadata + restored = TargetRegistry.from_json( + compilation.registry.to_json(tmp_path / "registry.json") + ) + assert metadata == next( + r.metadata for r in restored if r.name == "hmrc.cgt.liability_total" + ) + + +@pytest.mark.parametrize("name", sorted(CGT_TARGET_NAMES)) +@pytest.mark.parametrize( + "mutation", + [ + "missing", + "wrong_key", + "wrong_scope", + "wrong_entity", + "wrong_period_type", + "wrong_year", + ], +) +def test_observed_reference_refuses_missing_or_mismatched_individual_fact( + name, mutation, compile_cgt +): + facts = _facts() + reference = next( + r for r in load_country_spec("uk").target_references if r.name == name + ) + fact = next( + f + for f in facts + if f["observed_measure"]["source_concept"] + == reference.ledger_selector["source_concept"] + and str(f["period"]["value"]) == "2024" + ) + if mutation == "missing": + facts.remove(fact) + elif mutation == "wrong_key": + fact["aggregate_fact_key"] = "ledger.aggregate_fact.v2:other_release" + elif mutation == "wrong_period_type": + fact["period"]["type"] = "fiscal_year" + elif mutation == "wrong_year": + fact["period"]["value"] = 2025 + elif mutation == "wrong_entity": + fact["entity"]["name"] = "trust" + else: + # The shared selector accepts a source or canonical concept. Change + # both representations so this fixture actually describes other scope. + wrong_concept = "hmrc.cgt_gains_total" + fact["observed_measure"]["source_concept"] = wrong_concept + fact["concept_alignment"]["source_concept"] = wrong_concept + fact["concept_alignment"]["canonical_concept"] = wrong_concept + compilation = compile_cgt(facts, target_period=2025) + assert name not in {row.name for row in compilation.registry.specs} + assert name in {row["name"] for row in compilation.unsupported} + + +@pytest.mark.parametrize("change", ["missing", "receiver", "fact_key", "assertion"]) +def test_malformed_cash_declaration_remains_a_compile_error( + change, tmp_path, monkeypatch, compile_cgt +): + from microcosm.build.uk_runtime import ledger_targets + + resource = ledger_targets.importlib_resources.files("microcosm.build.uk") + contract = json.loads(resource.joinpath("uk_population_targets.json").read_text()) + declaration = contract["diagnostic_references"]["obr.capital_gains_tax"] + if change == "missing": + del contract["diagnostic_references"] + elif change == "receiver": + declaration["attach_to_target"] = "hmrc.cgt.gains_total" + elif change == "fact_key": + declaration["reference"]["ledger_fact_key"] = None + else: + declaration["required_assertion"] = "observation" + (tmp_path / "uk_population_targets.json").write_text(json.dumps(contract)) + original_files = ledger_targets.importlib_resources.files + monkeypatch.setattr( + ledger_targets.importlib_resources, + "files", + lambda package: ( + tmp_path if package == "microcosm.build.uk" else original_files(package) + ), + ) + compilation = compile_cgt(_facts(), target_period=2025) + assert "hmrc.cgt.liability_total" not in {r.name for r in compilation.registry} + assert any( + "cash diagnostic declaration" in r["reason"] for r in compilation.unsupported + ) + + +@pytest.mark.parametrize("name", sorted(CGT_TARGET_NAMES)) +def test_new_key_revision_does_not_silently_replace_pinned_observation( + name, compile_cgt +): + facts = _facts() + reference = next( + r for r in load_country_spec("uk").target_references if r.name == name + ) + original = next( + f + for f in facts + if f["aggregate_fact_key"] == reference.ledger_selector["aggregate_fact_key"] + ) + revision = deepcopy(original) + revision["aggregate_fact_key"] = "ledger.aggregate_fact.v2:future_revision" + revision["value"] += 1 + compilation = compile_cgt([*facts, revision], target_period=2025) + assert not compilation.unsupported + selected = next(r for r in compilation.registry if r.name == name) + assert selected.value == original["value"] + assert ( + selected.metadata["ledger_aggregate_fact_key"] == original["aggregate_fact_key"] + ) + + +@pytest.mark.parametrize("name", sorted(CGT_TARGET_NAMES)) +def test_duplicate_pinned_observation_fails_loudly(name, compile_cgt): + facts = _facts() + reference = next( + r for r in load_country_spec("uk").target_references if r.name == name + ) + original = next( + f + for f in facts + if f["aggregate_fact_key"] == reference.ledger_selector["aggregate_fact_key"] + ) + compilation = compile_cgt([*facts, deepcopy(original)], target_period=2025) + assert name not in {r.name for r in compilation.registry} + assert name in {r["name"] for r in compilation.unsupported} diff --git a/packages/microcosm-build/tests/test_uk_ledger_targets.py b/packages/microcosm-build/tests/test_uk_ledger_targets.py index aaebed3fc..2ef596442 100644 --- a/packages/microcosm-build/tests/test_uk_ledger_targets.py +++ b/packages/microcosm-build/tests/test_uk_ledger_targets.py @@ -433,7 +433,9 @@ def __init__(self): child_flags = np.array([True, True, True, False, False, True, True]) self.tables = { "person": { - "capital_gains": np.array([0.0, 0.0, 0.0, 5_000.0, 0.0, 0.0, 20_000.0]), + "cgt_2024_gains": np.array( + [0.0, 0.0, 0.0, 5_000.0, 0.0, 0.0, 20_000.0] + ), "person_household_id": person_household, "uc_is_child_limit_affected": child_flags, "is_child": np.array([True, True, True, True, False, True, True]), @@ -486,7 +488,7 @@ def household_condition(self, condition): def parameter(self, name, period): assert name == "gov.hmrc.cgt.annual_exempt_amount" - assert period == 2025 + assert period == 2024 return 6_000.0 def counterfactual_delta(self, binding, period): @@ -690,7 +692,10 @@ def test_materialize_uk_ledger_targets_with_stub_adapter(): measure="hmrc/cgt_taxpayers", value=378_000.0, source="test", - metadata={"contract_target_id": "hmrc.cgt.taxpayers_total"}, + metadata={ + "contract_target_id": "hmrc.cgt.taxpayers_total", + "ledger_fact_period": "2024", + }, ), TargetSpec( name="dwp.uc.two_child_limit.children_affected", diff --git a/packages/microcosm-build/tests/test_uk_measure_simulation.py b/packages/microcosm-build/tests/test_uk_measure_simulation.py index a031cd6c1..75b724c8f 100644 --- a/packages/microcosm-build/tests/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/test_uk_measure_simulation.py @@ -106,6 +106,257 @@ def test_compute_uk_measure_input_native_route(): assert values.tolist() == [1.0, 2.0, 3.0] +@pytest.mark.parametrize("year,factor", [(2024, 1.0), (2025, 1.1)]) +def test_cgt_period_measures_bypass_stored_inputs_without_mutation( + monkeypatch, tmp_path, year, factor +): + from microcosm.build.target_materialization import ( + materialize_target_bindings, + resolve_target_measures, + ) + + frame = FrameStub() + frame.metadata = {"time_period": "2024"} + frame.table("person")["capital_gains"] = [2900.0, 3000.0, 20000.0] + frame.table("person")["capital_gains_tax"] = [99.0, 99.0, 99.0] + original = frame.table("person").copy(deep=True) + gains = original.capital_gains.to_numpy() * factor + tax = np.maximum(gains - 3000, 0) * 0.18 + sim = SimulationStub( + {"capital_gains": ("person", gains), "capital_gains_tax": ("person", tax)} + ) + monkeypatch.setitem( + sys.modules, + "policyengine_uk", + SimpleNamespace(__version__="2.97.0", Microsimulation=lambda **kw: sim), + ) + resolver = UKMeasureResolver( + simulation_source=tmp_path / "input.h5", + scratch_dir=tmp_path, + year=year, + frame=frame, + ) + names = ( + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", + "hmrc.cgt.liability_total", + ) + resolver.contract_targets = { + name: {"bindings": {"policyengine": binding}} + for name, binding in zip( + names, + [ + { + "kind": "parameter_gated_threshold", + "gate_parameter": "gov.hmrc.cgt.annual_exempt_amount", + "gated_variable": "cgt_calibration_gains", + "value_variable": "cgt_calibration_gains", + "from_entity": "person", + "measurement_period": year, + }, + { + "kind": "parameter_gated_threshold", + "gate_parameter": "gov.hmrc.cgt.annual_exempt_amount", + "gated_variable": "cgt_calibration_gains", + "value_variable": "person_count", + "from_entity": "person", + "measurement_period": year, + }, + { + "value_variable": "cgt_calibration_tax", + "from_entity": "person", + "measurement_period": year, + }, + ], + strict=True, + ) + } + registry = TargetRegistry( + [ + TargetSpec( + name=name, + entity="person", + measure=f"test_{i}", + value=1, + source="test", + metadata={"contract_target_id": name}, + ) + for i, name in enumerate(names) + ], + country="uk", + ) + + class Adapter: + def __init__(self): + self.person = original.copy(deep=True) + self.tables = {"person": self.person} + + def column(self, entity, variable): + if variable not in self.person: + raise KeyError(f"{entity}.{variable}") + return self.person[variable].to_numpy() + + def set_column(self, entity, variable, values): + self.person[variable] = values + + def parameter(self, path, period): + assert period == year + return 3000.0 + + result = resolve_target_measures(Adapter, registry, resolver, period=year) + adapter = Adapter() + for (entity, variable), values in result.measure_inputs.items(): + adapter.set_column(entity, variable, values) + materialized = materialize_target_bindings( + adapter, registry, resolver.contract_targets, period=year + ) + assert not materialized.skipped + np.testing.assert_allclose(adapter.person.test_0, np.where(gains > 3000, gains, 0)) + np.testing.assert_array_equal(adapter.person.test_1, gains > 3000) + np.testing.assert_allclose(adapter.person.test_2, tax) + assert {call[:2] for call in sim.calls} == { + ("capital_gains", year), + ("capital_gains_tax", year), + } + pd.testing.assert_frame_equal(frame.table("person"), original) + pd.testing.assert_series_equal(adapter.person.capital_gains, original.capital_gains) + receipt = result.receipt["provider"]["cgt_period_contract"] + assert receipt["input_period"] == "2024" + assert receipt["default_engine_period"] == year + assert receipt["gains_basis"] == "after_losses_before_annual_exempt_amount" + with pytest.raises(ValueError, match="measurement period"): + resolve_target_measures(Adapter, registry, resolver, period=year + 1) + + +def test_resolver_refuses_persisted_cgt_measure_aliases(monkeypatch, tmp_path): + frame = FrameStub() + frame.table("person")["cgt_calibration_gains"] = [1, 2, 3] + monkeypatch.setitem( + sys.modules, + "policyengine_uk", + SimpleNamespace( + __version__="2.97.0", Microsimulation=lambda **kw: SimulationStub({}) + ), + ) + with pytest.raises(ValueError, match="must not be persisted"): + UKMeasureResolver( + simulation_source=tmp_path / "input.h5", + scratch_dir=tmp_path, + year=2025, + frame=frame, + ) + + +@pytest.mark.parametrize("measurement_period", [2023, 2025]) +def test_resolver_rejects_amount_threshold_year_mismatch( + monkeypatch, tmp_path, measurement_period +): + monkeypatch.setattr( + measure_simulation, + "_policyengine_uk_module", + lambda: SimpleNamespace(__version__="test"), + ) + monkeypatch.setattr( + measure_simulation, + "_uk_contract_targets", + lambda: { + "cgt": { + "bindings": { + "policyengine": { + "value_variable": "cgt_2024_gains", + "measurement_period": measurement_period, + } + } + } + }, + ) + with pytest.raises(ValueError, match="amount/threshold period mismatch"): + UKMeasureResolver( + simulation_source=tmp_path / "input.h5", + scratch_dir=tmp_path, + frame=FrameStub(), + year=2025, + microsimulation_factory=lambda **_: SimulationStub({}), + ) + + +def test_dated_cgt_measure_uses_disposal_year_with_later_calibration_year(): + sim = SimulationStub( + {"capital_gains": ("person", np.array([3000.0, 5000.0, 20000.0]))} + ) + values, route = compute_uk_measure_input( + FrameStub(), sim, "person", "cgt_2024_gains", 2025 + ) + assert sim.calls == [("capital_gains", 2024, None)] + assert route == "engine_period:2024:capital_gains:native" + assert (values > 3000).tolist() == [False, True, True] + + +@pytest.mark.parametrize("precomputed", [False, True]) +def test_dated_cgt_binding_gates_at_observation_year_and_refuses_stale_fact( + precomputed, +): + from microcosm.build.target_materialization import materialize_target_bindings + + class Adapter: + values = np.array([999.0, 999.0, 999.0]) + + def has_column(self, entity, name): + return precomputed + + def parameter(self, name, period): + assert period == 2024 + return 3000.0 + + def column(self, entity, variable): + assert variable == "cgt_2024_gains" + return np.array([3000.0, 5000.0, 20000.0]) + + def set_column(self, entity, variable, values): + self.values = values + + binding = { + "bindings": { + "policyengine": { + "kind": "parameter_gated_threshold", + "gate_parameter": "gov.hmrc.cgt.annual_exempt_amount", + "gated_variable": "cgt_2024_gains", + "value_variable": "person_count", + "from_entity": "person", + "measurement_period": 2024, + "require_matching_fact_period": True, + } + } + } + for fact_year in (2024, 2023): + registry = TargetRegistry( + [ + TargetSpec( + name="cgt", + entity="person", + measure="cgt", + value=1, + source="test", + metadata={ + "contract_target_id": "cgt", + "ledger_fact_period": str(fact_year), + }, + ) + ], + country="uk", + ) + adapter = Adapter() + result = materialize_target_bindings( + adapter, registry, {"cgt": binding}, period=2025 + ) + if fact_year == 2024: + assert not result.skipped + assert adapter.values.tolist() == [0.0, 1.0, 1.0] + else: + assert len(result.skipped) == 1 + assert "observation period" in result.skipped[0].reason + + def test_compute_uk_measure_input_categorical_broadcast_group_to_person(): sim = SimulationStub({"family_type": ("benunit", np.array(["couple", "single"]))}) diff --git a/packages/microcosm-build/tests/test_uk_national_calibration.py b/packages/microcosm-build/tests/test_uk_national_calibration.py index a144cca23..ad4615440 100644 --- a/packages/microcosm-build/tests/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/test_uk_national_calibration.py @@ -180,9 +180,13 @@ class StubCrosstabResolver: } def knows(self, entity, variable): - return entity == "benunit" and variable in self.measures + return (entity, variable) == ("person", "cgt_2024_gains") or ( + entity == "benunit" and variable in self.measures + ) def compute(self, entity, variable): + if (entity, variable) == ("person", "cgt_2024_gains"): + return np.array([0.0, 7000.0, 12000.0, 500.0, 0.0, 0.0]), "stub_engine_year" assert self.knows(entity, variable) return self.measures[variable].copy(), "stub_benunit_tcl_measure" @@ -242,7 +246,9 @@ def _fact_for_reference( if key in selector } return { - "aggregate_fact_key": f"ledger.aggregate_fact.v2:{reference.name}", + "aggregate_fact_key": selector.get( + "aggregate_fact_key", f"ledger.aggregate_fact.v2:{reference.name}" + ), "aggregation": {"method": "sum"}, "assertion": "observation", "entity": {"name": selector.get("entity_name", reference.entity)}, @@ -258,7 +264,9 @@ def _fact_for_reference( "source_measure_id": selector.get("source_measure_id", "value"), "unit": "gbp", }, - "period": {"type": "month", "value": f"{reference.period}-12"}, + "period": {"type": "tax_year", "value": 2024} + if reference.name.startswith("hmrc.cgt.") + else {"type": "month", "value": f"{reference.period}-12"}, "value": value, } @@ -595,6 +603,9 @@ def test_packaged_binding_classes_materialize_through_national_stage() -> None: # The same table-scoped injection the resolution loop performs. for variable, values in resolver.measures.items(): adapter.tables["benunit"][variable] = values.copy() + adapter.tables["person"]["cgt_2024_gains"] = np.array( + [0.0, 7000.0, 12000.0, 500.0, 0.0, 0.0] + ) materialize_uk_ledger_targets(adapter, registry, period=2025) materialized = { ("benunit", "dwp/uc/households"): [1.0, 0.0, 1.0], diff --git a/packages/microcosm-build/tests/test_uk_population_targets.py b/packages/microcosm-build/tests/test_uk_population_targets.py index 420f73f86..7e06ce2ca 100644 --- a/packages/microcosm-build/tests/test_uk_population_targets.py +++ b/packages/microcosm-build/tests/test_uk_population_targets.py @@ -42,6 +42,7 @@ } PROJECTION_FAMILIES = {"obr", "slc_borrowers", "scotgov_social_security"} NATIONAL_SELECTOR_KEYS = { + "aggregate_fact_key", "source_name", "source_concept", "source_measure_id", @@ -74,6 +75,8 @@ "value_reduction", "map_to", "metric_name", + "measurement_period", + "require_matching_fact_period", "notes", "output_delta", "output_variable", @@ -198,8 +201,8 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: assert set(mapped_target_ids).isdisjoint(unmapped_declarations) assert mapped_target_ids | set(unmapped_declarations) == set(registry_scope) assert all(reason for reason in unmapped_declarations.values()) - assert len(mapped_target_ids) == 184 - assert len(unmapped_declarations) == 18 + assert len(mapped_target_ids) == 183 + assert len(unmapped_declarations) == 19 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -380,6 +383,8 @@ def test_childcare_bus_observation_basis_and_entity_pins_are_closed_world() -> N "annual_unique_count", "january_stock", "fiscal_year_flow", + "individuals_observed_disposal_year_2024_liability", + "individuals_observed_disposal_year_2024_net_gains_and_aea", } allowed_operations = set(resource["allowed_value_operations"]) for target in resource["targets"]: @@ -825,6 +830,7 @@ def test_uk_population_cgt_contract_names_match_runtime_specs() -> None: assert UK_CGT_TARGET_SPECS == () assert cgt_metric_names == [ "hmrc/capital_gains_total", + "hmrc/cgt_liability", "hmrc/cgt_taxpayers", ] assert mapped["hmrc/capital_gains_total"] == "hmrc.cgt.gains_total" diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index f60de8a43..9c0f3aafa 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -748,6 +748,17 @@ def test_candidate_engine_surface_reuses_one_resolver( _write_staging_h5(input_h5) frame, _ = builder.load_uk_national_frame(input_h5) constructions = [] + cgt_period_contract = { + "version": "uk-cgt-measurement-v2", + "input_period": "2024", + "calibration_period": 2025, + "bound_measurements": { + "cgt_2024_gains": { + "model_variable": "capital_gains", + "measurement_period": 2024, + } + }, + } class StubResolver: def __init__(self, **kwargs): @@ -759,6 +770,7 @@ def receipt(self): return { "mode": "stub", "policyengine_uk_version": "test", + "cgt_period_contract": cgt_period_contract, } monkeypatch.setattr( @@ -790,15 +802,18 @@ def receipt(self): "national_inputs": 0, "local_metrics": {"constituency": 1, "la": 1}, "blocks": 1, + "cgt_period_contract": cgt_period_contract, } assert set(local_metrics) == {"constituency", "la"} assert len(national.targets) == 0 assert restore(prepared).table("household").equals(frame.table("household")) +@pytest.mark.parametrize("second_cgt_period", [2024, 2025, None]) def test_candidate_engine_surface_resolves_real_per_clone_blocks( monkeypatch, tmp_path, + second_cgt_period, ) -> None: pytest.importorskip("tables") builder = _load_builder_module() @@ -823,9 +838,23 @@ def __init__(self, **kwargs): constructions.append(kwargs) self.simulation = object() self.contract_targets = {} + self.cgt_period = 2024 if len(constructions) == 1 else second_cgt_period def receipt(self): - return {"mode": "stub", "policyengine_uk_version": "test"} + receipt = {"mode": "stub", "policyengine_uk_version": "test"} + if self.cgt_period is not None: + receipt["cgt_period_contract"] = { + "version": "uk-cgt-measurement-v2", + "input_period": "2024", + "calibration_period": 2025, + "bound_measurements": { + "cgt_2024_gains": { + "model_variable": "capital_gains", + "measurement_period": self.cgt_period, + } + }, + } + return receipt monkeypatch.setattr( builder, @@ -835,14 +864,23 @@ def receipt(self): index=household_ids, ), ) - prepared, restore, _, metrics, receipt = builder._resolve_candidate_engine_surface( - clone.frame, - TargetRegistry([], country="uk"), - period=2025, - scratch_dir=tmp_path / "block-scratch", - resolver_factory=StubResolver, - blocks=2, - ) + + def resolve(): + return builder._resolve_candidate_engine_surface( + clone.frame, + TargetRegistry([], country="uk"), + period=2025, + scratch_dir=tmp_path / "block-scratch", + resolver_factory=StubResolver, + blocks=2, + ) + + if second_cgt_period != 2024: + with pytest.raises(RuntimeError, match="CGT period contract is inconsistent"): + resolve() + return + + prepared, restore, _, metrics, receipt = resolve() assert len(constructions) == 2 assert [len(call["frame"].table("household")) for call in constructions] == [ @@ -850,6 +888,12 @@ def receipt(self): 12, ] assert receipt["blocks"] == 2 + assert receipt["cgt_period_contract"]["bound_measurements"] == { + "cgt_2024_gains": { + "model_variable": "capital_gains", + "measurement_period": 2024, + } + } assert receipt["deviation"] == "per_clone_block_engine_resolution" sensitivity = receipt["block_sensitivity"] assert ( diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index a921d2a64..819cb8acb 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -21,6 +21,10 @@ import pytest from microcosm.build.country_spec import load_country_spec +from microcosm.build.gates import ( + ledger_compile_parity_gate, + ledger_compile_parity_signed_differences, +) from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.ledger_targets import ( LedgerTargetReference, @@ -36,6 +40,12 @@ ) from microcosm.calibrate.matrix import build_constraint_matrix from microcosm.frame import EntitySchema, Frame, WeightKind, Weights +from tools.build_uk_ledger_compile_parity_signed_differences import ( + RECEIPTS, + _add_signed_rationale_notes, + _compile_for_receipt, + _fixture_for_receipt, +) from tools.generate_uk_target_references import ( POLICYENGINE_BINDING_KEYS, _annual_uc_award_band_token, @@ -232,6 +242,10 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: expected_metadata["uk_uc_expected_source_months"] = json.dumps( source_months, separators=(",", ":") ) + if "measurement_period" in binding: + expected_metadata["measurement_period"] = str(binding["measurement_period"]) + if binding.get("require_matching_fact_period"): + expected_metadata["source_period_policy"] = "exact_observation" assert reference["metadata"] == expected_metadata # The measure is a prepared column, so the pointed-to contract binding # must carry what the microcosm#622 materializer needs to prepare it. @@ -594,8 +608,21 @@ def test_uk_fixture_b_signed_differences_carry_ruled_rationales() -> None: )["differences"] } - assert "2023-24 outturn" in differences["hmrc.cgt.gains_total"]["reason"] - assert "forecast/uprated value" in differences["hmrc.cgt.gains_total"]["reason"] + expected = { + "hmrc.cgt.gains_total": ("calibration_drift", 119_258_000_000), + "hmrc.cgt.taxpayers_total": ("calibration_drift", 551_000), + "hmrc.cgt.liability_total": ("ledger_only", 22_503_000_000), + "obr.capital_gains_tax": ("fixture_only", None), + } + for name, (kind, value) in expected.items(): + assert differences[name]["kind"] == kind + assert differences[name].get("ledger_value") == value + assert "FY2024-25" in differences[name]["reason"] + assert "individuals-only" in differences["hmrc.cgt.gains_total"]["reason"] + assert ( + "historical forecast/uprated" in differences["hmrc.cgt.gains_total"]["reason"] + ) + assert differences["obr.capital_gains_tax"]["fixture_value"] == 21_801_546_197.09165 assert "single-age-90 share" in differences["ons.population.female_85_89"]["reason"] assert "single-age-90 share" in differences["ons.population.male_85_89"]["reason"] assert ( @@ -654,9 +681,9 @@ def test_uk_target_references_compile_from_real_staged_feed_rows() -> None: assert slc_plan_2.value == pytest.approx(2_778_253_361.64) assert slc_plan_2.metadata["ledger_member_fact_count"] == "2" - assert targets["hmrc.cgt.gains_total"].value == 65_937_000_000 - assert targets["hmrc.cgt.taxpayers_total"].value == 378_000 - assert targets["hmrc.cgt.gains_total"].metadata["ledger_fact_period"] == "2023" + assert targets["hmrc.cgt.gains_total"].value == 119_258_000_000 + assert targets["hmrc.cgt.taxpayers_total"].value == 551_000 + assert targets["hmrc.cgt.gains_total"].metadata["ledger_fact_period"] == "2024" caseload = targets["dwp.uc.households"] assert caseload.value == 6_197_311 @@ -1009,3 +1036,105 @@ def _real_uk_consumer_fact_rows() -> list[dict]: "value_type": "integer", }, ] + + +def test_current_national_compile_parity_regenerates_and_passes_with_pinned_feed(): + """Membership generation alone does not exercise release compile parity.""" + from microcosm.build.uk_runtime.battery_bindings import ( + _load_ledger_compile_parity_fixture, + ) + + configured = os.environ.get("CHRONICLE_UK_FACTS") + if not configured: + pytest.skip("authenticated national Chronicle artifact is not configured") + path = Path(configured) + if path.is_file(): + path = path.parent + pin = load_uk_national_chronicle_feed() + artifact = load_ledger_consumer_artifact( + path, + expected_facts_sha256=pin.facts_sha256, + expected_manifest_sha256=pin.manifest_sha256, + ) + assert artifact.fact_row_count == pin.fact_row_count + for spec in RECEIPTS: + if spec.surface != "national": + continue + compilation = _compile_for_receipt(spec, artifact.facts) + report = ledger_compile_parity_signed_differences( + compilation.registry, + _fixture_for_receipt(spec), + unsupported=compilation.unsupported, + ) + _add_signed_rationale_notes(report, fixture_resource=spec.fixture_resource) + expected = _load_uk_resource(spec.output_resource) + assert report == expected + if spec.target_period == 2023: + inherited_uc = [ + r + for r in report["differences"] + if r["name"] + in { + "dwp.uc.households", + "dwp.uc.households_couple_no_children", + "dwp.uc.households_couple_with_children", + "dwp.uc.households_single_no_children", + "dwp.uc.households_single_with_children", + } + ] + assert len(inherited_uc) == 5 + assert all( + "frozen 2023 production" in r["reason"] + and "2025 source windows" in r["reason"] + for r in inherited_uc + ) + gate = ledger_compile_parity_gate( + compilation.registry, + _load_ledger_compile_parity_fixture(spec.fixture_resource), + signed_differences=expected["differences"], + ) + assert gate.passed, gate.failures + + +@pytest.mark.parametrize( + "mutation", ["old_gain_value", "missing_cash_sign", "missing_liability_sign"] +) +def test_public_cgt_parity_fixture_rejects_stale_values_and_unsigned_names(mutation): + """Public rows catch this drift even where the full feed is unavailable.""" + names = { + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", + "hmrc.cgt.liability_total", + "obr.capital_gains_tax", + } + references = [ + r for r in load_country_spec("uk").target_references if r.name in names + ] + actual = compile_ledger_target_references( + _fixture_feed_rows(), references, country="uk" + ) + fixture = _load_uk_resource("registry_parity_fixture_2025.json") + fixture["rows"] = [ + r for r in fixture["rows"] if r.get("contract_target_id") in names + ] + signed = [ + r + for r in _load_uk_resource( + "ledger_compile_parity_incumbent_2025_signed_differences.json" + )["differences"] + if r["name"] in names + ] + assert ledger_compile_parity_gate(actual, fixture, signed_differences=signed).passed + if mutation == "old_gain_value": + next(r for r in signed if r["name"] == "hmrc.cgt.gains_total")[ + "ledger_value" + ] = 127_316_000_000 + else: + omitted = ( + "obr.capital_gains_tax" + if mutation == "missing_cash_sign" + else "hmrc.cgt.liability_total" + ) + signed = [r for r in signed if r["name"] != omitted] + gate = ledger_compile_parity_gate(actual, fixture, signed_differences=signed) + assert not gate.passed diff --git a/packages/microcosm-build/tests/test_uk_terminal_gates.py b/packages/microcosm-build/tests/test_uk_terminal_gates.py index 1b46d98fc..b1fa9cdb6 100644 --- a/packages/microcosm-build/tests/test_uk_terminal_gates.py +++ b/packages/microcosm-build/tests/test_uk_terminal_gates.py @@ -389,12 +389,7 @@ def test_target_fit_out_of_force_exclusion_fails_even_without_a_breach() -> None def test_committed_target_fit_register_retains_only_live_deferrals() -> None: register = uk_default_target_fit_reviewed_exclusions() - assert set(register) == {"obr.capital_gains_tax@2025"} - record = register["obr.capital_gains_tax@2025"] - assert record.approved_by == "juaristi22" - assert record.adjudication == "microcosm#875" - assert record.approved_on == "2026-09-05" - assert record.expires_on == "2026-10-05" + assert register == {} # Aggregate errors from the fresh UC #882 development run: 1,500 epochs with @@ -417,7 +412,6 @@ def test_restored_fit_checks_leave_empty_payment_tail_cells_blocked() -> None: { **_RESTORED_TARGET_FIT_ERRORS, **empty_tail, - "obr.capital_gains_tax@2025": 0.45, }, reviewed_exclusions=uk_default_target_fit_reviewed_exclusions(), now=date(2026, 9, 9), @@ -426,7 +420,7 @@ def test_restored_fit_checks_leave_empty_payment_tail_cells_blocked() -> None: assert not fit.passed assert fit.details["stale_exclusions"] == [] assert fit.details["failing_targets"] == empty_tail - assert set(fit.details["reviewed_exclusions"]) == {"obr.capital_gains_tax@2025"} + assert fit.details["reviewed_exclusions"] == {} @pytest.mark.parametrize("name", sorted(_RESTORED_TARGET_FIT_ERRORS)) @@ -450,6 +444,20 @@ def test_restored_fit_checks_apply_if_a_later_run_breaches_again( assert fit.details["failing_targets"] == ({} if passes else {name: relative_error}) +def test_observed_liability_has_no_retired_cash_exemption() -> None: + register = uk_default_target_fit_reviewed_exclusions() + assert "obr.capital_gains_tax@2025" not in register + assert "hmrc.cgt.liability_total@2025" not in register + fit = uk_target_fit_gate( + {"hmrc.cgt.liability_total@2025": 0.30}, + reviewed_exclusions=register, + now=date(2026, 9, 15), + ) + assert not fit.passed + assert fit.details["failing_targets"] == {"hmrc.cgt.liability_total@2025": 0.30} + assert "obr.capital_gains_tax@2025" not in fit.details["dormant_exclusions"] + + def test_ported_june_parity_gates_reject_empty_evidence() -> None: export = uk_export_surface_gate((), ()) surface = uk_target_surface_gate((), ()) diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index 6ded1d6e9..b28d68b00 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -57,11 +57,46 @@ class ParityReceiptSpec: ), ) -_CGT_GAINS_TOTAL_RATIONALE = ( - "Ledger carries the HMRC 2023-24 outturn value GBP 65,937,000,000 and " - "holds it by identity under the current doctrine; the incumbent Fixture B " - "row is GBP 67,727,478,991.60 at 2025 because it carries a forecast/uprated " - "value. Signed as a doctrine consequence, not a binding error." +_CGT_OBSERVED_RATIONALES = { + "hmrc.cgt.gains_total": ( + "PR #889 selects HMRC FY2024-25 individuals-only observed gains of " + "GBP 119,258,000,000, measured in 2024 at calibration index 2025. " + "The frozen incumbent fixture retains its historical forecast/uprated " + "GBP 67,727,478,991.60 value. This explicit observation-year and " + "population-scope change does not rewrite the historical fixture." + ), + "hmrc.cgt.taxpayers_total": ( + "PR #889 selects the HMRC FY2024-25 individuals-only observation of " + "551,000 taxpayers, measured in 2024 at calibration index 2025. " + "The frozen incumbent fixture retains its historical 378,000 count." + ), + "hmrc.cgt.liability_total": ( + "PR #889 adds HMRC FY2024-25 individuals-only liability of " + "GBP 22,503,000,000 to the observed-year fit. The historical fixture " + "has no equivalent liability row; this is a declared ledger-only " + "observation, not a cash-receipts reconciliation." + ), + "obr.capital_gains_tax": ( + "PR #889 retains the exact March 2026 OBR FY2025-26 cash forecast " + "as diagnostic provenance outside the FY2024-25 observation fit. " + "The frozen incumbent fixture keeps its fitted cash row, so it is " + "fixture-only on the current surface. This scoped change does not " + "settle the general liability-to-cash translation tracked by #875." + ), +} + +_UC_PAID_WINDOW_NAMES = frozenset( + {"dwp.uc.households"} + | {f"dwp.uc.households_children_{i}" for i in (1, 2, 3, 4, "5_or_more")} + | { + f"dwp.uc.households_{family}" + for family in ( + "couple_no_children", + "couple_with_children", + "single_no_children", + "single_with_children", + ) + } ) _ONS_TERMINAL_BAND_RATIONALES = { @@ -345,14 +380,37 @@ def _add_signed_rationale_notes( *, fixture_resource: str, ) -> None: - if fixture_resource != "registry_parity_fixture_2025.json": + if fixture_resource not in { + "registry_parity_fixture_2025.json", + "parity_fixture_production_2023.json", + }: return for row in report.get("differences", ()): if not isinstance(row, dict): continue name = str(row.get("name", "")) - if name == "hmrc.cgt.gains_total": - row["reason"] = _CGT_GAINS_TOTAL_RATIONALE + if name in _UC_PAID_WINDOW_NAMES: + baseline = ( + "2023 production" + if fixture_resource == "parity_fixture_production_2023.json" + else "2025 incumbent" + ) + inherited_change = ( + "PR #891 contract with #892 source-window averaging" + if name.startswith("dwp.uc.households_children_") + else "PR #891 contract" + ) + row["reason"] = ( + f"Inherited {inherited_change}: current paid-UC counts use the " + "explicit January-December 2025 source windows on the ec7169 " + f"national feed. This compares that declaration with the frozen {baseline} " + "baseline; it does not redatum the observations to the comparison " + "year or create a new year ruling." + ) + elif fixture_resource != "registry_parity_fixture_2025.json": + continue + elif name in _CGT_OBSERVED_RATIONALES: + row["reason"] = _CGT_OBSERVED_RATIONALES[name] elif name in _ONS_TERMINAL_BAND_RATIONALES: row["reason"] = _ONS_TERMINAL_BAND_RATIONALES[name] diff --git a/tools/build_uk_rowwise_candidate.py b/tools/build_uk_rowwise_candidate.py index a66f2b709..e683d4664 100644 --- a/tools/build_uk_rowwise_candidate.py +++ b/tools/build_uk_rowwise_candidate.py @@ -421,6 +421,12 @@ def _resolve_candidate_engine_surface( versions = {receipt.get("policyengine_uk_version") for receipt in resolver_receipts} if len(modes) != 1 or len(versions) != 1: raise RuntimeError("per-clone engine resolver provenance is inconsistent.") + cgt_period_contract = resolver_receipts[0].get("cgt_period_contract") + if any( + block_receipt.get("cgt_period_contract") != cgt_period_contract + for block_receipt in resolver_receipts[1:] + ): + raise RuntimeError("per-clone CGT period contract is inconsistent.") receipt = { "mode": next(iter(modes)), "engine_version": next(iter(versions)), @@ -434,6 +440,8 @@ def _resolve_candidate_engine_surface( }, "blocks": blocks, } + if cgt_period_contract is not None: + receipt["cgt_period_contract"] = cgt_period_contract if blocks > 1: receipt["deviation"] = "per_clone_block_engine_resolution" present = sorted( diff --git a/tools/generate_uk_target_references.py b/tools/generate_uk_target_references.py index 3d18e85e7..0b90e9a1c 100644 --- a/tools/generate_uk_target_references.py +++ b/tools/generate_uk_target_references.py @@ -52,10 +52,12 @@ "kind", "map_to", "metric_name", + "measurement_period", "notes", "output_delta", "output_variable", "reduce", + "require_matching_fact_period", "source_lines", "threshold_price_base_year", "value_expression", @@ -75,8 +77,9 @@ "is the contract selector plus geography pins; entity is from_entity, " "then map_to, then household; measure is the prepared-column metric name " "or fan-out row name; family is the contract family; period is the model " - "and calibration year 2025. Observation windows are declared separately " - "from the FRS 2024-25 survey vintage. Observed values stay in Ledger facts " + "and calibration year 2025, distinct from the FRS 2024-25 base period 2024. " + "Observation windows are declared separately; metadata.measurement_period " + "records observed-year exceptions. Observed values stay in Ledger facts " "and resolve through each reference's declared value operation. Deferred " "classes and geography-pin decisions are recorded in " "uk/target_reference_membership.json. metadata.measure_kind records that " @@ -342,6 +345,11 @@ def _reference_metadata(contract: Mapping[str, Any]) -> dict[str, dict[str, str] metadata = {} if measurement.get("observation_basis") is not None: metadata["observation_basis"] = str(measurement["observation_basis"]) + binding = target.get("bindings", {}).get("policyengine", {}) + if binding.get("measurement_period") is not None: + metadata["measurement_period"] = str(binding["measurement_period"]) + if binding.get("require_matching_fact_period"): + metadata["source_period_policy"] = "exact_observation" if "source_months" in measurement: if target.get("family") != "dwp_universal_credit": raise ValueError("source_months is currently a UK UC-only declaration.")