From 7bc5cfb6d1a78fbd81b7b16d1873b85b12ce5356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 03:25:15 +0200 Subject: [PATCH 1/7] Extend the shared Ledger machinery for contract-driven target consumption Resolver: period-token collapse for British year spellings, assertion-policy enforcement (observed-only default, source projections by declaration), and three declared multi-fact operations (sum, calendar_year_average, latest_plateau) partitioned to a single vintage. New country-agnostic modules: target_reference_authoring (contract + feed + period -> typed references + membership classification) and target_materialization (binding interpreter + the three counterfactual provider engines, duck-typed over a model adapter). gates.py gains the ledger compile-parity gate over the existing parity comparator; ledger_artifact.py gains the shared CLI pin helpers. The calibrate matrix now collapses any entity to the weight entity via declared relationships (benunit-grain references previously aborted on real frames). Co-Authored-By: Claude Fable 5 --- changelog.d/622-ledger-artifact-pins.added.md | 1 + .../622-ledger-materialization.added.md | 1 + .../622-ledger-resolver-extensions.added.md | 1 + .../src/microcosm/build/__init__.py | 8 + .../src/microcosm/build/gates.py | 281 ++++++++- .../src/microcosm/build/ledger_artifact.py | 55 +- .../src/microcosm/build/ledger_targets.py | 409 +++++++++++-- .../microcosm/build/target_materialization.py | 214 +++++++ .../build/target_reference_authoring.py | 479 +++++++++++++++ packages/microcosm-build/tests/test_gates.py | 191 +++++- .../tests/test_ledger_artifact.py | 35 +- .../tests/test_ledger_targets.py | 561 +++++++++++++++++- .../tests/test_target_materialization.py | 182 ++++++ .../src/microcosm/calibrate/matrix.py | 87 ++- .../microcosm-calibrate/tests/test_matrix.py | 47 ++ 15 files changed, 2454 insertions(+), 98 deletions(-) create mode 100644 changelog.d/622-ledger-artifact-pins.added.md create mode 100644 changelog.d/622-ledger-materialization.added.md create mode 100644 changelog.d/622-ledger-resolver-extensions.added.md create mode 100644 packages/microcosm-build/src/microcosm/build/target_materialization.py create mode 100644 packages/microcosm-build/src/microcosm/build/target_reference_authoring.py create mode 100644 packages/microcosm-build/tests/test_target_materialization.py diff --git a/changelog.d/622-ledger-artifact-pins.added.md b/changelog.d/622-ledger-artifact-pins.added.md new file mode 100644 index 000000000..4bdd06afc --- /dev/null +++ b/changelog.d/622-ledger-artifact-pins.added.md @@ -0,0 +1 @@ +Add shared Ledger consumer-artifact CLI helpers and wire UK national builds to record Ledger fact provenance. diff --git a/changelog.d/622-ledger-materialization.added.md b/changelog.d/622-ledger-materialization.added.md new file mode 100644 index 000000000..898de71dd --- /dev/null +++ b/changelog.d/622-ledger-materialization.added.md @@ -0,0 +1 @@ +Add shared target-binding materialization helpers and UK Ledger target compilation/materialization adapters. diff --git a/changelog.d/622-ledger-resolver-extensions.added.md b/changelog.d/622-ledger-resolver-extensions.added.md new file mode 100644 index 000000000..3fc6d262e --- /dev/null +++ b/changelog.d/622-ledger-resolver-extensions.added.md @@ -0,0 +1 @@ +Extend Ledger target resolution with UK period-token collapse, assertion-policy filtering, and narrow multi-fact sums. diff --git a/packages/microcosm-build/src/microcosm/build/__init__.py b/packages/microcosm-build/src/microcosm/build/__init__.py index 15a14b1e5..213731948 100644 --- a/packages/microcosm-build/src/microcosm/build/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/__init__.py @@ -88,6 +88,8 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: formula_owned_export_gate, input_column_coverage_gate, input_mass_parity_gate, + ledger_compile_parity_gate, + ledger_compile_parity_signed_differences, macro_realism_gate, nonconstant_columns_gate, nonnegative_columns_gate, @@ -109,7 +111,9 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: ) from microcosm.build.ledger_artifact import ( # noqa: E402 - after the compat gate LedgerConsumerArtifact, + add_ledger_artifact_args, load_ledger_consumer_artifact, + resolve_ledger_artifact, ) from microcosm.build.ledger_targets import ( # noqa: E402 - after the compat gate LedgerTargetMapping, @@ -183,6 +187,7 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "LedgerConsumerArtifact", "LedgerTargetMapping", "LedgerTargetSelection", + "add_ledger_artifact_args", "aggregate_admin_gate", "apply_ledger_target_profile", "default_valued_columns_gate", @@ -192,6 +197,8 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "formula_owned_export_gate", "input_column_coverage_gate", "input_mass_parity_gate", + "ledger_compile_parity_gate", + "ledger_compile_parity_signed_differences", "load_ledger_consumer_artifact", "macro_realism_gate", "nonconstant_columns_gate", @@ -199,6 +206,7 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "parity_gate", "per_family_fit_gate", "relative_error_loss", + "resolve_ledger_artifact", "rotated_folds", "source_coverage_gate", "source_stage_input_coverage_gate", diff --git a/packages/microcosm-build/src/microcosm/build/gates.py b/packages/microcosm-build/src/microcosm/build/gates.py index c181d21f8..b6f298d5c 100644 --- a/packages/microcosm-build/src/microcosm/build/gates.py +++ b/packages/microcosm-build/src/microcosm/build/gates.py @@ -40,6 +40,7 @@ import math import pickle +from collections import Counter from collections.abc import Iterable, Mapping from copy import deepcopy from dataclasses import dataclass, field @@ -47,7 +48,8 @@ import numpy as np import pandas as pd -from microcosm.calibrate.registry import TargetSpec +from microcosm.build.ledger_targets import ledger_target_registry_parity_report +from microcosm.calibrate.registry import TargetRegistry, TargetSpec from microcosm.calibrate.solve import relative_error_loss from microcosm.frame import WeightKind @@ -62,6 +64,8 @@ "exported_nonzero_gate", "input_column_coverage_gate", "input_mass_parity_gate", + "ledger_compile_parity_gate", + "ledger_compile_parity_signed_differences", "macro_realism_gate", "nonconstant_columns_gate", "nonnegative_columns_gate", @@ -177,6 +181,281 @@ def _sealed_stacked_gate_result( return result +def ledger_compile_parity_gate( + compiled_registry: TargetRegistry | Mapping[str, object], + fixture: TargetRegistry | Mapping[str, object], + *, + signed_differences: Iterable[Mapping[str, object]] = (), + name: str = "ledger_compile_parity", +) -> GateResult: + """Compare a Ledger-compiled target registry against a signed fixture. + + ``signed_differences`` names reviewed ``(name, period)`` rows that may be + absent or calibration-different on either side. Every unsigned row gap or + target-value difference is still reported by the shared registry parity + comparator. + """ + + actual = _coerce_target_registry(compiled_registry, fallback_country="uk") + expected = _coerce_target_registry(fixture, fallback_country=actual.country) + signed_keys = _signed_difference_keys(signed_differences) + if signed_keys: + actual = _drop_registry_keys(actual, signed_keys) + expected = _drop_registry_keys(expected, signed_keys) + actual = _ledger_compile_value_registry(actual) + expected = _ledger_compile_value_registry(expected) + report = ledger_target_registry_parity_report(expected, actual) + failures = _calibration_effective_parity_failures(report.failures) + return GateResult( + name=name, + passed=not failures, + failures=failures, + details={ + **dict(report.details), + "fixture": ( + fixture.get("fixture") + if isinstance(fixture, Mapping) + else "target_registry" + ), + "signed_difference_count": len(signed_keys), + "signed_differences": [ + { + "name": str(row.get("name")), + "period": row.get("period"), + "reason": str(row.get("reason", "")), + } + for row in signed_differences + ], + }, + ) + + +def ledger_compile_parity_signed_differences( + compiled_registry: TargetRegistry | Mapping[str, object], + fixture: TargetRegistry | Mapping[str, object], + *, + unsupported: Iterable[Mapping[str, object]] = (), +) -> dict[str, object]: + """Classify reviewed Ledger parity differences by ``(name, period, value)``. + + The compile-parity fixtures intentionally live in different namespaces from + the compiled Ledger target registry. For these signed-difference resources, + row equality is therefore only the calibration fact identity: same name, + same period, and exactly equal float value. + """ + + actual = _coerce_target_registry(compiled_registry, fallback_country="uk") + expected = _coerce_target_registry(fixture, fallback_country=actual.country) + actual_by_key = {spec.key: spec for spec in actual} + expected_by_key = {spec.key: spec for spec in expected} + unsupported_by_key = { + (str(row["name"]), row.get("period", 0)): row + for row in unsupported + if "name" in row + } + + differences: list[dict[str, object]] = [] + for key in sorted( + set(unsupported_by_key) & set(expected_by_key) - set(actual_by_key), + key=_sort_key, + ): + name, period = key + fixture_spec = expected_by_key.get(key) + row = { + "kind": "ledger_absent", + "name": name, + "period": period, + "reason": "Packaged Ledger reference did not resolve for this comparison period.", + } + if fixture_spec is not None: + row["fixture_value"] = fixture_spec.value + differences.append(row) + + for key in sorted(set(expected_by_key) - set(actual_by_key), key=_sort_key): + if key in unsupported_by_key: + continue + spec = expected_by_key[key] + differences.append( + { + "fixture_value": spec.value, + "kind": "fixture_only", + "name": spec.name, + "period": spec.period, + "reason": ( + "Fixture row has no Ledger-compiled counterpart at this " + "comparison period." + ), + } + ) + + for key in sorted(set(actual_by_key) - set(expected_by_key), key=_sort_key): + spec = actual_by_key[key] + differences.append( + { + "kind": "ledger_only", + "ledger_value": spec.value, + "name": spec.name, + "period": spec.period, + "reason": ( + "Ledger-compiled row has no fixture counterpart at this " + "comparison period." + ), + } + ) + + for key in sorted(set(actual_by_key) & set(expected_by_key), key=_sort_key): + actual_spec = actual_by_key[key] + expected_spec = expected_by_key[key] + if actual_spec.value == expected_spec.value: + continue + differences.append( + { + "fixture_value": expected_spec.value, + "kind": "calibration_drift", + "ledger_value": actual_spec.value, + "name": actual_spec.name, + "period": actual_spec.period, + "reason": ( + "Ledger-compiled value differs from the fixture value at " + "this comparison period." + ), + } + ) + + counts = Counter(str(row["kind"]) for row in differences) + return { + "compiled_count": len(actual), + "counts_by_kind": dict(sorted(counts.items())), + "difference_count": len(differences), + "differences": differences, + "fixture_count": len(expected), + } + + +def _sort_key(key: tuple[str, int | str]) -> tuple[str, str]: + return (key[0], str(key[1])) + + +def _calibration_effective_parity_failures( + failures: tuple[str, ...], +) -> tuple[str, ...]: + calibration_failed = any( + failure.startswith("calibration-effective target digest differs") + for failure in failures + ) + kept: list[str] = [] + for failure in failures: + if failure.startswith("full target registry digest differs"): + continue + if failure.startswith("target ") and not calibration_failed: + continue + kept.append(failure) + return tuple(kept) + + +def _coerce_target_registry( + value: TargetRegistry | Mapping[str, object], + *, + fallback_country: str, +) -> TargetRegistry: + if isinstance(value, TargetRegistry): + return value + rows = value.get("rows") + if not isinstance(rows, Iterable) or isinstance(rows, (str, bytes)): + raise TypeError("Ledger compile parity fixture must carry iterable rows.") + materialized_rows = tuple(rows) + mapped_names = [ + str(row["contract_target_id"]) + for row in materialized_rows + if isinstance(row, Mapping) and row.get("contract_target_id") + ] + duplicate_mapped_names = { + name for name in mapped_names if mapped_names.count(name) > 1 + } + specs = [] + for row in materialized_rows: + if not isinstance(row, Mapping): + raise TypeError("Ledger compile parity fixture rows must be mappings.") + mapped_name = row.get("contract_target_id") + name = ( + mapped_name + if mapped_name and str(mapped_name) not in duplicate_mapped_names + else row["name"] + ) + specs.append( + TargetSpec( + name=str(name), + entity=str(row.get("entity", "household")), + measure=str(row.get("measure", name)), + value=float(row["value"]), + period=row.get("period", 0), + source=str(row.get("source", value.get("fixture", "fixture"))), + family=str(row.get("family", row.get("source", "fixture"))), + signed=bool(row.get("signed", False)), + tolerance=( + float(row["tolerance"]) + if row.get("tolerance") is not None + else None + ), + metadata={ + str(key): str(child) + for key, child in ( + row.get("metadata", {}) + if isinstance(row.get("metadata", {}), Mapping) + else {} + ).items() + }, + ) + ) + return TargetRegistry(specs, country=str(value.get("country", fallback_country))) + + +def _signed_difference_keys( + signed_differences: Iterable[Mapping[str, object]], +) -> set[tuple[str, int | str]]: + keys: set[tuple[str, int | str]] = set() + for row in signed_differences: + if "name" not in row or "period" not in row: + raise ValueError("Signed ledger parity differences need name and period.") + period = row["period"] + if not isinstance(period, (int, str)): + raise ValueError( + "Signed ledger parity difference period must be int or str." + ) + keys.add((str(row["name"]), period)) + return keys + + +def _drop_registry_keys( + registry: TargetRegistry, + keys: set[tuple[str, int | str]], +) -> TargetRegistry: + return TargetRegistry( + (spec for spec in registry if spec.key not in keys), + country=registry.country, + ) + + +def _ledger_compile_value_registry(registry: TargetRegistry) -> TargetRegistry: + """Project compile-parity rows to the reviewed ``(name, period, value)`` key.""" + + return TargetRegistry( + ( + TargetSpec( + name=spec.name, + entity="target", + measure=spec.name, + value=spec.value, + period=spec.period, + source="ledger_compile_parity", + family="ledger_compile_parity", + ) + for spec in sorted(registry, key=lambda item: (item.name, str(item.period))) + ), + country=registry.country, + ) + + @dataclass(frozen=True) class GateReport: """The full acceptance suite: every gate, one verdict. diff --git a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py index c87f19798..ff9991a5e 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -17,6 +17,7 @@ import hashlib import json +from argparse import ArgumentParser, Namespace from dataclasses import dataclass from pathlib import Path from typing import Any @@ -26,7 +27,9 @@ "CONSUMER_ARTIFACT_SCHEMA_VERSION", "DEFAULT_LEDGER_ASSERTION", "LedgerConsumerArtifact", + "add_ledger_artifact_args", "load_ledger_consumer_artifact", + "resolve_ledger_artifact", ] CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" @@ -110,16 +113,14 @@ def load_ledger_consumer_artifact( ) if not facts_path.exists(): raise FileNotFoundError( - "Ledger consumer artifact has no consumer_facts.jsonl: " - f"{artifact_path}" + f"Ledger consumer artifact has no consumer_facts.jsonl: {artifact_path}" ) manifest_bytes = manifest_path.read_bytes() manifest_sha256 = hashlib.sha256(manifest_bytes).hexdigest() manifest = json.loads(manifest_bytes) if not isinstance(manifest, dict): raise ValueError( - f"Ledger consumer artifact manifest must be an object: " - f"{manifest_path}" + f"Ledger consumer artifact manifest must be an object: {manifest_path}" ) schema_version = manifest.get("schema_version") if schema_version != CONSUMER_ARTIFACT_SCHEMA_VERSION: @@ -139,10 +140,7 @@ def load_ledger_consumer_artifact( "Ledger consumer artifact fact rows do not match the " f"manifest hash: {facts_sha256} != {declared}." ) - if ( - expected_facts_sha256 is not None - and expected_facts_sha256 != facts_sha256 - ): + if expected_facts_sha256 is not None and expected_facts_sha256 != facts_sha256: raise ValueError( "Ledger consumer facts do not match the pinned hash: " f"{facts_sha256} != {expected_facts_sha256}." @@ -168,6 +166,47 @@ def load_ledger_consumer_artifact( ) +def add_ledger_artifact_args(parser: ArgumentParser) -> None: + """Add shared Ledger consumer-artifact arguments to a CLI parser.""" + + parser.add_argument( + "--ledger-facts", + type=Path, + help=( + "PolicyEngine Ledger consumer artifact directory (manifest.json " + "+ consumer_facts.jsonl) or a bare consumer_facts.jsonl file." + ), + ) + parser.add_argument( + "--ledger-facts-sha256", + help="Pin: expected SHA-256 of consumer_facts.jsonl.", + ) + parser.add_argument( + "--ledger-manifest-sha256", + help=( + "Pin: expected SHA-256 of the Ledger consumer artifact manifest.json; " + "requires an artifact directory feed." + ), + ) + + +def resolve_ledger_artifact(args: Namespace) -> LedgerConsumerArtifact | None: + """Load the CLI-selected Ledger artifact, returning ``None`` when absent.""" + + ledger_facts = getattr(args, "ledger_facts", None) + if ledger_facts is None: + if getattr(args, "ledger_facts_sha256", None) is not None: + raise ValueError("--ledger-facts-sha256 requires --ledger-facts.") + if getattr(args, "ledger_manifest_sha256", None) is not None: + raise ValueError("--ledger-manifest-sha256 requires --ledger-facts.") + return None + return load_ledger_consumer_artifact( + ledger_facts, + expected_facts_sha256=getattr(args, "ledger_facts_sha256", None), + expected_manifest_sha256=getattr(args, "ledger_manifest_sha256", None), + ) + + def _load_fact_rows(path: Path) -> tuple[dict[str, Any], ...]: rows: list[dict[str, Any]] = [] with path.open() as file: diff --git a/packages/microcosm-build/src/microcosm/build/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/ledger_targets.py index cfcd41d50..5a6d3e472 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_targets.py @@ -20,6 +20,13 @@ from microcosm.calibrate import TargetRegistry, TargetSpec SUPPORTED_LEDGER_AGGREGATIONS = frozenset(("sum",)) +ALLOWED_ASSERTION_POLICIES = frozenset(("observed_only", "allow_source_projection")) +ALLOWED_VALUE_OPERATIONS = frozenset( + ("identity", "sum", "calendar_year_average", "latest_plateau") +) +MULTI_FACT_VALUE_OPERATIONS = frozenset( + ("sum", "calendar_year_average", "latest_plateau") +) DEFAULT_HIERARCHY_MATCH_SPEC_FIELDS = ("entity", "period", "family", "filter") @@ -73,6 +80,7 @@ class LedgerTargetReference: tolerance: float | None = None notes: str = "" metadata: Mapping[str, str] = field(default_factory=dict) + assertion_policy: str = "observed_only" uprating_index: str | None = None uprating_from_period: int | str | None = None uprating_to_period: int | str | None = None @@ -89,17 +97,22 @@ def __post_init__(self) -> None: f"LedgerTargetReference {self.name!r}: either ledger_fact_key " "or ledger_source_record_id or ledger_selector is required." ) - if self.value_operation != "identity": + if self.value_operation not in ALLOWED_VALUE_OPERATIONS: raise ValueError( f"LedgerTargetReference {self.name!r}: unsupported value_operation " f"{self.value_operation!r}. Microcosm currently permits only " - "identity resolution from Ledger facts." + f"{sorted(ALLOWED_VALUE_OPERATIONS)!r} resolution from Ledger facts." ) if not isinstance(self.ledger_selector, Mapping): raise TypeError( f"LedgerTargetReference {self.name!r}: ledger_selector must be a " f"mapping, got {type(self.ledger_selector).__name__}." ) + if self.assertion_policy not in ALLOWED_ASSERTION_POLICIES: + raise ValueError( + f"LedgerTargetReference {self.name!r}: unsupported " + f"assertion_policy {self.assertion_policy!r}." + ) if not self.entity: raise ValueError( f"LedgerTargetReference {self.name!r}: entity must be non-empty." @@ -368,8 +381,8 @@ def compile_ledger_target_references( fact_index = _ledger_fact_index(facts) specs: list[TargetSpec] = [] for reference in references: - fact = _resolve_reference_fact(reference, fact_index) - specs.append(target_spec_from_ledger_reference(fact, reference)) + resolved = _resolve_reference_fact(reference, fact_index) + specs.append(target_spec_from_ledger_reference(resolved, reference)) return TargetRegistry(specs, country=country) @@ -495,40 +508,35 @@ def reconcile_ledger_target_hierarchy( def target_spec_from_ledger_reference( - fact: object, + fact: object | tuple[object, ...], reference: LedgerTargetReference, ) -> TargetSpec: """Compile one resolved Ledger fact plus Microcosm mapping into a target.""" - value = _at(fact, "value") - if value is None: - raise ValueError(f"Ledger fact for {reference.name!r} is missing value.") - try: - numeric_value = float(value) - except (OverflowError, TypeError, ValueError) as exc: - raise ValueError( - f"Ledger fact for {reference.name!r} has invalid value {value!r}." - ) from exc - if not math.isfinite(numeric_value): + facts = fact if isinstance(fact, tuple) else (fact,) + if not facts: + raise ValueError(f"Ledger target reference {reference.name!r} has no facts.") + if len(facts) > 1 and reference.value_operation not in MULTI_FACT_VALUE_OPERATIONS: raise ValueError( - f"Ledger fact for {reference.name!r} has invalid value {value!r}." + f"Ledger target reference {reference.name!r}: multiple Ledger facts " + "require an aggregating value_operation, got " + f"{reference.value_operation!r}." ) + fact = facts[0] + numeric_values = [] + for member in facts: + numeric_values.append(_numeric_fact_value(member, reference)) + _validate_fact_aggregation(member, reference) + + if reference.value_operation == "calendar_year_average": + numeric_value = sum(numeric_values) / len(numeric_values) + elif reference.value_operation == "latest_plateau": + numeric_value = numeric_values[-1] + elif reference.value_operation == "sum": + numeric_value = sum(numeric_values) + else: + numeric_value = numeric_values[0] - aggregation = _str_at(fact, "aggregation", "method") - accepts_time_mean = ( - reference.metadata.get("fact_aggregation") == "time_mean" - and aggregation == "mean" - ) - if aggregation not in SUPPORTED_LEDGER_AGGREGATIONS and not accepts_time_mean: - raise ValueError( - f"Ledger fact for {reference.name!r} has unsupported aggregation " - f"{aggregation!r}; Microcosm targets must be compiled from sum " - "facts, including counts represented as sums of prepared indicator " - "columns. A mean fact is only accepted when the Microcosm mapping " - "declares fact_aggregation=time_mean, asserting the mean is taken " - "over time periods on a stock count (still a linear level), never " - "over entities (a per-unit ratio is not calibratable)." - ) if not reference.measure: raise ValueError( f"Ledger target reference {reference.name!r}: measure is required; " @@ -558,11 +566,67 @@ def target_spec_from_ledger_reference( notes=reference.notes, metadata={ **_ledger_metadata(fact, fact_key=_fact_key(fact)), + **_multi_fact_reference_metadata(facts), + "ledger_resolved_assertion": _fact_assertion(fact), **_reference_metadata(reference), }, ) +def _numeric_fact_value(fact: object, reference: LedgerTargetReference) -> float: + value = _at(fact, "value") + if value is None: + raise ValueError(f"Ledger fact for {reference.name!r} is missing value.") + try: + numeric_value = float(value) + except (OverflowError, TypeError, ValueError) as exc: + raise ValueError( + f"Ledger fact for {reference.name!r} has invalid value {value!r}." + ) from exc + if not math.isfinite(numeric_value): + raise ValueError( + f"Ledger fact for {reference.name!r} has invalid value {value!r}." + ) + return numeric_value + + +def _validate_fact_aggregation( + fact: object, + reference: LedgerTargetReference, +) -> None: + aggregation = _str_at(fact, "aggregation", "method") + accepts_time_mean = ( + reference.metadata.get("fact_aggregation") == "time_mean" + and aggregation == "mean" + ) + if aggregation not in SUPPORTED_LEDGER_AGGREGATIONS and not accepts_time_mean: + raise ValueError( + f"Ledger fact for {reference.name!r} has unsupported aggregation " + f"{aggregation!r}; Microcosm targets must be compiled from sum " + "facts, including counts represented as sums of prepared indicator " + "columns. A mean fact is only accepted when the Microcosm mapping " + "declares fact_aggregation=time_mean, asserting the mean is taken " + "over time periods on a stock count (still a linear level), never " + "over entities (a per-unit ratio is not calibratable)." + ) + + +def _multi_fact_reference_metadata(facts: tuple[object, ...]) -> dict[str, str]: + if len(facts) == 1: + return {} + member_keys = tuple( + sorted(_fact_key(fact) or _source_record_id(fact) for fact in facts) + ) + payload = json.dumps(member_keys, separators=(",", ":")) + return { + "ledger_member_fact_count": str(len(facts)), + "ledger_member_fact_keys": payload, + "ledger_member_fact_digest": hashlib.sha256( + payload.encode("utf-8") + ).hexdigest(), + } + + def ledger_target_registry_parity_report( expected: TargetRegistry, actual: TargetRegistry, @@ -801,6 +865,14 @@ def _resolve_reference_fact( if _fact_matches_selector(fact, reference.ledger_selector) ] eligible_matches = _eligible_selector_matches(reference, matches) + if reference.value_operation == "sum" and eligible_matches: + return _resolve_sum_reference_facts(reference, eligible_matches) + if reference.value_operation == "calendar_year_average" and eligible_matches: + return _resolve_calendar_year_average_reference_facts( + reference, eligible_matches + ) + if reference.value_operation == "latest_plateau" and eligible_matches: + return _resolve_latest_plateau_reference_facts(reference, eligible_matches) if len(eligible_matches) == 1: return eligible_matches[0] latest_match = _latest_period_selector_match(reference, eligible_matches) @@ -833,6 +905,166 @@ def _resolve_reference_fact( ) +def _resolve_sum_reference_facts( + reference: LedgerTargetReference, + eligible_matches: list[object], +) -> tuple[object, ...]: + partitions: dict[tuple[tuple[str, ...], tuple[int, int, str]], list[object]] = {} + for fact in eligible_matches: + key = (_selector_sum_partition_key(fact), _period_key(fact)) + partitions.setdefault(key, []).append(fact) + if not partitions: + raise ValueError( + f"Ledger target reference {reference.name!r} did not match a Ledger " + "fact partition." + ) + latest_period = max(period_key for _, period_key in partitions) + latest_matches = [ + fact + for (_, period_key), facts in partitions.items() + if period_key == latest_period + for fact in facts + ] + return tuple( + sorted( + latest_matches, + key=lambda fact: _fact_key(fact) or _source_record_id(fact), + ) + ) + + +def _resolve_calendar_year_average_reference_facts( + reference: LedgerTargetReference, + eligible_matches: list[object], +) -> tuple[object, ...]: + monthly_matches = _monthly_operation_matches( + reference, eligible_matches, operation="calendar_year_average" + ) + target_year = _calendar_year_from_reference(reference) + year_matches = [ + fact for fact in monthly_matches if _fact_year_month(fact)[0] == target_year + ] + if not year_matches: + raise ValueError( + f"Ledger target reference {reference.name!r}: value_operation=" + "'calendar_year_average' found no monthly Ledger facts in calendar " + f"year {target_year}." + ) + return _latest_series_partition( + reference, year_matches, operation="calendar_year_average" + ) + + +def _resolve_latest_plateau_reference_facts( + reference: LedgerTargetReference, + eligible_matches: list[object], +) -> tuple[object, ...]: + monthly_matches = _monthly_operation_matches( + reference, eligible_matches, operation="latest_plateau" + ) + partition = _latest_series_partition( + reference, monthly_matches, operation="latest_plateau" + ) + sorted_partition = tuple(sorted(partition, key=_fact_month_sort_key)) + plateau_value = _numeric_fact_value(sorted_partition[-1], reference) + plateau = [sorted_partition[-1]] + expected_month = _fact_month_index(sorted_partition[-1]) - 1 + for fact in reversed(sorted_partition[:-1]): + if _fact_month_index(fact) != expected_month: + break + if _numeric_fact_value(fact, reference) != plateau_value: + break + plateau.append(fact) + expected_month -= 1 + return tuple(reversed(plateau)) + + +def _monthly_operation_matches( + reference: LedgerTargetReference, + eligible_matches: list[object], + *, + operation: str, +) -> list[object]: + non_month = [ + _at(fact, "period", "value") + for fact in eligible_matches + if _str_at(fact, "period", "type") != "month" + ] + if non_month: + examples = tuple(str(period) for period in non_month[:5]) + raise ValueError( + f"Ledger target reference {reference.name!r}: value_operation=" + f"{operation!r} requires monthly Ledger facts; non-month period " + f"values include {examples!r}." + ) + return eligible_matches + + +def _calendar_year_from_reference(reference: LedgerTargetReference) -> int: + period_key = _period_key_from_value(reference.period) + if not period_key[0]: + raise ValueError( + f"Ledger target reference {reference.name!r}: value_operation=" + "'calendar_year_average' requires a parseable target period." + ) + return period_key[1] // 100 + + +def _latest_series_partition( + reference: LedgerTargetReference, + matches: list[object], + *, + operation: str, +) -> tuple[object, ...]: + partitions: dict[tuple[str, ...], list[object]] = {} + for fact in matches: + partitions.setdefault(_selector_period_invariant_key(fact), []).append(fact) + if not partitions: + raise ValueError( + f"Ledger target reference {reference.name!r}: value_operation=" + f"{operation!r} did not match a Ledger fact partition." + ) + latest_period = max(_period_key(fact) for fact in matches) + latest_partitions = [ + partition + for partition in partitions.values() + if max(_period_key(fact) for fact in partition) == latest_period + ] + if len(latest_partitions) != 1: + raise ValueError( + f"Ledger target reference {reference.name!r}: value_operation=" + f"{operation!r} matched multiple monthly Ledger series identities " + "at the latest eligible period." + ) + return tuple(sorted(latest_partitions[0], key=_fact_month_sort_key)) + + +def _fact_month_sort_key(fact: object) -> tuple[int, str]: + return (_fact_month_index(fact), _fact_key(fact) or _source_record_id(fact) or "") + + +def _fact_month_index(fact: object) -> int: + year, month = _fact_year_month(fact) + return year * 12 + month + + +def _fact_year_month(fact: object) -> tuple[int, int]: + period_key = _period_key(fact) + if not period_key[0]: + raise ValueError("Ledger monthly period is not parseable.") + year_month = period_key[1] + year = year_month // 100 + month = year_month % 100 + if month < 1 or month > 12: + raise ValueError("Ledger monthly period does not carry a month value.") + return year, month + + +def _selector_sum_partition_key(fact: object) -> tuple[str, ...]: + invariant = _selector_period_invariant_key(fact) + return invariant[:8] + invariant[11:] + + def _eligible_selector_matches( reference: LedgerTargetReference, matches: list[object], @@ -842,9 +1074,21 @@ def _eligible_selector_matches( fact for fact in matches if _not_after_target_period(_period_key(fact), target_period_key) + and _assertion_allowed(reference, fact) ] +def _assertion_allowed(reference: LedgerTargetReference, fact: object) -> bool: + assertion = _fact_assertion(fact) + if assertion == "source_projection": + return reference.assertion_policy == "allow_source_projection" + return True + + +def _fact_assertion(fact: object) -> str: + return _str_at(fact, "assertion") or "observation" + + def _latest_period_selector_match( reference: LedgerTargetReference, matches: list[object], @@ -886,7 +1130,7 @@ def _selector_period_invariant_key(fact: object) -> tuple[str, ...]: _str_at(fact, "aggregation", "method"), _normalized_record_set_id(_str_at(fact, "layout", "record_set_id")), _str_at(fact, "layout", "groupby_dimension"), - _str_at(fact, "layout", "groupby_value_id"), + _normalized_period_bearing_id(_str_at(fact, "layout", "groupby_value_id")), json.dumps(_dimensions(fact), sort_keys=True, separators=(",", ":")), json.dumps(_constraint_rows(fact), sort_keys=True, separators=(",", ":")), _domain(fact), @@ -897,7 +1141,65 @@ def _normalized_record_set_id(record_set_id: str) -> str: if not record_set_id: return "" return ".".join( - part for part in record_set_id.split(".") if not _is_period_token(part) + normalized + for part in record_set_id.split(".") + if (normalized := _normalized_record_set_part(part)) + ) + + +def _normalized_record_set_part(value: str) -> str: + if _is_period_token(value): + return "" + normalized = value.lower().replace("-", "_") + pieces = [ + piece + for piece in normalized.split("_") + if piece and not _is_period_fragment(piece) + ] + return "_".join(pieces) + + +def _normalized_period_bearing_id(value: str) -> str: + if _is_period_token(value): + return "" + return _normalized_record_set_part(value) + + +def _is_period_fragment(value: str) -> bool: + normalized = value.lower().replace("-", "_") + if _is_period_token(normalized): + return True + month_names = ( + "jan", + "january", + "feb", + "february", + "mar", + "march", + "apr", + "april", + "may", + "jun", + "june", + "jul", + "july", + "aug", + "august", + "sep", + "sept", + "september", + "oct", + "october", + "nov", + "november", + "dec", + "december", + ) + return any( + normalized.startswith(month) + and normalized[len(month) :].isdigit() + and len(normalized[len(month) :]) == 4 + for month in month_names ) @@ -905,11 +1207,11 @@ def _is_period_token(value: str) -> bool: normalized = value.lower().replace("-", "_") if normalized.startswith("month"): normalized = normalized[len("month") :] - parts = normalized.split("_", maxsplit=1) - if len(parts) == 2 and all(part.isdigit() for part in parts): - return len(parts[0]) == 4 and len(parts[1]) in {1, 2} if normalized[:2] in {"ty", "cy", "fy"}: normalized = normalized[2:] + parts = normalized.split("_", maxsplit=1) + if len(parts) == 2 and all(part.isdigit() for part in parts): + return len(parts[0]) == 4 and len(parts[1]) in {1, 2, 4} return normalized.isdigit() and len(normalized) == 4 @@ -920,15 +1222,25 @@ def _period_key(fact: object) -> tuple[int, int, str]: def _period_key_from_value(value: object) -> tuple[int, int, str]: label = "" if value is None else str(value) normalized = label.lower().replace("-", "_") + if normalized[:2] in {"ty", "cy", "fy"}: + normalized = normalized[2:] for prefix in ("month", "tax_year_", "calendar_year_", "fiscal_year_"): if normalized.startswith(prefix): normalized = normalized[len(prefix) :] break parts = normalized.split("_", maxsplit=1) if len(parts) == 2: - year, month = parts - if year.isdigit() and month.isdigit(): - return (1, int(year) * 100 + int(month), label) + year, suffix = parts + if year.isdigit() and suffix.isdigit(): + if len(suffix) == 4: + suffix_value = 99 + elif len(suffix) <= 2 and int(suffix) <= 12: + suffix_value = int(suffix) + elif len(suffix) <= 2: + suffix_value = 99 + else: + suffix_value = int(suffix) + return (1, int(year) * 100 + suffix_value, label) try: return (1, int(normalized) * 100 + 99, label) except ValueError: @@ -952,7 +1264,9 @@ def _not_after_target_period( source_period_key: tuple[int, int, str], target_period_key: tuple[int, int, str], ) -> bool: - if not source_period_key[0] or not target_period_key[0]: + if not source_period_key[0]: + return False + if not target_period_key[0]: return True return source_period_key[1] <= target_period_key[1] @@ -960,6 +1274,7 @@ def _not_after_target_period( def _reference_metadata(reference: LedgerTargetReference) -> dict[str, str]: metadata = dict(reference.metadata) metadata["ledger_value_operation"] = reference.value_operation + metadata["ledger_assertion_policy"] = reference.assertion_policy for key, value in sorted(reference.ledger_selector.items()): if isinstance(value, Mapping): continue @@ -1020,18 +1335,6 @@ def _source_record_id(fact: object) -> str: ) -def _unique_facts(facts: Iterable[object]) -> tuple[object, ...]: - unique: list[object] = [] - seen: set[int] = set() - for fact in facts: - identity = id(fact) - if identity in seen: - continue - seen.add(identity) - unique.append(fact) - return tuple(unique) - - def _fact_matches_selector(fact: object, selector: Mapping[str, object]) -> bool: """Return whether a consumer fact satisfies a structured reference selector. @@ -1115,8 +1418,6 @@ def _selector_candidates(fact: object, key: str) -> tuple[str, ...]: return (_str_at(fact, "layout", "measure_id"),) if key == "domain": return (_domain(fact),) - if key == "assertion": - return (_str_at(fact, "assertion") or "observation",) raise ValueError(f"Unsupported Ledger fact selector field {key!r}.") diff --git a/packages/microcosm-build/src/microcosm/build/target_materialization.py b/packages/microcosm-build/src/microcosm/build/target_materialization.py new file mode 100644 index 000000000..2a3298f00 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/target_materialization.py @@ -0,0 +1,214 @@ +"""Shared materialization of declarative Ledger target bindings.""" + +from __future__ import annotations + +from collections.abc import Callable, Mapping +from dataclasses import dataclass, field +from typing import Any + +import numpy as np + +from microcosm.calibrate import TargetRegistry + +Provider = Callable[[Any, Mapping[str, Any], int | str], np.ndarray] + + +@dataclass(frozen=True) +class MaterializationSkip: + """One target measure the interpreter could not prepare.""" + + name: str + measure: str + reason: str + + +@dataclass(frozen=True) +class TargetMaterializationResult: + """Prepared target columns and skipped-measure diagnostics.""" + + adapter: Any + registry: TargetRegistry + skipped: tuple[MaterializationSkip, ...] = field(default_factory=tuple) + + def report(self) -> dict[str, object]: + """Return a serialisable diagnostic report.""" + + return { + "prepared_count": len(self.registry) - len(self.skipped), + "skipped_count": len(self.skipped), + "skipped": [skip.__dict__ for skip in self.skipped], + } + + +def materialize_target_bindings( + adapter: Any, + registry: TargetRegistry, + contract_targets: Mapping[str, Mapping[str, Any]], + *, + period: int | str, + providers: Mapping[str, Provider] | None = None, +) -> TargetMaterializationResult: + """Prepare measure columns declared by compiled Ledger target specs.""" + + provider_registry = {**default_provider_registry(), **(providers or {})} + skipped: list[MaterializationSkip] = [] + for spec in registry.specs: + contract_target_id = spec.metadata.get("contract_target_id") + target = contract_targets.get(str(contract_target_id)) + if target is None: + skipped.append( + MaterializationSkip( + name=spec.name, + measure=spec.measure, + reason="missing_contract_target", + ) + ) + continue + binding = target["bindings"]["policyengine"] + kind = binding.get("kind") + try: + 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) + else: + values = _prepared_column_values(adapter, spec.entity, binding) + adapter.set_column(spec.entity, spec.measure, values) + except (KeyError, TypeError, ValueError) as error: + skipped.append( + MaterializationSkip( + name=spec.name, + measure=spec.measure, + reason=str(error), + ) + ) + return TargetMaterializationResult(adapter, registry, tuple(skipped)) + + +def default_provider_registry() -> dict[str, Provider]: + """Return the generic provider engines keyed by binding kind.""" + + return { + "parameter_gated_threshold": parameter_gated_threshold, + "baseline_flag_crosstab": baseline_flag_crosstab, + "input_substitution_counterfactual": input_substitution_counterfactual, + } + + +def parameter_gated_threshold( + adapter: Any, + binding: Mapping[str, Any], + period: int | str, +) -> np.ndarray: + """Materialize an indicator/value gated by a period parameter.""" + + gate = float(adapter.parameter(str(binding["gate_parameter"]), period)) + gated = _column( + adapter, str(binding.get("from_entity") or "person"), binding["gated_variable"] + ) + comparison = str(binding.get("gate_comparison") or ">") + mask = _compare(gated, comparison, gate) + value_variable = binding.get("value_variable") + if value_variable and value_variable != "person_count": + return np.where(mask, _column(adapter, "person", str(value_variable)), 0.0) + return mask.astype(float) + + +def baseline_flag_crosstab( + adapter: Any, + binding: Mapping[str, Any], + period: int | str, +) -> np.ndarray: + """Materialize a baseline affected-flag crosstab column.""" + + del period + entity = str(binding.get("from_entity") or "household") + flag = _column(adapter, entity, binding["affected_flag_variable"]).astype(bool) + value_variable = str(binding.get("value_variable") or "") + count_of = str(binding.get("count_of") or "") + if value_variable and value_variable not in {"household_count", "person_count"}: + values = _column(adapter, entity, value_variable) + elif count_of and count_of not in {"household", "person", "household_count"}: + values = _column(adapter, entity, count_of) + else: + values = np.ones_like(flag, dtype=float) + return np.where(flag, values, 0.0) + + +def input_substitution_counterfactual( + adapter: Any, + binding: Mapping[str, Any], + period: int | str, +) -> np.ndarray: + """Materialize an output delta under a caller-owned counterfactual.""" + + if hasattr(adapter, "counterfactual_delta"): + return np.asarray(adapter.counterfactual_delta(binding, period), dtype=float) + raise ValueError("adapter does not provide counterfactual_delta") + + +def _prepared_column_values( + adapter: Any, + entity: str, + binding: Mapping[str, Any], +) -> np.ndarray: + if "value_expression" in binding: + values = _expression(adapter, entity, str(binding["value_expression"])) + else: + values = _column(adapter, entity, binding["value_variable"]) + mask = np.ones_like(values, dtype=bool) + for predicate in binding.get("filters", ()): + mask &= _predicate_mask(adapter, entity, predicate) + for predicate in binding.get("household_conditions", ()): + mask &= _predicate_mask(adapter, entity, predicate) + return np.where(mask, values, 0.0) + + +def _predicate_mask( + adapter: Any, + default_entity: str, + predicate: Mapping[str, Any], +) -> np.ndarray: + entity = str(predicate.get("entity") or default_entity) + variable = str(predicate.get("variable") or predicate.get("concept")) + values = _column(adapter, entity, variable) + return _compare(values, str(predicate["operator"]), predicate["value"]) + + +def _compare(values: np.ndarray, operator: str, expected: object) -> np.ndarray: + if operator == "==": + return values == expected + if operator == "!=": + return values != expected + numeric = values.astype(float) + threshold = float(expected) + if operator == ">": + return numeric > threshold + if operator == ">=": + return numeric >= threshold + if operator == "<": + return numeric < threshold + if operator == "<=": + return numeric <= threshold + raise ValueError(f"unsupported predicate operator {operator!r}") + + +def _expression(adapter: Any, entity: str, expression: str) -> np.ndarray: + parts = [part.strip() for part in expression.split("+")] + if not parts or any(not part for part in parts): + raise ValueError(f"unsupported value_expression {expression!r}") + total: np.ndarray | None = None + for part in parts: + values = _column(adapter, entity, part) + total = values.copy() if total is None else total + values + if total is None: + raise ValueError(f"unsupported value_expression {expression!r}") + return total + + +def _column(adapter: Any, entity: str, variable: object) -> np.ndarray: + if hasattr(adapter, "column"): + return np.asarray(adapter.column(entity, str(variable)), dtype=float) + table = adapter.tables[entity] + return np.asarray(table[str(variable)], dtype=float) diff --git a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py new file mode 100644 index 000000000..924dbe450 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py @@ -0,0 +1,479 @@ +"""Author Ledger target-reference resources from country contracts. + +Country packages own target declarations and country-specific pinning policy. +This module owns the shared mechanics: candidate reference construction, +fan-out over native dimension values, compilation through the real Ledger +resolver, and membership reporting. +""" + +from __future__ import annotations + +import json +import math +from collections import Counter +from collections.abc import Callable, Iterable, Mapping +from dataclasses import dataclass, field +from typing import Any + +from microcosm.build.ledger_targets import ( # pyright: ignore[reportPrivateUsage] + LedgerTargetReference, + _assertion_allowed, + _fact_matches_selector, + _not_after_target_period, + _period_key, + _period_key_from_value, + compile_ledger_target_references, +) + +FanoutName = Callable[[Mapping[str, Any], Mapping[str, Any]], str | None] +GeographyPin = Mapping[str, str] + + +@dataclass(frozen=True) +class AuthoredTargetReferences: + """Generated references and their compile-membership report.""" + + references: tuple[dict[str, Any], ...] + membership_report: dict[str, Any] + + @property + def status_counts(self) -> Mapping[str, int]: + """Membership status counts keyed by report status.""" + + return self.membership_report["status_counts"] + + +@dataclass(frozen=True) +class TargetReferenceAuthoringConfig: + """Country-supplied authoring policy.""" + + target_period: int | str + geography_pins: Mapping[str, GeographyPin] = field(default_factory=dict) + fanout_name: FanoutName | None = None + sum_target_ids: frozenset[str] = frozenset() + value_operation_by_target_id: Mapping[str, str] = field(default_factory=dict) + selector_pins_by_target_id: Mapping[str, Mapping[str, Any]] = field( + default_factory=dict + ) + signed_exclusions_by_target_id: Mapping[str, str] = field(default_factory=dict) + binding_vocabulary: frozenset[str] = frozenset() + source_fact_feed: str = "" + + +def author_target_references( + contract: Mapping[str, Any], + facts: Iterable[Mapping[str, Any]], + config: TargetReferenceAuthoringConfig, +) -> AuthoredTargetReferences: + """Build active target references and a membership report.""" + + fact_rows = tuple(facts) + facts_by_source = _facts_by_source(fact_rows) + _validate_contract_bindings(contract, config.binding_vocabulary) + active_rows: list[dict[str, Any]] = [] + target_entries: dict[str, Any] = {} + geography_pin_report: dict[str, Any] = {} + genuine_sum_residue: list[str] = [] + uprating_holds: list[dict[str, str]] = [] + + for target in contract.get("targets", ()): + target_id = str(target["target_id"]) + pin = config.geography_pins.get(target_id, {}) + geography_pin_report[target_id] = dict(pin) + source_facts = _source_prefilter(fact_rows, facts_by_source, target) + selector = _target_selector(target, pin, config) + signed_exclusion = config.signed_exclusions_by_target_id.get(target_id) + if signed_exclusion is not None: + matched = [ + fact for fact in source_facts if _fact_matches_selector(fact, selector) + ] + eligible = [ + fact + for fact in matched + if _not_after_target_period( + _period_key(fact), + _period_key_from_value(config.target_period), + ) + ] + target_entries[target_id] = { + "status": "signed_excluded", + "candidates": [ + { + "name": target_id, + "status": "signed_excluded", + "matched_fact_count_overall": len(matched), + "matched_fact_count_at_or_before_period": len(eligible), + "signed_rationale": signed_exclusion, + } + ], + } + continue + candidates = tuple(_candidate_rows(target, source_facts, pin, config)) + candidate_entries: list[dict[str, Any]] = [] + for row in candidates: + reference = LedgerTargetReference(**row) + matched = [ + fact + for fact in source_facts + if _fact_matches_selector(fact, row["ledger_selector"]) + ] + eligible = [fact for fact in matched if _eligible_fact(reference, fact)] + entry: dict[str, Any] = { + "name": row["name"], + "status": "", + "matched_fact_count_overall": len(matched), + "matched_fact_count_at_or_before_period": len(eligible), + } + try: + registry = compile_ledger_target_references( + matched, + [reference], + country=str(contract["country"]), + ) + except ValueError as error: + entry["status"] = _classify_deferral(error, matched, eligible) + entry["error"] = _compact_compile_error(entry["status"]) + else: + spec = registry.specs[0] + resolved_period = spec.metadata.get("ledger_fact_period", "") + _apply_uprating_hold(row, resolved_period, config.target_period) + if "uprating_from_period" in row: + uprating_holds.append( + { + "name": row["name"], + "from": str(row["uprating_from_period"]), + "to": str(row["uprating_to_period"]), + } + ) + if row.get("value_operation") == "sum": + genuine_sum_residue.append(row["name"]) + active_rows.append(row) + entry.update( + { + "status": "active", + "resolved_period": spec.period, + "resolved_value": spec.value, + "resolved_fact_period": resolved_period, + "resolved_fact_key": _json_safe_ledger_id( + spec.metadata.get("ledger_aggregate_fact_key", "") + ), + } + ) + candidate_entries.append(entry) + target_entries[target_id] = { + "status": _target_status(candidate_entries), + "candidates": candidate_entries, + } + + status_counts = Counter( + entry["status"] + for target in target_entries.values() + for entry in target["candidates"] + ) + report = { + "source_fact_feed": config.source_fact_feed, + "target_period": config.target_period, + "candidate_count": sum( + len(target["candidates"]) for target in target_entries.values() + ), + "contract_target_count": len(tuple(contract.get("targets", ()))), + "active_reference_count": len(active_rows), + "status_counts": dict(sorted(status_counts.items())), + "geography_pins": geography_pin_report, + "genuine_sum_residue": sorted(genuine_sum_residue), + "uprating_holds": uprating_holds, + "targets": target_entries, + } + return AuthoredTargetReferences(tuple(active_rows), report) + + +def target_references_resource( + *, + country: str, + description: str, + authored: AuthoredTargetReferences, +) -> dict[str, Any]: + """Return a serialisable ``target_references.json`` resource.""" + + return { + "country": country, + "description": description, + "allowed_value_operations": [ + "identity", + "sum", + "calendar_year_average", + "latest_plateau", + ], + "target_references": list(authored.references), + } + + +def _validate_contract_bindings( + contract: Mapping[str, Any], + binding_vocabulary: frozenset[str], +) -> None: + if not binding_vocabulary: + return + for target in contract.get("targets", ()): + binding = target["bindings"]["policyengine"] + unknown = sorted(set(binding) - binding_vocabulary) + if unknown: + raise ValueError( + f"Contract target {target['target_id']!r} carries unknown " + f"policyengine binding keys {unknown!r}." + ) + + +def _candidate_rows( + target: Mapping[str, Any], + facts: tuple[Mapping[str, Any], ...], + geography_pin: GeographyPin, + config: TargetReferenceAuthoringConfig, +) -> Iterable[dict[str, Any]]: + selector = _target_selector(target, geography_pin, config) + if "groupby_dimension" in selector: + rows = _fanout_rows(target, facts, selector, config) + if rows: + yield from rows + return + yield _reference_row(target, selector, config) + + +def _target_selector( + target: Mapping[str, Any], + geography_pin: GeographyPin, + config: TargetReferenceAuthoringConfig, +) -> dict[str, Any]: + target_id = str(target["target_id"]) + selector = {**dict(target["ledger_selector"]), **dict(geography_pin)} + pins = config.selector_pins_by_target_id.get(target_id, {}) + for key, value in pins.items(): + if key == "dimension_values" and isinstance(value, Mapping): + existing = selector.get("dimension_values") + selector[key] = { + **(dict(existing) if isinstance(existing, Mapping) else {}), + **dict(value), + } + continue + selector[key] = value + return selector + + +def _fanout_rows( + target: Mapping[str, Any], + facts: tuple[Mapping[str, Any], ...], + selector: Mapping[str, Any], + config: TargetReferenceAuthoringConfig, +) -> tuple[dict[str, Any], ...]: + dimension = str(selector["groupby_dimension"]) + matches = [fact for fact in facts if _fact_matches_selector(fact, selector)] + existing_pins = selector.get("dimension_values") or {} + pinned_dimension_names = ( + frozenset(str(key) for key in existing_pins) + if isinstance(existing_pins, Mapping) + else frozenset() + ) + pins: dict[tuple[str, str], tuple[str, Any, Mapping[str, Any]]] = {} + for fact in matches: + dimension_name, dimension_value = _native_groupby_pin( + fact, + dimension, + pinned_dimension_names=pinned_dimension_names, + ) + if not dimension_name: + continue + key = (dimension_name, json.dumps(dimension_value, sort_keys=True)) + pins.setdefault(key, (dimension_name, dimension_value, fact)) + rows = [] + for _, (dimension_name, dimension_value, fact) in sorted(pins.items()): + merged_dimension_values = { + **(dict(existing_pins) if isinstance(existing_pins, Mapping) else {}), + dimension_name: dimension_value, + } + pinned_selector = { + **dict(selector), + "dimension_values": merged_dimension_values, + } + name = ( + config.fanout_name(target, fact) + if config.fanout_name is not None + else _fallback_fanout_name(target, fact) + ) + if not name: + continue + rows.append(_reference_row(target, pinned_selector, config, name=name)) + return tuple(rows) + + +def _facts_by_source( + facts: tuple[Mapping[str, Any], ...], +) -> dict[str, tuple[Mapping[str, Any], ...]]: + buckets: dict[str, list[Mapping[str, Any]]] = {} + for fact in facts: + source = _source_name(fact) + if source: + buckets.setdefault(source, []).append(fact) + return {key: tuple(value) for key, value in buckets.items()} + + +def _source_prefilter( + facts: tuple[Mapping[str, Any], ...], + facts_by_source: Mapping[str, tuple[Mapping[str, Any], ...]], + target: Mapping[str, Any], +) -> tuple[Mapping[str, Any], ...]: + source_name = target["ledger_selector"].get("source_name") + if isinstance(source_name, str) and source_name: + return facts_by_source.get(source_name, ()) + return facts + + +def _source_name(fact: Mapping[str, Any]) -> str: + return str( + fact.get("source", {}).get("source_name") + or fact.get("observed_measure", {}).get("source_name") + or "" + ) + + +def _native_groupby_pin( + fact: Mapping[str, Any], + dimension: str, + *, + pinned_dimension_names: frozenset[str] = frozenset(), +) -> tuple[str, Any]: + dimensions = fact.get("dimensions") or {} + if not isinstance(dimensions, Mapping): + return "", None + candidates = ( + dimension, + dimension.split(".")[-1], + dimension.replace(".", "_"), + ) + for candidate in candidates: + if candidate in dimensions: + if candidate in pinned_dimension_names: + return "", None + return candidate, dimensions[candidate] + unpinned_dimensions = [ + (str(key), value) + for key, value in dimensions.items() + if str(key) not in pinned_dimension_names + ] + if len(unpinned_dimensions) == 1: + return unpinned_dimensions[0] + if len(dimensions) == 1: + key, value = next(iter(dimensions.items())) + if str(key) in pinned_dimension_names: + return "", None + return str(key), value + return "", None + + +def _reference_row( + target: Mapping[str, Any], + selector: Mapping[str, Any], + config: TargetReferenceAuthoringConfig, + *, + name: str | None = None, +) -> dict[str, Any]: + target_id = str(target["target_id"]) + binding = target["bindings"]["policyengine"] + row: dict[str, Any] = { + "name": name or target_id, + "ledger_selector": dict(selector), + "entity": binding.get("from_entity") or binding.get("map_to") or "household", + "measure": name or binding["metric_name"], + "family": target["family"], + "period": config.target_period, + "metadata": { + "contract_target_id": target_id, + "measure_kind": "prepared_column", + }, + } + assertion_policy = target.get("assertion_policy") + if assertion_policy is not None: + row["assertion_policy"] = assertion_policy + value_operation = config.value_operation_by_target_id.get(target_id) + if value_operation is None and target_id in config.sum_target_ids: + value_operation = "sum" + if value_operation is not None and value_operation != "identity": + row["value_operation"] = value_operation + return row + + +def _fallback_fanout_name(target: Mapping[str, Any], fact: Mapping[str, Any]) -> str: + value_id = str(fact.get("layout", {}).get("groupby_value_id") or "detail") + return f"{target['target_id']}.{value_id}" + + +def _json_safe_ledger_id(value: str) -> str: + return value.replace(".", "_").replace(":", "_") + + +def _compact_compile_error(status: str) -> str: + return f"ledger_reference_compile_status_{status}" + + +def _eligible_fact(reference: LedgerTargetReference, fact: Mapping[str, Any]) -> bool: + return _not_after_target_period( + _period_key(fact), + _period_key_from_value(reference.period), + ) and _assertion_allowed(reference, fact) + + +def _classify_deferral( + error: ValueError, + matched: list[Mapping[str, Any]], + eligible: list[Mapping[str, Any]], +) -> str: + message = str(error) + if "source_projection" in message: + return "source_projection_policy" + if not eligible or "at or before target period" in message: + return "no_fact_at_or_before_period" + if "matched multiple Ledger facts" in message: + return "multi_fact" + if "invalid value" in message or "missing value" in message: + return "value_not_finite_or_missing" + geography_ids = { + str(fact.get("geography", {}).get("id", "")) + for fact in eligible + if fact.get("geography", {}).get("level") == "country" + } + if len(geography_ids) > 1: + return "geography_ambiguous_at_country_level" + if not matched: + return "no_fact_at_or_before_period" + return "signed_deferral_compile_error" + + +def _target_status(candidate_entries: list[dict[str, Any]]) -> str: + if any(entry["status"] == "active" for entry in candidate_entries): + if all(entry["status"] == "active" for entry in candidate_entries): + return "active" + return "partially_active" + statuses = sorted({entry["status"] for entry in candidate_entries}) + return statuses[0] if len(statuses) == 1 else "multiple_deferrals" + + +def _apply_uprating_hold( + row: dict[str, Any], + resolved_period: str, + target_period: int | str, +) -> None: + if not resolved_period: + return + source_key = _period_key_from_value(resolved_period) + target_key = _period_key_from_value(target_period) + if source_key[0] and target_key[0] and source_key[1] < target_key[1]: + row["uprating_from_period"] = resolved_period + row["uprating_to_period"] = target_period + + +def is_finite_value(value: object) -> bool: + """Return whether a fact value is finite when coerced to float.""" + + try: + return math.isfinite(float(value)) + except (OverflowError, TypeError, ValueError): + return False diff --git a/packages/microcosm-build/tests/test_gates.py b/packages/microcosm-build/tests/test_gates.py index 791917ce1..67377a567 100644 --- a/packages/microcosm-build/tests/test_gates.py +++ b/packages/microcosm-build/tests/test_gates.py @@ -22,6 +22,8 @@ export_surface_gate, formula_owned_export_gate, input_mass_parity_gate, + ledger_compile_parity_gate, + ledger_compile_parity_signed_differences, macro_realism_gate, nonconstant_columns_gate, nonnegative_columns_gate, @@ -37,7 +39,7 @@ target_surface_gate, weights_audit_gate, ) -from microcosm.calibrate import TargetSpec +from microcosm.calibrate import TargetRegistry, TargetSpec class TestGateResultInvariants: @@ -86,6 +88,193 @@ def test_report_manifest_deep_copies_nested_details(self) -> None: ] +class TestLedgerCompileParityGate: + def _registry(self, value: float = 10.0) -> TargetRegistry: + return TargetRegistry( + ( + TargetSpec( + name="hmrc.tax", + entity="person", + measure="hmrc/tax", + value=value, + period=2025, + source="fixture", + family="hmrc", + ), + ), + country="uk", + ) + + def test_matching_registries_pass(self) -> None: + result = ledger_compile_parity_gate(self._registry(), self._registry()) + + assert result.passed + assert result.details["expected_count"] == 1 + assert result.details["actual_count"] == 1 + + def test_unsigned_gap_fails(self) -> None: + result = ledger_compile_parity_gate( + TargetRegistry((), country="uk"), + self._registry(), + ) + + assert not result.passed + assert any("target count differs" in failure for failure in result.failures) + + def test_signed_difference_is_removed_before_comparison(self) -> None: + result = ledger_compile_parity_gate( + self._registry(11.0), + self._registry(10.0), + signed_differences=( + { + "name": "hmrc.tax", + "period": 2025, + "reason": "reviewed fixture-vintage drift", + }, + ), + ) + + assert result.passed + assert result.details["signed_difference_count"] == 1 + + def test_signed_difference_classifier_ignores_equal_value_namespace_drift( + self, + ) -> None: + expected = TargetRegistry( + ( + TargetSpec( + name="dwp.benefit_cap.capped_households", + entity="household", + measure="incumbent_measure", + value=110_637.0, + period=2025, + source="fixture", + family="incumbent", + ), + ), + country="uk", + ) + actual = TargetRegistry( + ( + TargetSpec( + name="dwp.benefit_cap.capped_households", + entity="benunit", + measure="ledger_measure", + value=110_637.0, + period=2025, + source="ledger", + family="dwp", + ), + ), + country="uk", + ) + + report = ledger_compile_parity_signed_differences(actual, expected) + + assert report["difference_count"] == 0 + assert report["counts_by_kind"] == {} + + def test_gate_ignores_equal_value_namespace_drift(self) -> None: + expected = TargetRegistry( + ( + TargetSpec( + name="dwp.benefit_cap.capped_households", + entity="household", + measure="incumbent_measure", + value=110_637.0, + period=2025, + source="fixture", + family="incumbent", + ), + ), + country="uk", + ) + actual = TargetRegistry( + ( + TargetSpec( + name="dwp.benefit_cap.capped_households", + entity="benunit", + measure="ledger_measure", + value=110_637.0, + period=2025, + source="ledger", + family="dwp", + ), + ), + country="uk", + ) + + result = ledger_compile_parity_gate(actual, expected) + + assert result.passed + + def test_signed_difference_classifier_reports_only_value_drift(self) -> None: + report = ledger_compile_parity_signed_differences( + self._registry(11.0), + self._registry(10.0), + ) + + assert report["counts_by_kind"] == {"calibration_drift": 1} + assert report["differences"] == [ + { + "fixture_value": 10.0, + "kind": "calibration_drift", + "ledger_value": 11.0, + "name": "hmrc.tax", + "period": 2025, + "reason": ( + "Ledger-compiled value differs from the fixture value at " + "this comparison period." + ), + } + ] + + def test_signed_difference_classifier_ignores_unfixture_absences( + self, + ) -> None: + report = ledger_compile_parity_signed_differences( + TargetRegistry((), country="uk"), + TargetRegistry((), country="uk"), + unsupported=( + { + "name": "dwp.uc.households", + "period": 2025, + "reason": "no_fact_at_or_before_period", + }, + ), + ) + + assert report["difference_count"] == 0 + assert report["counts_by_kind"] == {} + + def test_signed_difference_classifier_reports_fixture_absences(self) -> None: + report = ledger_compile_parity_signed_differences( + TargetRegistry((), country="uk"), + self._registry(10.0), + unsupported=( + { + "name": "hmrc.tax", + "period": 2025, + "reason": "no_fact_at_or_before_period", + }, + ), + ) + + assert report["counts_by_kind"] == {"ledger_absent": 1} + assert report["differences"] == [ + { + "fixture_value": 10.0, + "kind": "ledger_absent", + "name": "hmrc.tax", + "period": 2025, + "reason": ( + "Packaged Ledger reference did not resolve for this " + "comparison period." + ), + } + ] + + class TestParityGate: def test_gap_fails_with_the_variable_named(self) -> None: result = parity_gate( diff --git a/packages/microcosm-build/tests/test_ledger_artifact.py b/packages/microcosm-build/tests/test_ledger_artifact.py index 0d2e123a4..09e4d5844 100644 --- a/packages/microcosm-build/tests/test_ledger_artifact.py +++ b/packages/microcosm-build/tests/test_ledger_artifact.py @@ -4,13 +4,16 @@ import hashlib import json +from argparse import ArgumentParser, Namespace import pytest from microcosm.build.ledger_artifact import ( CONSUMER_ARTIFACT_SCHEMA_VERSION, LedgerConsumerArtifact, + add_ledger_artifact_args, load_ledger_consumer_artifact, + resolve_ledger_artifact, ) @@ -31,9 +34,7 @@ def _fact_row(**overrides): def _write_facts(path, rows): - path.write_text( - "".join(json.dumps(row, sort_keys=True) + "\n" for row in rows) - ) + path.write_text("".join(json.dumps(row, sort_keys=True) + "\n" for row in rows)) return hashlib.sha256(path.read_bytes()).hexdigest() @@ -169,3 +170,31 @@ def test_rejects_missing_and_empty_feeds(tmp_path): empty_facts.write_text("\n") with pytest.raises(ValueError, match="empty"): load_ledger_consumer_artifact(empty_facts) + + +def test_shared_cli_args_load_optional_ledger_artifact(tmp_path): + facts_path = tmp_path / "consumer_facts.jsonl" + facts_sha = _write_facts(facts_path, [_fact_row()]) + parser = ArgumentParser() + add_ledger_artifact_args(parser) + args = parser.parse_args( + ["--ledger-facts", str(facts_path), "--ledger-facts-sha256", facts_sha] + ) + + artifact = resolve_ledger_artifact(args) + + assert artifact is not None + assert artifact.facts_sha256 == facts_sha + + +def test_shared_cli_resolver_allows_absent_artifact_but_not_orphan_pins(): + assert resolve_ledger_artifact(Namespace(ledger_facts=None)) is None + + with pytest.raises(ValueError, match="requires --ledger-facts"): + resolve_ledger_artifact( + Namespace( + ledger_facts=None, + ledger_facts_sha256="0" * 64, + ledger_manifest_sha256=None, + ) + ) diff --git a/packages/microcosm-build/tests/test_ledger_targets.py b/packages/microcosm-build/tests/test_ledger_targets.py index 9e1d55e99..61e84cf00 100644 --- a/packages/microcosm-build/tests/test_ledger_targets.py +++ b/packages/microcosm-build/tests/test_ledger_targets.py @@ -252,7 +252,9 @@ def _hierarchy_profile() -> dict[str, object]: } -def test__given_supported_ledger_fact__then_microcosm_target_preserves_lineage() -> None: +def test__given_supported_ledger_fact__then_microcosm_target_preserves_lineage() -> ( + None +): # Given mapping = LedgerTargetMapping( measure_by_concept={ @@ -284,7 +286,9 @@ def test__given_supported_ledger_fact__then_microcosm_target_preserves_lineage() assert spec.metadata["ledger_layout_record_set_id"] == "irs_soi.ty2023.table_1_1" -def test__given_consumer_contract_row__then_microcosm_target_preserves_lineage() -> None: +def test__given_consumer_contract_row__then_microcosm_target_preserves_lineage() -> ( + None +): # Given mapping = LedgerTargetMapping( measure_by_concept={ @@ -582,6 +586,68 @@ def test__given_selector_matches_multiple_years__then_latest_source_period_is_us ) +def test__given_period_bearing_groupby_value__then_latest_source_period_is_used() -> ( + None +): + reference = LedgerTargetReference( + name="latest CGT total", + ledger_selector={ + "source_name": "hmrc", + "source_measure_id": "total_gains", + "source_concept": "hmrc.cgt_gains_total", + "geography_level": "country", + "geography_id": "K02000001", + }, + entity="person", + measure="capital_gains", + period=2025, + family="hmrc_cgt", + ) + older = _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:cgt-2022", + legacy_fact_key="ledger.fact.v1:cgt-2022", + value=60_000_000_000, + source={"source_name": "hmrc"}, + observed_measure={ + "source_name": "hmrc", + "source_measure_id": "total_gains", + "source_concept": "hmrc.cgt_gains_total", + "unit": "gbp", + }, + period={"type": "tax_year", "value": 2022}, + geography={"level": "country", "id": "K02000001"}, + entity={"name": "person"}, + dimensions={}, + layout={ + "record_set_id": "hmrc.cgt_statistics_2025.table1.ty2022", + "groupby_dimension": "hmrc.cgt_table1_line", + "groupby_value_id": "ty2022", + "measure_id": "total_gains", + }, + ) + newer = _consumer_fact_row( + **{ + **older, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cgt-2023", + "legacy_fact_key": "ledger.fact.v1:cgt-2023", + "value": 65_900_000_000, + "period": {"type": "tax_year", "value": 2023}, + "layout": { + "record_set_id": "hmrc.cgt_statistics_2025.table1.ty2023", + "groupby_dimension": "hmrc.cgt_table1_line", + "groupby_value_id": "ty2023", + "measure_id": "total_gains", + }, + } + ) + + registry = compile_ledger_target_references( + [older, newer], [reference], country="uk" + ) + + assert registry.specs[0].value == 65_900_000_000 + + def test__given_selector_matches_future_year__then_latest_eligible_period_is_used() -> ( None ): @@ -888,6 +954,123 @@ def test_us_mapping_dimensions_keep_subset_semantics(self) -> None: assert registry.specs[0].name == "mapping dimensions selector" + @pytest.mark.parametrize( + ("older_record_set_id", "newer_record_set_id", "older_period", "newer_period"), + [ + ( + "obr.fy2024_25.tax_receipts", + "obr.fy2025_26.tax_receipts", + "2024-25", + "2025-26", + ), + ( + "obr.ty2024_25.tax_receipts", + "obr.ty2025_26.tax_receipts", + "2024-25", + "2025-26", + ), + ( + "obr.cy2024_25.tax_receipts", + "obr.cy2025_26.tax_receipts", + "2024-25", + "2025-26", + ), + ( + "ons.2024_2025.population", + "ons.2025_2026.population", + "2024_2025", + "2025_2026", + ), + ("isc.census_2023.pupils", "isc.census_2024.pupils", 2023, 2024), + ("ons.dec2023.population", "ons.dec2024.population", "2023-12", "2024-12"), + ( + "dfe.pse_march2025.pupils", + "dfe.pse_march2026.pupils", + "2025-03", + "2026-03", + ), + ( + "ons.families_households_2024.table7", + "ons.families_households_2025.table7", + 2024, + 2025, + ), + ( + "voa.apr2023_mar2024.stock", + "voa.apr2024_mar2025.stock", + "2023-04", + "2024-04", + ), + ], + ) + def test_period_tokens_collapse_across_uk_record_set_spellings( + self, + older_record_set_id: str, + newer_record_set_id: str, + older_period: int | str, + newer_period: int | str, + ) -> None: + older = _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:older", + legacy_fact_key="ledger.fact.v1:older", + lineage={"source_record_id": f"{older_record_set_id}.all.population"}, + period={"type": "year", "value": older_period}, + value=1.0, + source={"source_name": "ons"}, + observed_measure={ + "source_name": "ons", + "source_measure_id": "population", + "source_concept": "ons.population", + "unit": "people", + }, + geography={"level": "country", "id": "K02000001"}, + entity={"name": "person"}, + layout={ + "record_set_id": older_record_set_id, + "groupby_dimension": "population", + "groupby_value_id": "all", + "measure_id": "population", + }, + ) + newer = _consumer_fact_row( + **{ + **older, + "aggregate_fact_key": "ledger.aggregate_fact.v2:newer", + "legacy_fact_key": "ledger.fact.v1:newer", + "lineage": { + "source_record_id": f"{newer_record_set_id}.all.population" + }, + "period": {"type": "year", "value": newer_period}, + "value": 2.0, + "layout": { + "record_set_id": newer_record_set_id, + "groupby_dimension": "population", + "groupby_value_id": "all", + "measure_id": "population", + }, + } + ) + reference = LedgerTargetReference( + name="latest UK population", + ledger_selector={ + "source_name": "ons", + "source_measure_id": "population", + "geography_id": "K02000001", + "entity_name": "person", + "layout_groupby_value_id": "all", + }, + entity="person", + measure="population", + period=2026, + family="ons", + ) + + registry = compile_ledger_target_references( + [older, newer], [reference], country="uk" + ) + + assert registry.specs[0].value == 2.0 + def test__given_selector_matches_only_future_year__then_compilation_fails() -> None: # Given @@ -916,6 +1099,38 @@ def test__given_selector_matches_only_future_year__then_compilation_fails() -> N ) +def test__given_selector_matches_only_unparseable_period__then_compilation_fails() -> ( + None +): + reference = LedgerTargetReference( + name="unparseable SOI AGI total", + ledger_selector={ + "source_name": "irs_soi", + "source_measure_id": "adjusted_gross_income", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "tax_unit", + "layout_groupby_value_id": "all", + }, + entity="tax_unit", + measure="adjusted_gross_income", + period=2024, + family="irs_soi", + ) + + with pytest.raises(ValueError, match="at or before target period"): + compile_ledger_target_references( + [ + _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:unknown-period", + period={"type": "source", "value": "current"}, + ) + ], + [reference], + country="us", + ) + + def test__given_aggregation_method_selector__then_compilation_fails() -> None: # Given reference = LedgerTargetReference( @@ -979,6 +1194,217 @@ def test__given_reference_identifiers_match_different_facts__then_compilation_fa compile_ledger_target_references([first, second], [reference], country="us") +def test__given_sum_reference_matches_same_vintage_facts__then_values_sum() -> None: + first = _consumer_fact_row_for_period(2023, value=100.0) + first["aggregate_fact_key"] = "ledger.aggregate_fact.v2:first" + first["layout"]["groupby_value_id"] = "first" + first["dimensions"] = {"band": "first"} + second = _consumer_fact_row_for_period(2023, value=250.0) + second["aggregate_fact_key"] = "ledger.aggregate_fact.v2:second" + second["layout"]["groupby_value_id"] = "second" + second["dimensions"] = {"band": "second"} + reference = LedgerTargetReference( + name="summed bands", + ledger_selector={ + "source_name": "irs_soi", + "source_measure_id": "adjusted_gross_income", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "tax_unit", + }, + value_operation="sum", + entity="tax_unit", + measure="adjusted_gross_income", + period=2024, + family="irs_soi", + ) + + registry = compile_ledger_target_references( + [first, second], [reference], country="us" + ) + + spec = registry.specs[0] + assert spec.value == 350.0 + assert spec.metadata["ledger_member_fact_count"] == "2" + assert spec.metadata["ledger_value_operation"] == "sum" + + +def test__given_sum_reference_matches_two_vintages__then_latest_partition_wins() -> ( + None +): + old_first = _consumer_fact_row_for_period(2022, value=10.0) + old_first["aggregate_fact_key"] = "ledger.aggregate_fact.v2:old-first" + old_first["layout"]["groupby_value_id"] = "first" + old_first["dimensions"] = {"band": "first"} + old_second = _consumer_fact_row_for_period(2022, value=20.0) + old_second["aggregate_fact_key"] = "ledger.aggregate_fact.v2:old-second" + old_second["layout"]["groupby_value_id"] = "second" + old_second["dimensions"] = {"band": "second"} + new_first = _consumer_fact_row_for_period(2023, value=100.0) + new_first["aggregate_fact_key"] = "ledger.aggregate_fact.v2:new-first" + new_first["layout"]["groupby_value_id"] = "first" + new_first["dimensions"] = {"band": "first"} + new_second = _consumer_fact_row_for_period(2023, value=200.0) + new_second["aggregate_fact_key"] = "ledger.aggregate_fact.v2:new-second" + new_second["layout"]["groupby_value_id"] = "second" + new_second["dimensions"] = {"band": "second"} + reference = LedgerTargetReference( + name="latest summed bands", + ledger_selector={ + "source_name": "irs_soi", + "source_measure_id": "adjusted_gross_income", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "tax_unit", + }, + value_operation="sum", + entity="tax_unit", + measure="adjusted_gross_income", + period=2024, + family="irs_soi", + ) + + registry = compile_ledger_target_references( + [old_first, old_second, new_first, new_second], + [reference], + country="us", + ) + + spec = registry.specs[0] + assert spec.value == 300.0 + assert spec.metadata["ledger_member_fact_count"] == "2" + assert "old-first" not in spec.metadata["ledger_member_fact_keys"] + assert "new-first" in spec.metadata["ledger_member_fact_keys"] + + +def test__given_calendar_year_average_reference__then_monthly_mean_compiles() -> None: + rows = [ + _monthly_consumer_fact_row("2025-04", value=6_380_000.0), + *( + _monthly_consumer_fact_row(f"2025-{month:02d}", value=6_600_000.0) + for month in range(5, 9) + ), + *( + _monthly_consumer_fact_row(f"2025-{month:02d}", value=6_960_000.0) + for month in range(9, 12) + ), + _monthly_consumer_fact_row("2025-12", value=7_170_000.0), + ] + reference = LedgerTargetReference( + name="calendar average enrollment", + ledger_selector={ + "source_name": "cms_medicaid", + "source_measure_id": "total_medicaid_chip_enrollment", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "person", + }, + value_operation="calendar_year_average", + entity="person", + measure="total_medicaid_chip_enrollment", + period=2025, + family="cms_medicaid", + ) + + registry = compile_ledger_target_references(rows, [reference], country="us") + + spec = registry.specs[0] + assert spec.value == pytest.approx( + (6_380_000.0 + 4 * 6_600_000.0 + 3 * 6_960_000.0 + 7_170_000.0) / 9 + ) + assert spec.metadata["ledger_member_fact_count"] == "9" + assert spec.metadata["ledger_value_operation"] == "calendar_year_average" + + +def test__given_latest_plateau_reference__then_latest_equal_month_run_wins() -> None: + rows = [ + _monthly_consumer_fact_row("2025-04", value=6_380_000.0), + *( + _monthly_consumer_fact_row(f"2025-{month:02d}", value=6_600_000.0) + for month in range(5, 9) + ), + *( + _monthly_consumer_fact_row(f"2025-{month:02d}", value=6_960_000.0) + for month in range(9, 12) + ), + _monthly_consumer_fact_row("2025-12", value=7_170_000.0), + _monthly_consumer_fact_row("2026-01", value=7_170_000.0), + _monthly_consumer_fact_row("2026-02", value=7_170_000.0), + ] + reference = LedgerTargetReference( + name="latest plateau enrollment", + ledger_selector={ + "source_name": "cms_medicaid", + "source_measure_id": "total_medicaid_chip_enrollment", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "person", + }, + value_operation="latest_plateau", + entity="person", + measure="total_medicaid_chip_enrollment", + period=2026, + family="cms_medicaid", + ) + + registry = compile_ledger_target_references(rows, [reference], country="us") + + spec = registry.specs[0] + assert spec.value == 7_170_000.0 + assert spec.metadata["ledger_member_fact_count"] == "3" + assert spec.metadata["ledger_value_operation"] == "latest_plateau" + + +def test__given_month_operation_matches_non_month_fact__then_refuses_mixing() -> None: + monthly = _monthly_consumer_fact_row("2025-04", value=6_380_000.0) + annual = _monthly_consumer_fact_row("2025-05", value=6_600_000.0) + annual["period"] = {"type": "tax_year", "value": 2025} + reference = LedgerTargetReference( + name="invalid calendar average enrollment", + ledger_selector={ + "source_name": "cms_medicaid", + "source_measure_id": "total_medicaid_chip_enrollment", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "person", + }, + value_operation="calendar_year_average", + entity="person", + measure="total_medicaid_chip_enrollment", + period=2025, + family="cms_medicaid", + ) + + with pytest.raises(ValueError, match="requires monthly Ledger facts"): + compile_ledger_target_references([monthly, annual], [reference], country="us") + + +def test__given_identity_reference_matches_multiple_facts__then_still_fails() -> None: + first = _consumer_fact_row_for_period(2023, value=100.0) + first["aggregate_fact_key"] = "ledger.aggregate_fact.v2:first" + first["layout"]["groupby_value_id"] = "first" + second = _consumer_fact_row_for_period(2023, value=250.0) + second["aggregate_fact_key"] = "ledger.aggregate_fact.v2:second" + second["layout"]["groupby_value_id"] = "second" + reference = LedgerTargetReference( + name="ambiguous bands", + ledger_selector={ + "source_name": "irs_soi", + "source_measure_id": "adjusted_gross_income", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "tax_unit", + }, + entity="tax_unit", + measure="adjusted_gross_income", + period=2024, + family="irs_soi", + ) + + with pytest.raises(ValueError, match="matched multiple Ledger facts"): + compile_ledger_target_references([first, second], [reference], country="us") + + def test__given_lineage_only_metadata_diff__then_parity_report_names_full_digest() -> ( None ): @@ -1546,26 +1972,7 @@ def test_ledger_metadata_records_assertion_and_fact_period(): assert projection.metadata["ledger_assertion"] == "source_projection" -def test_ledger_reference_selector_matches_on_assertion(): - from microcosm.build.ledger_targets import ( - LedgerTargetReference, - compile_ledger_target_references, - ) - - rows = [ - _consumer_fact_row(), - _consumer_fact_row( - aggregate_fact_key="ledger.aggregate_fact.v2:proj123", - legacy_fact_key="ledger.fact.v1:proj123", - assertion="source_projection", - value=16_000_000_000_000, - lineage={ - "source_record_id": "cbo.ty2023.projection.agi", - "source_cell_keys": ["ledger.source_cell.v1:proj"], - "source_row_keys": [], - }, - ), - ] +def test_ledger_reference_selector_rejects_assertion_selector_key(): reference = LedgerTargetReference( name="cbo_projected_agi", ledger_selector={ @@ -1577,7 +1984,115 @@ def test_ledger_reference_selector_matches_on_assertion(): family="cbo", ) - registry = compile_ledger_target_references(rows, [reference], country="us") + with pytest.raises(ValueError, match="Unsupported Ledger fact selector field"): + compile_ledger_target_references( + [_consumer_fact_row(assertion="source_projection")], + [reference], + country="us", + ) + + +def test_ledger_reference_projection_fact_excluded_by_default(): + reference = LedgerTargetReference( + name="cbo_projected_agi", + ledger_selector={"source_measure_id": "adjusted_gross_income"}, + entity="household", + measure="adjusted_gross_income", + family="cbo", + period=2024, + ) + + with pytest.raises(ValueError, match="at or before target period"): + compile_ledger_target_references( + [ + _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:proj123", + legacy_fact_key="ledger.fact.v1:proj123", + assertion="source_projection", + value=16_000_000_000_000, + ) + ], + [reference], + country="us", + ) + + +def test_ledger_reference_projection_fact_allowed_by_policy(): + reference = LedgerTargetReference( + name="cbo_projected_agi", + ledger_selector={"source_measure_id": "adjusted_gross_income"}, + entity="household", + measure="adjusted_gross_income", + family="cbo", + period=2024, + assertion_policy="allow_source_projection", + ) + + registry = compile_ledger_target_references( + [ + _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:proj123", + legacy_fact_key="ledger.fact.v1:proj123", + assertion="source_projection", + value=16_000_000_000_000, + ) + ], + [reference], + country="us", + ) + (spec,) = registry.specs assert spec.value == 16_000_000_000_000 assert spec.metadata["ledger_assertion"] == "source_projection" + assert spec.metadata["ledger_resolved_assertion"] == "source_projection" + assert spec.metadata["ledger_assertion_policy"] == "allow_source_projection" + + +def test_ledger_reference_absent_assertion_fact_is_observation_by_default(): + reference = LedgerTargetReference( + name="observed_agi", + ledger_selector={"source_measure_id": "adjusted_gross_income"}, + entity="household", + measure="adjusted_gross_income", + family="irs_soi", + period=2024, + ) + + registry = compile_ledger_target_references( + [_consumer_fact_row(value=15_000_000_000_000)], + [reference], + country="us", + ) + + (spec,) = registry.specs + assert spec.value == 15_000_000_000_000 + assert "ledger_assertion" not in spec.metadata + assert spec.metadata["ledger_resolved_assertion"] == "observation" + assert spec.metadata["ledger_assertion_policy"] == "observed_only" + + +def test_ledger_reference_latest_selection_uses_policy_eligible_facts(): + observed = _consumer_fact_row_for_period(2023, value=15_000_000_000_000) + projection = _consumer_fact_row_for_period(2024, value=16_000_000_000_000) + projection["assertion"] = "source_projection" + reference = LedgerTargetReference( + name="latest observed agi", + ledger_selector={ + "source_name": "irs_soi", + "source_measure_id": "adjusted_gross_income", + "geography_level": "country", + "geography_id": "0100000US", + "entity_name": "tax_unit", + "layout_groupby_value_id": "all", + }, + entity="tax_unit", + measure="adjusted_gross_income", + period=2024, + family="irs_soi", + ) + + registry = compile_ledger_target_references( + [observed, projection], [reference], country="us" + ) + + assert registry.specs[0].value == 15_000_000_000_000 diff --git a/packages/microcosm-build/tests/test_target_materialization.py b/packages/microcosm-build/tests/test_target_materialization.py new file mode 100644 index 000000000..7bcf2bd21 --- /dev/null +++ b/packages/microcosm-build/tests/test_target_materialization.py @@ -0,0 +1,182 @@ +import numpy as np + +from microcosm.build.target_materialization import materialize_target_bindings +from microcosm.calibrate import TargetRegistry, TargetSpec + + +class StubAdapter: + def __init__(self): + self.tables = { + "person": { + "income": np.array([10.0, 20.0, 30.0]), + "age": np.array([16.0, 30.0, 40.0]), + "capital_gains": np.array([0.0, 5_000.0, 20_000.0]), + "baseline_tax": np.array([1.0, 2.0, 3.0]), + }, + "household": { + "affected": np.array([1.0, 0.0, 1.0]), + "children": np.array([3.0, 2.0, 4.0]), + }, + } + + def column(self, entity, variable): + return self.tables[entity][variable] + + def set_column(self, entity, variable, values): + self.tables.setdefault(entity, {})[variable] = np.asarray(values) + + def parameter(self, name, period): + assert name == "cgt.aea" + assert period == 2025 + return 6_000.0 + + def counterfactual_delta(self, binding, period): + assert binding["zeroed_input"] == "salary_sacrifice" + assert period == 2025 + return np.array([0.0, -1.0, -2.0]) + + +def test_prepared_column_path_materializes_filtered_values(): + registry = TargetRegistry( + [ + TargetSpec( + name="adult_income", + entity="person", + measure="adult_income_measure", + value=50.0, + source="test", + metadata={"contract_target_id": "adult_income"}, + ) + ], + country="uk", + ) + contract = { + "adult_income": { + "bindings": { + "policyengine": { + "value_variable": "income", + "filters": [{"variable": "age", "operator": ">=", "value": 18}], + } + } + } + } + adapter = StubAdapter() + + result = materialize_target_bindings(adapter, registry, contract, period=2025) + + assert result.skipped == () + assert adapter.tables["person"]["adult_income_measure"].tolist() == [ + 0.0, + 20.0, + 30.0, + ] + + +def test_generic_provider_kinds_materialize_expected_columns(): + registry = TargetRegistry( + [ + TargetSpec( + name="cgt_taxpayers", + entity="person", + measure="cgt_taxpayer_measure", + value=1.0, + source="test", + metadata={"contract_target_id": "cgt_taxpayers"}, + ), + TargetSpec( + name="affected_children", + entity="household", + measure="affected_children_measure", + value=7.0, + source="test", + metadata={"contract_target_id": "affected_children"}, + ), + TargetSpec( + name="salary_sacrifice", + entity="person", + measure="salary_sacrifice_delta", + value=-3.0, + source="test", + signed=True, + metadata={"contract_target_id": "salary_sacrifice"}, + ), + ], + country="uk", + ) + contract = { + "cgt_taxpayers": { + "bindings": { + "policyengine": { + "kind": "parameter_gated_threshold", + "gate_parameter": "cgt.aea", + "gate_comparison": ">", + "gated_variable": "capital_gains", + "value_variable": "person_count", + } + } + }, + "affected_children": { + "bindings": { + "policyengine": { + "kind": "baseline_flag_crosstab", + "from_entity": "household", + "affected_flag_variable": "affected", + "count_of": "children", + } + } + }, + "salary_sacrifice": { + "bindings": { + "policyengine": { + "kind": "input_substitution_counterfactual", + "zeroed_input": "salary_sacrifice", + "folded_into": "employment_income", + "output_variable": "income_tax", + "output_delta": "baseline_minus_reform", + } + } + }, + } + adapter = StubAdapter() + + result = materialize_target_bindings(adapter, registry, contract, period=2025) + + assert result.skipped == () + assert adapter.tables["person"]["cgt_taxpayer_measure"].tolist() == [0.0, 0.0, 1.0] + assert adapter.tables["household"]["affected_children_measure"].tolist() == [ + 3.0, + 0.0, + 4.0, + ] + assert adapter.tables["person"]["salary_sacrifice_delta"].tolist() == [ + 0.0, + -1.0, + -2.0, + ] + + +def test_missing_materialization_inputs_are_reported_as_skips(): + registry = TargetRegistry( + [ + TargetSpec( + name="missing", + entity="person", + measure="missing_measure", + value=1.0, + source="test", + metadata={"contract_target_id": "missing"}, + ) + ], + country="uk", + ) + contract = { + "missing": { + "bindings": {"policyengine": {"value_variable": "not_present"}} + } + } + + result = materialize_target_bindings(StubAdapter(), registry, contract, period=2025) + + assert len(result.skipped) == 1 + assert result.skipped[0].name == "missing" + assert result.report()["skipped_count"] == 1 diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py b/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py index 1d2b851fb..9b972f704 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py @@ -141,23 +141,94 @@ def _entity_row( The constraint row aligned to ``weight_entity``'s records. Raises: - ValueError: If the target's entity is neither the calibrated entity nor - a person entity nested under it (the only collapse supported here). + ValueError: If the target's entity is not nested under the calibrated + entity through the frame schema's declared person memberships. KeyError: If a measure/filter column is missing. """ if target.entity == weight_entity: return target.constraint_row(frame) - # Supported cross-entity case: target measured on persons, weights on a - # group the persons belong to. Build the per-person row, then collapse to - # one value per group by summation (members share the group weight). - person_row = target.constraint_row(frame) - positions = frame._group_positions(weight_entity) + row = target.constraint_row(frame) + positions = _nested_positions(target.entity, frame, weight_entity) collapsed = np.zeros(frame.n(weight_entity), dtype=np.float64) - np.add.at(collapsed, positions, person_row) + np.add.at(collapsed, positions, row) return collapsed +def _nested_positions( + entity: str, + frame: Frame, + weight_entity: str, +) -> np.ndarray: + """Position of each ``entity`` row within ``weight_entity``'s table. + + The frame schema declares group relationships as person membership columns. + A person-level target collapses directly through ``person__id``. + A group-level target collapses to another group only when every source + group id appears with exactly one destination group id in the person table. + """ + + schema = frame.schema + person_entity = schema.person_entity + if entity == person_entity: + if weight_entity not in schema.group_entities: + raise ValueError( + f"Cannot collapse target entity {entity!r} to non-group " + f"weight entity {weight_entity!r}." + ) + return frame._group_positions(weight_entity) + if entity not in schema.group_entities or weight_entity not in schema.group_entities: + raise ValueError( + f"Cannot collapse target entity {entity!r} to weight entity " + f"{weight_entity!r}; schema declares person entity " + f"{person_entity!r} and groups {list(schema.group_entities)}." + ) + + person = frame.person + source_column = schema.membership_column(entity) + weight_column = schema.membership_column(weight_entity) + source_to_weight: dict[object, object] = {} + split_source_ids: list[object] = [] + for source_id, destination_id in ( + person[[source_column, weight_column]] + .drop_duplicates() + .itertuples(index=False, name=None) + ): + existing = source_to_weight.get(source_id) + if existing is not None and existing != destination_id: + split_source_ids.append(source_id) + continue + source_to_weight[source_id] = destination_id + if split_source_ids: + raise ValueError( + f"Cannot collapse target entity {entity!r} to weight entity " + f"{weight_entity!r}: {entity} id(s) span multiple {weight_entity} " + f"ids, including {split_source_ids[:5]}." + ) + + source_ids = frame.table(entity)[schema.id_column(entity)].to_numpy() + missing = [source_id for source_id in source_ids if source_id not in source_to_weight] + if missing: + raise ValueError( + f"Cannot collapse target entity {entity!r} to weight entity " + f"{weight_entity!r}: {entity} id(s) have no person membership, " + f"including {missing[:5]}." + ) + destination_ids = np.asarray([source_to_weight[source_id] for source_id in source_ids]) + weight_ids = frame.table(weight_entity)[schema.id_column(weight_entity)].to_numpy() + positions = np.searchsorted(weight_ids, destination_ids) + valid = positions < len(weight_ids) + valid[valid] = weight_ids[positions[valid]] == destination_ids[valid] + if not bool(valid.all()): # pragma: no cover - frame validation guards this + bad = destination_ids[~valid][:5].tolist() + raise ValueError( + f"Cannot collapse target entity {entity!r} to weight entity " + f"{weight_entity!r}: mapped {weight_entity} id(s) are absent from " + f"the weight table, including {bad}." + ) + return positions + + def build_constraint_matrix( frame: Frame, targets: TargetSet, diff --git a/packages/microcosm-calibrate/tests/test_matrix.py b/packages/microcosm-calibrate/tests/test_matrix.py index 9554ce51c..11a91f5f3 100644 --- a/packages/microcosm-calibrate/tests/test_matrix.py +++ b/packages/microcosm-calibrate/tests/test_matrix.py @@ -3,8 +3,10 @@ from __future__ import annotations import numpy as np +import pandas as pd from microcosm.calibrate import Target, TargetSet, build_constraint_matrix +from microcosm.frame import EntitySchema, Frame, WeightKind, Weights def test_matrix_has_one_row_per_target_one_column_per_weight(feasible_frame) -> None: @@ -189,6 +191,51 @@ def test_person_sum_target_collapses_onto_multi_person_households( np.testing.assert_allclose(problem.estimates(weights)[0], true_total, rtol=1e-9) +def test_group_sum_target_collapses_onto_weighted_parent_group() -> None: + """A benunit-grain row compiles onto household weights on a real nested frame.""" + + weights = np.array([10.0, 20.0, 30.0]) + frame = Frame( + { + "person": pd.DataFrame( + { + "person_id": np.arange(6, dtype="int64"), + "person_benunit_id": [0, 0, 1, 2, 3, 3], + "person_household_id": [0, 0, 0, 1, 2, 2], + } + ), + "benunit": pd.DataFrame( + { + "benunit_id": np.arange(4, dtype="int64"), + "uc_receipt": [1.0, 0.0, 1.0, 1.0], + } + ), + "household": pd.DataFrame( + {"household_id": np.arange(3, dtype="int64")} + ), + }, + EntitySchema(group_entities=("benunit", "household")), + {"household": Weights(weights, WeightKind.DESIGN)}, + ) + targets = TargetSet( + ( + Target( + name="uc_benunits", + entity="benunit", + value=60.0, + measure="uc_receipt", + period=2025, + ), + ) + ) + + problem = build_constraint_matrix(frame, targets, "household") + + assert problem.skipped == () + np.testing.assert_allclose(problem.matrix.toarray()[0], [1.0, 1.0, 1.0]) + np.testing.assert_allclose(problem.estimates(weights), [60.0]) + + def test_uncompilable_target_is_skipped_and_reported(feasible_frame) -> None: frame, truths = feasible_frame(n=100) targets = TargetSet( From 759a9cae96c239a486392b05e0162ce370288066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 03:25:34 +0200 Subject: [PATCH 2/7] Regenerate the UK target surface at period 2025 under the refreshed contract The contract grows to 189 declarations: the 85-90 sex bands split into uniform five-year 85-89 bands plus 90_plus tail constraints, and all five CSV-suppressed incumbent ancestors are signed (the two NICs-relief rows alongside the IT-relief trio). The active subset regenerates at calibration year 2025 (FRS 2024-25 line, #723): 387 references (identity, sum, and declared holds) from a committed generator, with the full membership classification shipped as a package resource. Parity fixtures freeze the production-2023 release surface and the incumbent registry at 12a1e028 (652 rows; 637 effective at 2025), with every difference enumerated and signed, including the property-income x1.9 undercount provenance (policyengine-uk-data#311/#230) behind that family's signed exclusion. Co-Authored-By: Claude Fable 5 --- .../622-uk-ledger-2025-retarget.added.md | 1 + .../src/microcosm/build/country_spec.py | 1 + .../microcosm/build/uk/country_package.json | 25 + ...ity_incumbent_2025_signed_differences.json | 3590 ++++++ ...ty_production_2023_signed_differences.json | 2328 ++++ .../uk/parity_fixture_production_2023.json | 2019 +++ .../uk/registry_parity_fixture_2025.json | 10334 ++++++++++++++++ .../build/uk/target_reference_membership.json | 7641 ++++++++++++ .../microcosm/build/uk/target_references.json | 9178 +++++++++++++- .../build/uk/uk_national_targets.json | 178 +- .../microcosm/build/uk_runtime/__init__.py | 10 + .../build/uk_runtime/ledger_targets.py | 169 + .../uk_target_reference_feed_rows.jsonl | 22 +- .../tests/test_country_spec.py | 66 + .../tests/test_spec_engine_country_bundles.py | 2 +- .../tests/test_uk_ledger_targets.py | 98 + .../tests/test_uk_national_targets.py | 117 +- .../tests/test_uk_target_references.py | 365 +- .../microcosm-build/tests/test_us_plan.py | 1 + ...edger_compile_parity_signed_differences.py | 179 + tools/extract_uk_registry_fixture.py | 118 + tools/generate_uk_target_references.py | 402 + 22 files changed, 36681 insertions(+), 163 deletions(-) create mode 100644 changelog.d/622-uk-ledger-2025-retarget.added.md create mode 100644 packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json create mode 100644 packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json create mode 100644 packages/microcosm-build/src/microcosm/build/uk/parity_fixture_production_2023.json create mode 100644 packages/microcosm-build/src/microcosm/build/uk/registry_parity_fixture_2025.json create mode 100644 packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json create mode 100644 packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py create mode 100644 packages/microcosm-build/tests/test_uk_ledger_targets.py create mode 100644 tools/build_uk_ledger_compile_parity_signed_differences.py create mode 100644 tools/extract_uk_registry_fixture.py create mode 100644 tools/generate_uk_target_references.py diff --git a/changelog.d/622-uk-ledger-2025-retarget.added.md b/changelog.d/622-uk-ledger-2025-retarget.added.md new file mode 100644 index 000000000..05f506253 --- /dev/null +++ b/changelog.d/622-uk-ledger-2025-retarget.added.md @@ -0,0 +1 @@ +Retarget the UK Ledger target-reference subset to period 2025 and expand the active set from the staged UK fact feed. diff --git a/packages/microcosm-build/src/microcosm/build/country_spec.py b/packages/microcosm-build/src/microcosm/build/country_spec.py index d12348341..495f4c740 100644 --- a/packages/microcosm-build/src/microcosm/build/country_spec.py +++ b/packages/microcosm-build/src/microcosm/build/country_spec.py @@ -113,6 +113,7 @@ "exported_nonzero", "formula_owned_export", "input_mass_parity", + "ledger_compile_parity", "macro_realism", "nonconstant_columns", "nonnegative_columns", diff --git a/packages/microcosm-build/src/microcosm/build/uk/country_package.json b/packages/microcosm-build/src/microcosm/build/uk/country_package.json index 5a1613375..0ab84156a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/country_package.json +++ b/packages/microcosm-build/src/microcosm/build/uk/country_package.json @@ -137,11 +137,26 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "ledger_compile_parity_incumbent_2025_signed_differences.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, + { + "path": "ledger_compile_parity_production_2023_signed_differences.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "national_staging_build_record.json", "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "parity_fixture_production_2023.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "qrf_tail_reviewed_exclusions.json", "kind": "legacy_json", @@ -152,6 +167,11 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "registry_parity_fixture_2025.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "was_wealth_support_bounds.json", "kind": "legacy_json", @@ -171,6 +191,11 @@ "path": "target_references.json", "kind": "legacy_json", "schema_id": "legacy_json" + }, + { + "path": "target_reference_membership.json", + "kind": "legacy_json", + "schema_id": "legacy_json" } ] } 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 new file mode 100644 index 000000000..edf8da15d --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -0,0 +1,3590 @@ +{ + "compiled_count": 387, + "counts_by_kind": { + "calibration_drift": 162, + "fixture_only": 288, + "ledger_only": 38 + }, + "difference_count": 488, + "differences": [ + { + "fixture_value": 1608000.0, + "kind": "fixture_only", + "name": "dwp.pip.daily_living_enhanced_claimants", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1283000.0, + "kind": "fixture_only", + "name": "dwp.pip.daily_living_standard_claimants", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 6700000.0, + "kind": "fixture_only", + "name": "dwp.uc.households", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 320866000.0, + "kind": "fixture_only", + "name": "dwp/benefit_cap_total_reduction", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1424.0, + "kind": "fixture_only", + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_nan_to_nan", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 61727.0, + "kind": "fixture_only", + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_nan_to_nan", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 82905.0, + "kind": "fixture_only", + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_nan_to_nan", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3518.0, + "kind": "fixture_only", + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_nan_to_nan", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 5805652941.176472, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_100000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 6567201680.67227, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_1000000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1457322689.0756304, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_12300", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 9443821008.403362, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_2000000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2718348739.4957986, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_25000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 4898166386.554623, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_250000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3834464705.8823533, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_50000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 5863205882.3529415, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_500000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 23343884033.61345, + "kind": "fixture_only", + "name": "hmrc/capital_gains_band_5000000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 37000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_100000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 5000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_1000000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 79000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_12300", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_2000000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 74000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_25000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 14000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_250000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 53000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_50000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_500000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2000.0, + "kind": "fixture_only", + "name": "hmrc/cgt_taxpayers_band_5000000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 4845000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1273000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2185000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3211000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 834100000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1995000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7258000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1453500000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7220000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7182000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 900600000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 10260000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7163000000.0, + "kind": "fixture_only", + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 24720000000.0, + "kind": "fixture_only", + "name": "hmrc/salary_sacrifice_contributions", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 89035200000.0, + "kind": "fixture_only", + "name": "housing/rent_private", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 30680000000.0, + "kind": "fixture_only", + "name": "housing/rent_social", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 99000000000.0, + "kind": "fixture_only", + "name": "housing/total_mortgage", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 6512000.0, + "kind": "fixture_only", + "name": "nts/households_no_vehicle", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 13024000.0, + "kind": "fixture_only", + "name": "nts/households_one_vehicle", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 10064000.0, + "kind": "fixture_only", + "name": "nts/households_two_plus_vehicles", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 44117237614.71528, + "kind": "fixture_only", + "name": "obr.council_tax_england", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3051227494.93594, + "kind": "fixture_only", + "name": "obr.council_tax_scotland", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2400769752.36827, + "kind": "fixture_only", + "name": "obr.council_tax_wales", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 494000000.0, + "kind": "fixture_only", + "name": "obr.domestic_rates", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 82000.0, + "kind": "fixture_only", + "name": "ons.population.scotland_households_3plus_children", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 726000.0, + "kind": "fixture_only", + "name": "ons/east_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 741000.0, + "kind": "fixture_only", + "name": "ons/east_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 749000.0, + "kind": "fixture_only", + "name": "ons/east_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 890000.0, + "kind": "fixture_only", + "name": "ons/east_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 851000.0, + "kind": "fixture_only", + "name": "ons/east_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 867000.0, + "kind": "fixture_only", + "name": "ons/east_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 746000.0, + "kind": "fixture_only", + "name": "ons/east_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 643000.0, + "kind": "fixture_only", + "name": "ons/east_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 379000.0, + "kind": "fixture_only", + "name": "ons/east_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 532000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 585000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 632000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 669000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 621000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 681000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 592000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 500000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 273000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 304799621177.5439, + "kind": "fixture_only", + "name": "ons/household_land_value/EAST_MIDLANDS", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 542672059385.554, + "kind": "fixture_only", + "name": "ons/household_land_value/EAST_OF_ENGLAND", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1188167933642.289, + "kind": "fixture_only", + "name": "ons/household_land_value/LONDON", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 119603822538.99867, + "kind": "fixture_only", + "name": "ons/household_land_value/NORTH_EAST", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 422892569458.29254, + "kind": "fixture_only", + "name": "ons/household_land_value/NORTH_WEST", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 280395193712.8084, + "kind": "fixture_only", + "name": "ons/household_land_value/SCOTLAND", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 885848048153.7532, + "kind": "fixture_only", + "name": "ons/household_land_value/SOUTH_EAST", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 456726035827.05096, + "kind": "fixture_only", + "name": "ons/household_land_value/SOUTH_WEST", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 179320185054.4999, + "kind": "fixture_only", + "name": "ons/household_land_value/WALES", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 364340113693.65784, + "kind": "fixture_only", + "name": "ons/household_land_value/WEST_MIDLANDS", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 298105966119.05054, + "kind": "fixture_only", + "name": "ons/household_land_value/YORKSHIRE", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1042000.0, + "kind": "fixture_only", + "name": "ons/london_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1038000.0, + "kind": "fixture_only", + "name": "ons/london_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1470000.0, + "kind": "fixture_only", + "name": "ons/london_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1585000.0, + "kind": "fixture_only", + "name": "ons/london_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1314000.0, + "kind": "fixture_only", + "name": "ons/london_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1078000.0, + "kind": "fixture_only", + "name": "ons/london_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 778000.0, + "kind": "fixture_only", + "name": "ons/london_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 509000.0, + "kind": "fixture_only", + "name": "ons/london_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 304000.0, + "kind": "fixture_only", + "name": "ons/london_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 281000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 311000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 343000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 356000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 323000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 369000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 353000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 278000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 153000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 847000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 901000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 986000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1056000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 938000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1011000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 888000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 715000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 399000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 234000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 244000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 230000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 264000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 254000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 257000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 224000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 165000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 93000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 526000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 597000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 709000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 736000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 691000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 788000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 727000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 546000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 297000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1039000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1114000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1093000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1283000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1273000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1287000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1089000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 927000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 559000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 576000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 646000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 694000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 743000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 704000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 794000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 741000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 662000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 388000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8374612.0, + "kind": "fixture_only", + "name": "ons/tenure_england_owned_outright", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7667051.0, + "kind": "fixture_only", + "name": "ons/tenure_england_owned_with_mortgage", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 5299840.0, + "kind": "fixture_only", + "name": "ons/tenure_england_rented_privately", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 4274613.0, + "kind": "fixture_only", + "name": "ons/tenure_england_social_rent", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 25616116.0, + "kind": "fixture_only", + "name": "ons/tenure_england_total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 325000.0, + "kind": "fixture_only", + "name": "ons/wales_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 362000.0, + "kind": "fixture_only", + "name": "ons/wales_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 389000.0, + "kind": "fixture_only", + "name": "ons/wales_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 408000.0, + "kind": "fixture_only", + "name": "ons/wales_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 374000.0, + "kind": "fixture_only", + "name": "ons/wales_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 432000.0, + "kind": "fixture_only", + "name": "ons/wales_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 407000.0, + "kind": "fixture_only", + "name": "ons/wales_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 343000.0, + "kind": "fixture_only", + "name": "ons/wales_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 190000.0, + "kind": "fixture_only", + "name": "ons/wales_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 700000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 743000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 774000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 834000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 758000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 800000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 685000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 570000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 337000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 618000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_0_9", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 666000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_10_19", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 733000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_20_29", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 764000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_30_39", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 686000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_40_49", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 745000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_50_59", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 658000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_60_69", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 536000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_70_79", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 302000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_80_89", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 498707.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_a", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 583705.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_b", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 426388.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_c", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 369621.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_d", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 366881.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_e", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 221282.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_f", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 142084.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_g", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 14481.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.band_h", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2623149.0, + "kind": "fixture_only", + "name": "scotgov.council_tax_stock.total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 471000000.0, + "kind": "fixture_only", + "name": "scotgov.scottish_child_payment_spending", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3985000.0, + "kind": "fixture_only", + "name": "slc.borrowers.plan_2_above_threshold", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8940000.0, + "kind": "fixture_only", + "name": "slc.borrowers.plan_2_liable", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 0.0, + "kind": "fixture_only", + "name": "slc.borrowers.plan_5_above_threshold", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 10000.0, + "kind": "fixture_only", + "name": "slc.borrowers.plan_5_liable", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 18611.0, + "kind": "fixture_only", + "name": "slc.support.adult_dependants_grant_recipients", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 55364917.0, + "kind": "fixture_only", + "name": "slc.support.adult_dependants_grant_spend", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1159761.0, + "kind": "fixture_only", + "name": "slc.support.maintenance_loan_recipients", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8591659718.0, + "kind": "fixture_only", + "name": "slc.support.maintenance_loan_spend", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 99645.0, + "kind": "fixture_only", + "name": "slc.support.parents_learning_allowance_recipients", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 181421659.0, + "kind": "fixture_only", + "name": "slc.support.parents_learning_allowance_spend", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 181700000.0, + "kind": "fixture_only", + "name": "slc/student_loan_repayment/northern_ireland", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 203300000.0, + "kind": "fixture_only", + "name": "slc/student_loan_repayment/scotland", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 229100000.0, + "kind": "fixture_only", + "name": "slc/student_loan_repayment/wales", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 804340.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 505610.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 403840.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 247850.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 154970.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 73920.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 39400.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3480.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2233400.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_MIDLANDS/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 403180.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 598950.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 739570.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 506540.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 313840.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 172960.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 113720.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 14830.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2863600.0, + "kind": "fixture_only", + "name": "voa/council_tax/EAST_OF_ENGLAND/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 144550.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 499130.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1040280.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 975750.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 585130.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 298920.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 225170.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 68500.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3837430.0, + "kind": "fixture_only", + "name": "voa/council_tax/LONDON/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 667540.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 206790.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 196180.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 113460.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 61090.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 26600.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 14600.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1570.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1287830.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_EAST/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1386260.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 705450.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 616070.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 363970.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 216990.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 104330.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 65750.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7350.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3466140.0, + "kind": "fixture_only", + "name": "voa/council_tax/NORTH_WEST/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 367610.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 687430.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1075940.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 843560.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 551730.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 337260.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 265610.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 40390.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 4169520.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_EAST/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 473020.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 644890.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 624030.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 432070.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 292090.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 147920.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 81960.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8430.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2704390.0, + "kind": "fixture_only", + "name": "voa/council_tax/SOUTH_WEST/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 215380.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 307070.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 323220.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 241220.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 200840.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 122650.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 55190.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 13190.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1484410.0, + "kind": "fixture_only", + "name": "voa/council_tax/WALES/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 786010.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 654140.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 526260.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 302500.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 193700.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 105630.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 62780.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 6170.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2637190.0, + "kind": "fixture_only", + "name": "voa/council_tax/WEST_MIDLANDS/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1070830.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/A", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 514190.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/B", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 432290.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/C", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 249530.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/D", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 158600.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/E", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 75690.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/F", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 42180.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/G", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 3770.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/H", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 2547080.0, + "kind": "fixture_only", + "name": "voa/council_tax/YORKSHIRE/total", + "period": 2025, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 597920.0, + "name": "dwp.uc.two_child_limit.children_affected", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 235270.0, + "name": "dwp.uc.two_child_limit.children_claimant_pip", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 479460.0, + "name": "dwp.uc.two_child_limit.children_disabled_child_element", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 891930.0, + "name": "dwp.uc.two_child_limit.children_in_3_children_households", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 468760.0, + "name": "dwp.uc.two_child_limit.children_in_4_children_households", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 185120.0, + "name": "dwp.uc.two_child_limit.children_in_5_children_households", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 119720.0, + "name": "dwp.uc.two_child_limit.children_in_6_plus_children_households", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1665540.0, + "name": "dwp.uc.two_child_limit.children_in_affected_households", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 297310.0, + "name": "dwp.uc.two_child_limit.households_3_children", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 117190.0, + "name": "dwp.uc.two_child_limit.households_4_children", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 37020.0, + "name": "dwp.uc.two_child_limit.households_5_children", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 18260.0, + "name": "dwp.uc.two_child_limit.households_6_plus_children", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 469780.0, + "name": "dwp.uc.two_child_limit.households_affected", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 65280.0, + "name": "dwp.uc.two_child_limit.households_claimant_pip", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 129630.0, + "name": "dwp.uc.two_child_limit.households_disabled_child_element", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1800000000.0, + "name": "hmrc.salary_sacrifice.it_relief_additional_rate", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1600000000.0, + "name": "hmrc.salary_sacrifice.it_relief_basic_rate", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5500000000.0, + "name": "hmrc.salary_sacrifice.it_relief_higher_rate", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7553013.0, + "name": "ons.population.age_0_9_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8331437.0, + "name": "ons.population.age_10_19_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8715225.0, + "name": "ons.population.age_20_29_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 9572397.0, + "name": "ons.population.age_30_39_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8622506.0, + "name": "ons.population.age_40_49_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 9036816.0, + "name": "ons.population.age_50_59_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7861034.0, + "name": "ons.population.age_60_69_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5998605.0, + "name": "ons.population.age_70_79_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2965168.0, + "name": "ons.population.age_80_89_by_region", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 414716.0, + "name": "ons.population.female_90_plus", + "period": 2025, + "reason": "María ruling 2026-08-21: new female 90_plus tail constrains ages 90+; the incumbent six-year terminal band left ages 91+ unconstrained." + }, + { + "kind": "ledger_only", + "ledger_value": 210520.0, + "name": "ons.population.male_90_plus", + "period": 2025, + "reason": "María ruling 2026-08-21: new male 90_plus tail constrains ages 90+; the incumbent six-year terminal band left ages 91+ unconstrained." + }, + { + "kind": "ledger_only", + "ledger_value": 6103320.0, + "name": "voa.council_tax_stock.band_a", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5016580.0, + "name": "voa.council_tax_stock.band_b", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5654450.0, + "name": "voa.council_tax_stock.band_c", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4035220.0, + "name": "voa.council_tax_stock.band_d", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2528140.0, + "name": "voa.council_tax_stock.band_e", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1343220.0, + "name": "voa.council_tax_stock.band_f", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 911160.0, + "name": "voa.council_tax_stock.band_g", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 154470.0, + "name": "voa.council_tax_stock.band_h", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 25746570.0, + "name": "voa.council_tax_stock.total", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "fixture_value": 999000.0, + "kind": "calibration_drift", + "ledger_value": 1000000.0, + "name": "dwp.esa_claimants", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1222944.0, + "kind": "calibration_drift", + "ledger_value": 1269512.0, + "name": "dwp.uc.households_children_1", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1058967.0, + "kind": "calibration_drift", + "ledger_value": 1103880.0, + "name": "dwp.uc.households_children_2", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 473500.0, + "kind": "calibration_drift", + "ledger_value": 497665.0, + "name": "dwp.uc.households_children_3", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 166790.0, + "kind": "calibration_drift", + "ledger_value": 176202.0, + "name": "dwp.uc.households_children_4", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 75910.0, + "kind": "calibration_drift", + "ledger_value": 77894.0, + "name": "dwp.uc.households_children_5_or_more", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 231368.0, + "kind": "calibration_drift", + "ledger_value": 266160.0, + "name": "dwp.uc.households_couple_no_children", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 839379.0, + "kind": "calibration_drift", + "ledger_value": 911392.0, + "name": "dwp.uc.households_couple_with_children", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2868011.0, + "kind": "calibration_drift", + "ledger_value": 3191316.0, + "name": "dwp.uc.households_single_no_children", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2156879.0, + "kind": "calibration_drift", + "ledger_value": 2213760.0, + "name": "dwp.uc.households_single_with_children", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 14000.0, + "kind": "calibration_drift", + "ledger_value": 14412.0, + "name": "dwp.uc.scotland_households_child_under_1", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 7610.0, + "kind": "calibration_drift", + "ledger_value": 7553.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 12370.0, + "kind": "calibration_drift", + "ledger_value": 12318.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 15175.0, + "kind": "calibration_drift", + "ledger_value": 15096.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 12297.0, + "kind": "calibration_drift", + "ledger_value": 12422.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 17828.0, + "kind": "calibration_drift", + "ledger_value": 17851.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 14427.0, + "kind": "calibration_drift", + "ledger_value": 14493.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 11892.0, + "kind": "calibration_drift", + "ledger_value": 11914.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 9463.0, + "kind": "calibration_drift", + "ledger_value": 9478.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 8443.0, + "kind": "calibration_drift", + "ledger_value": 8479.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 8906.0, + "kind": "calibration_drift", + "ledger_value": 8732.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5770.0, + "kind": "calibration_drift", + "ledger_value": 5764.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 3485.0, + "kind": "calibration_drift", + "ledger_value": 3525.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2360.0, + "kind": "calibration_drift", + "ledger_value": 2356.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1815.0, + "kind": "calibration_drift", + "ledger_value": 1797.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1186.0, + "kind": "calibration_drift", + "ledger_value": 1214.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 935.0, + "kind": "calibration_drift", + "ledger_value": 958.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 632.0, + "kind": "calibration_drift", + "ledger_value": 654.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 580.0, + "kind": "calibration_drift", + "ledger_value": 578.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 11750.0, + "kind": "calibration_drift", + "ledger_value": 11606.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 10802.0, + "kind": "calibration_drift", + "ledger_value": 10672.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 12168.0, + "kind": "calibration_drift", + "ledger_value": 12199.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 12461.0, + "kind": "calibration_drift", + "ledger_value": 12405.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 15787.0, + "kind": "calibration_drift", + "ledger_value": 15632.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 14248.0, + "kind": "calibration_drift", + "ledger_value": 14298.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 17559.0, + "kind": "calibration_drift", + "ledger_value": 17626.0, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 18714.0, + "kind": "calibration_drift", + "ledger_value": 18896.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 42188.0, + "kind": "calibration_drift", + "ledger_value": 41858.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 41520.0, + "kind": "calibration_drift", + "ledger_value": 41349.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 41159.0, + "kind": "calibration_drift", + "ledger_value": 40850.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 42515.0, + "kind": "calibration_drift", + "ledger_value": 42101.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 38527.0, + "kind": "calibration_drift", + "ledger_value": 38379.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 38894.0, + "kind": "calibration_drift", + "ledger_value": 38725.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 38659.0, + "kind": "calibration_drift", + "ledger_value": 38124.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 34318.0, + "kind": "calibration_drift", + "ledger_value": 33871.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 22489.0, + "kind": "calibration_drift", + "ledger_value": 22614.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 30116.0, + "kind": "calibration_drift", + "ledger_value": 29950.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 28519.0, + "kind": "calibration_drift", + "ledger_value": 28186.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 26014.0, + "kind": "calibration_drift", + "ledger_value": 25960.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 23159.0, + "kind": "calibration_drift", + "ledger_value": 23231.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 20618.0, + "kind": "calibration_drift", + "ledger_value": 20598.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 17493.0, + "kind": "calibration_drift", + "ledger_value": 17650.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 15437.0, + "kind": "calibration_drift", + "ledger_value": 15499.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 12836.0, + "kind": "calibration_drift", + "ledger_value": 12912.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 26734.0, + "kind": "calibration_drift", + "ledger_value": 26768.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 29189.0, + "kind": "calibration_drift", + "ledger_value": 29288.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 33137.0, + "kind": "calibration_drift", + "ledger_value": 33072.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 38338.0, + "kind": "calibration_drift", + "ledger_value": 38337.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 40685.0, + "kind": "calibration_drift", + "ledger_value": 40556.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 40564.0, + "kind": "calibration_drift", + "ledger_value": 40399.0, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 24639.0, + "kind": "calibration_drift", + "ledger_value": 24828.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 126949.0, + "kind": "calibration_drift", + "ledger_value": 125466.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 131129.0, + "kind": "calibration_drift", + "ledger_value": 129699.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 131289.0, + "kind": "calibration_drift", + "ledger_value": 129699.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 119355.0, + "kind": "calibration_drift", + "ledger_value": 117812.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 130802.0, + "kind": "calibration_drift", + "ledger_value": 128991.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 141848.0, + "kind": "calibration_drift", + "ledger_value": 139675.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 136835.0, + "kind": "calibration_drift", + "ledger_value": 134650.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 107556.0, + "kind": "calibration_drift", + "ledger_value": 106818.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 34670.0, + "kind": "calibration_drift", + "ledger_value": 34587.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 86616.0, + "kind": "calibration_drift", + "ledger_value": 86255.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 80294.0, + "kind": "calibration_drift", + "ledger_value": 80273.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 70309.0, + "kind": "calibration_drift", + "ledger_value": 70319.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 50510.0, + "kind": "calibration_drift", + "ledger_value": 50805.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 42522.0, + "kind": "calibration_drift", + "ledger_value": 43132.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 33508.0, + "kind": "calibration_drift", + "ledger_value": 34342.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 27063.0, + "kind": "calibration_drift", + "ledger_value": 27650.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 21663.0, + "kind": "calibration_drift", + "ledger_value": 22058.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 43623.0, + "kind": "calibration_drift", + "ledger_value": 43550.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 55622.0, + "kind": "calibration_drift", + "ledger_value": 55560.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 67901.0, + "kind": "calibration_drift", + "ledger_value": 68058.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 89314.0, + "kind": "calibration_drift", + "ledger_value": 89174.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 118641.0, + "kind": "calibration_drift", + "ledger_value": 117236.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 99069.0, + "kind": "calibration_drift", + "ledger_value": 98877.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 102251.0, + "kind": "calibration_drift", + "ledger_value": 102069.0, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 102312.0, + "kind": "calibration_drift", + "ledger_value": 101189.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 95698.0, + "kind": "calibration_drift", + "ledger_value": 94296.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 106663.0, + "kind": "calibration_drift", + "ledger_value": 106102.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 181180.0, + "kind": "calibration_drift", + "ledger_value": 182183.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 189861.0, + "kind": "calibration_drift", + "ledger_value": 191730.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 129174.0, + "kind": "calibration_drift", + "ledger_value": 130302.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 84690.0, + "kind": "calibration_drift", + "ledger_value": 86110.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 46244.0, + "kind": "calibration_drift", + "ledger_value": 47330.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 26481.0, + "kind": "calibration_drift", + "ledger_value": 27065.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 120819.0, + "kind": "calibration_drift", + "ledger_value": 121018.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 18143.0, + "kind": "calibration_drift", + "ledger_value": 18536.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 12325.0, + "kind": "calibration_drift", + "ledger_value": 12726.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 9555.0, + "kind": "calibration_drift", + "ledger_value": 9793.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 6230.0, + "kind": "calibration_drift", + "ledger_value": 6398.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5884.0, + "kind": "calibration_drift", + "ledger_value": 6020.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5362.0, + "kind": "calibration_drift", + "ledger_value": 5488.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1786.0, + "kind": "calibration_drift", + "ledger_value": 1829.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1491.0, + "kind": "calibration_drift", + "ledger_value": 1543.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 173925.0, + "kind": "calibration_drift", + "ledger_value": 173855.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 375706.0, + "kind": "calibration_drift", + "ledger_value": 369404.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 200713.0, + "kind": "calibration_drift", + "ledger_value": 197717.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 107860.0, + "kind": "calibration_drift", + "ledger_value": 106706.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 144036.0, + "kind": "calibration_drift", + "ledger_value": 143277.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 377221.0, + "kind": "calibration_drift", + "ledger_value": 379652.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 341138.0, + "kind": "calibration_drift", + "ledger_value": 341457.0, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 67727478991.59665, + "kind": "calibration_drift", + "ledger_value": 65937000000.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." + }, + { + "fixture_value": 1236000000.0, + "kind": "calibration_drift", + "ledger_value": 1000000000.0, + "name": "hmrc.salary_sacrifice.nics_relief_employee", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2987000000.0, + "kind": "calibration_drift", + "ledger_value": 3400000000.0, + "name": "hmrc.salary_sacrifice.nics_relief_employer", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 3379200.0, + "kind": "calibration_drift", + "ledger_value": 3300000.0, + "name": "hmrc.salary_sacrifice.users_above_cap", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 4403200.0, + "kind": "calibration_drift", + "ledger_value": 4300000.0, + "name": "hmrc.salary_sacrifice.users_below_cap", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 7884800.0, + "kind": "calibration_drift", + "ledger_value": 7700000.0, + "name": "hmrc.salary_sacrifice.users_total", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 557000.0, + "kind": "calibration_drift", + "ledger_value": 556551.0, + "name": "isc.private_school_students", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2057128451236.5015, + "kind": "calibration_drift", + "ledger_value": 2103053000000.0, + "name": "ons.land.corporate_land_value", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5042871548763.499, + "kind": "calibration_drift", + "ledger_value": 4559831000000.0, + "name": "ons.land.household_land_value", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 7100000000000.0, + "kind": "calibration_drift", + "ledger_value": 7117771000000.0, + "name": "ons.land.land_value", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1698816.0, + "kind": "calibration_drift", + "ledger_value": 1744355.0, + "name": "ons.population.female_0_4", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2041879.0, + "kind": "calibration_drift", + "ledger_value": 2052052.0, + "name": "ons.population.female_10_14", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2036402.0, + "kind": "calibration_drift", + "ledger_value": 2002835.0, + "name": "ons.population.female_15_19", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2033478.0, + "kind": "calibration_drift", + "ledger_value": 2034609.0, + "name": "ons.population.female_20_24", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2258028.0, + "kind": "calibration_drift", + "ledger_value": 2291610.0, + "name": "ons.population.female_25_29", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2443559.0, + "kind": "calibration_drift", + "ledger_value": 2463301.0, + "name": "ons.population.female_30_34", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2497122.0, + "kind": "calibration_drift", + "ledger_value": 2472291.0, + "name": "ons.population.female_35_39", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2356214.0, + "kind": "calibration_drift", + "ledger_value": 2333109.0, + "name": "ons.population.female_40_44", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2135556.0, + "kind": "calibration_drift", + "ledger_value": 2088285.0, + "name": "ons.population.female_45_49", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2206473.0, + "kind": "calibration_drift", + "ledger_value": 2255231.0, + "name": "ons.population.female_50_54", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2340737.0, + "kind": "calibration_drift", + "ledger_value": 2360202.0, + "name": "ons.population.female_55_59", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1918180.0, + "kind": "calibration_drift", + "ledger_value": 1941658.0, + "name": "ons.population.female_5_9", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2248908.0, + "kind": "calibration_drift", + "ledger_value": 2193915.0, + "name": "ons.population.female_60_64", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1890892.0, + "kind": "calibration_drift", + "ledger_value": 1838574.0, + "name": "ons.population.female_65_69", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1619328.0, + "kind": "calibration_drift", + "ledger_value": 1622996.0, + "name": "ons.population.female_70_74", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1575830.0, + "kind": "calibration_drift", + "ledger_value": 1551183.0, + "name": "ons.population.female_75_79", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1064043.0, + "kind": "calibration_drift", + "ledger_value": 1024480.0, + "name": "ons.population.female_80_84", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 766765.0, + "kind": "calibration_drift", + "ledger_value": 665267.0, + "name": "ons.population.female_85_89", + "period": 2025, + "reason": "María ruling 2026-08-21: incumbent ons/female_85_90 maps to the uniform female 85_89 declaration. The value gap is the single-age-90 share; ages 90+ are constrained separately." + }, + { + "fixture_value": 1784490.0, + "kind": "calibration_drift", + "ledger_value": 1829801.0, + "name": "ons.population.male_0_4", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2143309.0, + "kind": "calibration_drift", + "ledger_value": 2152800.0, + "name": "ons.population.male_10_14", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2149930.0, + "kind": "calibration_drift", + "ledger_value": 2123750.0, + "name": "ons.population.male_15_19", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2136737.0, + "kind": "calibration_drift", + "ledger_value": 2131646.0, + "name": "ons.population.male_20_24", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2246892.0, + "kind": "calibration_drift", + "ledger_value": 2257360.0, + "name": "ons.population.male_25_29", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2323977.0, + "kind": "calibration_drift", + "ledger_value": 2333326.0, + "name": "ons.population.male_30_34", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2325815.0, + "kind": "calibration_drift", + "ledger_value": 2303479.0, + "name": "ons.population.male_35_39", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2208064.0, + "kind": "calibration_drift", + "ledger_value": 2196013.0, + "name": "ons.population.male_40_44", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2040636.0, + "kind": "calibration_drift", + "ledger_value": 2005099.0, + "name": "ons.population.male_45_49", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2119462.0, + "kind": "calibration_drift", + "ledger_value": 2164862.0, + "name": "ons.population.male_50_54", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2234921.0, + "kind": "calibration_drift", + "ledger_value": 2256521.0, + "name": "ons.population.male_55_59", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2011903.0, + "kind": "calibration_drift", + "ledger_value": 2037199.0, + "name": "ons.population.male_5_9", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 2138720.0, + "kind": "calibration_drift", + "ledger_value": 2094462.0, + "name": "ons.population.male_60_64", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1785048.0, + "kind": "calibration_drift", + "ledger_value": 1734083.0, + "name": "ons.population.male_65_69", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1472190.0, + "kind": "calibration_drift", + "ledger_value": 1473758.0, + "name": "ons.population.male_70_74", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1370172.0, + "kind": "calibration_drift", + "ledger_value": 1350668.0, + "name": "ons.population.male_75_79", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 853423.0, + "kind": "calibration_drift", + "ledger_value": 815910.0, + "name": "ons.population.male_80_84", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 524918.0, + "kind": "calibration_drift", + "ledger_value": 459511.0, + "name": "ons.population.male_85_89", + "period": 2025, + "reason": "María ruling 2026-08-21: incumbent ons/male_85_90 maps to the uniform male 85_89 declaration. The value gap is the single-age-90 share; ages 90+ are constrained separately." + }, + { + "fixture_value": 46000.0, + "kind": "calibration_drift", + "ledger_value": 46776.0, + "name": "ons.population.scotland_babies_under_1", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 892000.0, + "kind": "calibration_drift", + "ledger_value": 896833.0, + "name": "ons.population.scotland_children_under_16", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 69502341.0, + "kind": "calibration_drift", + "ledger_value": 69281437.0, + "name": "ons.population.uk_total", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5940000.0, + "kind": "calibration_drift", + "ledger_value": 6146000.0, + "name": "ons.public_sector_employment", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 346409713.95, + "kind": "calibration_drift", + "ledger_value": 346409713.95000005, + "name": "slc.repayments.england_postgraduate", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5018231834.95, + "kind": "calibration_drift", + "ledger_value": 5018231834.949999, + "name": "slc.repayments.england_total_higher_education", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + } + ], + "fixture_count": 637 +} 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 new file mode 100644 index 000000000..b796fe2d0 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -0,0 +1,2328 @@ +{ + "compiled_count": 211, + "counts_by_kind": { + "calibration_drift": 6, + "fixture_only": 131, + "ledger_only": 193 + }, + "difference_count": 330, + "differences": [ + { + "fixture_value": 82000.0, + "kind": "fixture_only", + "name": "ons.population.scotland_households_3plus_children", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 730000.0, + "kind": "fixture_only", + "name": "ons/east_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 745000.0, + "kind": "fixture_only", + "name": "ons/east_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 729000.0, + "kind": "fixture_only", + "name": "ons/east_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 868000.0, + "kind": "fixture_only", + "name": "ons/east_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 829000.0, + "kind": "fixture_only", + "name": "ons/east_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 873000.0, + "kind": "fixture_only", + "name": "ons/east_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 721000.0, + "kind": "fixture_only", + "name": "ons/east_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 612000.0, + "kind": "fixture_only", + "name": "ons/east_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 360000.0, + "kind": "fixture_only", + "name": "ons/east_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 535000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 588000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 614000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 652000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 605000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 686000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 572000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 475000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 260000.0, + "kind": "fixture_only", + "name": "ons/east_midlands_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 290045387683.9658, + "kind": "fixture_only", + "name": "ons/household_land_value/EAST_MIDLANDS", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 516403292240.49414, + "kind": "fixture_only", + "name": "ons/household_land_value/EAST_OF_ENGLAND", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1130653075012.1692, + "kind": "fixture_only", + "name": "ons/household_land_value/LONDON", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 113814239475.71474, + "kind": "fixture_only", + "name": "ons/household_land_value/NORTH_EAST", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 402421888791.4934, + "kind": "fixture_only", + "name": "ons/household_land_value/NORTH_WEST", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 266822289184.47226, + "kind": "fixture_only", + "name": "ons/household_land_value/SCOTLAND", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 842967388093.2286, + "kind": "fixture_only", + "name": "ons/household_land_value/SOUTH_EAST", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 434617600950.541, + "kind": "fixture_only", + "name": "ons/household_land_value/SOUTH_WEST", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 170639951561.47794, + "kind": "fixture_only", + "name": "ons/household_land_value/WALES", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 346703742992.981, + "kind": "fixture_only", + "name": "ons/household_land_value/WEST_MIDLANDS", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 283675747954.8778, + "kind": "fixture_only", + "name": "ons/household_land_value/YORKSHIRE", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1047000.0, + "kind": "fixture_only", + "name": "ons/london_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1043000.0, + "kind": "fixture_only", + "name": "ons/london_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1429000.0, + "kind": "fixture_only", + "name": "ons/london_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1545000.0, + "kind": "fixture_only", + "name": "ons/london_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1280000.0, + "kind": "fixture_only", + "name": "ons/london_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1086000.0, + "kind": "fixture_only", + "name": "ons/london_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 751000.0, + "kind": "fixture_only", + "name": "ons/london_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 484000.0, + "kind": "fixture_only", + "name": "ons/london_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 289000.0, + "kind": "fixture_only", + "name": "ons/london_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 283000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 312000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 333000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 347000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 314000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 371000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 341000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 264000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 145000.0, + "kind": "fixture_only", + "name": "ons/north_east_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 851000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 906000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 958000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1029000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 914000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1018000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 858000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 680000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 379000.0, + "kind": "fixture_only", + "name": "ons/north_west_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 235000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 245000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 224000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 258000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 247000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 258000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 217000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 157000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 89000.0, + "kind": "fixture_only", + "name": "ons/northern_ireland_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 528000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 600000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 689000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 717000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 673000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 793000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 702000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 520000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 282000.0, + "kind": "fixture_only", + "name": "ons/scotland_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1044000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1119000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1062000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1250000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1241000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1296000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1052000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 882000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 531000.0, + "kind": "fixture_only", + "name": "ons/south_east_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 579000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 650000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 675000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 724000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 686000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 800000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 716000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 630000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 369000.0, + "kind": "fixture_only", + "name": "ons/south_west_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8298342.0, + "kind": "fixture_only", + "name": "ons/tenure_england_owned_outright", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 7597225.0, + "kind": "fixture_only", + "name": "ons/tenure_england_owned_with_mortgage", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 5251573.0, + "kind": "fixture_only", + "name": "ons/tenure_england_rented_privately", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 4247906.0, + "kind": "fixture_only", + "name": "ons/tenure_england_social_rent", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 25395046.0, + "kind": "fixture_only", + "name": "ons/tenure_england_total", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 326000.0, + "kind": "fixture_only", + "name": "ons/wales_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 364000.0, + "kind": "fixture_only", + "name": "ons/wales_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 378000.0, + "kind": "fixture_only", + "name": "ons/wales_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 398000.0, + "kind": "fixture_only", + "name": "ons/wales_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 364000.0, + "kind": "fixture_only", + "name": "ons/wales_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 436000.0, + "kind": "fixture_only", + "name": "ons/wales_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 393000.0, + "kind": "fixture_only", + "name": "ons/wales_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 327000.0, + "kind": "fixture_only", + "name": "ons/wales_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 181000.0, + "kind": "fixture_only", + "name": "ons/wales_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 703000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 747000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 753000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 813000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 739000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 805000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 661000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 542000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 321000.0, + "kind": "fixture_only", + "name": "ons/west_midlands_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 621000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_0_9", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 669000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_10_19", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 713000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_20_29", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 745000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_30_39", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 668000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_40_49", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 751000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_50_59", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 635000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_60_69", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 510000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_70_79", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 287000.0, + "kind": "fixture_only", + "name": "ons/yorkshire_and_the_humber_age_80_89", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 20226.0, + "kind": "fixture_only", + "name": "slc.support.adult_dependants_grant_recipients", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 54638997.0, + "kind": "fixture_only", + "name": "slc.support.adult_dependants_grant_spend", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 1151607.0, + "kind": "fixture_only", + "name": "slc.support.maintenance_loan_recipients", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 8594103415.0, + "kind": "fixture_only", + "name": "slc.support.maintenance_loan_spend", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 89283.0, + "kind": "fixture_only", + "name": "slc.support.parents_learning_allowance_recipients", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "fixture_value": 153266251.0, + "kind": "fixture_only", + "name": "slc.support.parents_learning_allowance_spend", + "period": 2023, + "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 65937000000.0, + "name": "hmrc.cgt.gains_total", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 378000.0, + "name": "hmrc.cgt.taxpayers_total", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 222000.0, + "name": "hmrc/dividend_income_count_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 115000.0, + "name": "hmrc/dividend_income_count_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 92000.0, + "name": "hmrc/dividend_income_count_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 372000.0, + "name": "hmrc/dividend_income_count_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 19000.0, + "name": "hmrc/dividend_income_count_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 75000.0, + "name": "hmrc/dividend_income_count_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 843000.0, + "name": "hmrc/dividend_income_count_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 49000.0, + "name": "hmrc/dividend_income_count_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 667000.0, + "name": "hmrc/dividend_income_count_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 627000.0, + "name": "hmrc/dividend_income_count_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 32000.0, + "name": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 643000.0, + "name": "hmrc/dividend_income_count_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 336000.0, + "name": "hmrc/dividend_income_count_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 6870000000.0, + "name": "hmrc/dividend_income_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 175000000.0, + "name": "hmrc/dividend_income_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3450000000.0, + "name": "hmrc/dividend_income_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 855000000.0, + "name": "hmrc/dividend_income_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 11100000000.0, + "name": "hmrc/dividend_income_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3700000000.0, + "name": "hmrc/dividend_income_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3330000000.0, + "name": "hmrc/dividend_income_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3430000000.0, + "name": "hmrc/dividend_income_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4700000000.0, + "name": "hmrc/dividend_income_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8400000000.0, + "name": "hmrc/dividend_income_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3820000000.0, + "name": "hmrc/dividend_income_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 12500000000.0, + "name": "hmrc/dividend_income_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 9440000000.0, + "name": "hmrc/dividend_income_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 791000.0, + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1360000.0, + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 264000.0, + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3100000.0, + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 21000.0, + "name": "hmrc/employment_income_count_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 180000.0, + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7470000.0, + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 93000.0, + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5370000.0, + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3500000.0, + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 44000.0, + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3430000.0, + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1640000.0, + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 82300000000.0, + "name": "hmrc/employment_income_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 16900000000.0, + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 39200000000.0, + "name": "hmrc/employment_income_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 48600000000.0, + "name": "hmrc/employment_income_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 35500000000.0, + "name": "hmrc/employment_income_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 36600000000.0, + "name": "hmrc/employment_income_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 172000000000.0, + "name": "hmrc/employment_income_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 29000000000.0, + "name": "hmrc/employment_income_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 170000000000.0, + "name": "hmrc/employment_income_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 139000000000.0, + "name": "hmrc/employment_income_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 23100000000.0, + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 174000000000.0, + "name": "hmrc/employment_income_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 118000000000.0, + "name": "hmrc/employment_income_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 109000.0, + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1070000.0, + "name": "hmrc/private_pension_income_count_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 29000.0, + "name": "hmrc/private_pension_income_count_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2140000.0, + "name": "hmrc/private_pension_income_count_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2000.0, + "name": "hmrc/private_pension_income_count_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 20000.0, + "name": "hmrc/private_pension_income_count_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2660000.0, + "name": "hmrc/private_pension_income_count_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 10000.0, + "name": "hmrc/private_pension_income_count_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1450000.0, + "name": "hmrc/private_pension_income_count_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 779000.0, + "name": "hmrc/private_pension_income_count_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4000.0, + "name": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 643000.0, + "name": "hmrc/private_pension_income_count_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 259000.0, + "name": "hmrc/private_pension_income_count_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5430000000.0, + "name": "hmrc/private_pension_income_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4350000000.0, + "name": "hmrc/private_pension_income_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1810000000.0, + "name": "hmrc/private_pension_income_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 13600000000.0, + "name": "hmrc/private_pension_income_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 370000000.0, + "name": "hmrc/private_pension_income_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1570000000.0, + "name": "hmrc/private_pension_income_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 30200000000.0, + "name": "hmrc/private_pension_income_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1120000000.0, + "name": "hmrc/private_pension_income_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 24900000000.0, + "name": "hmrc/private_pension_income_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 16900000000.0, + "name": "hmrc/private_pension_income_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 640000000.0, + "name": "hmrc/private_pension_income_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 17400000000.0, + "name": "hmrc/private_pension_income_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 9470000000.0, + "name": "hmrc/private_pension_income_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 137000.0, + "name": "hmrc/property_income_count_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 101000.0, + "name": "hmrc/property_income_count_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 54000.0, + "name": "hmrc/property_income_count_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 232000.0, + "name": "hmrc/property_income_count_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7000.0, + "name": "hmrc/property_income_count_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 41000.0, + "name": "hmrc/property_income_count_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 431000.0, + "name": "hmrc/property_income_count_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 23000.0, + "name": "hmrc/property_income_count_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 364000.0, + "name": "hmrc/property_income_count_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 325000.0, + "name": "hmrc/property_income_count_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 13000.0, + "name": "hmrc/property_income_count_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 397000.0, + "name": "hmrc/property_income_count_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 226000.0, + "name": "hmrc/property_income_count_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 85000.0, + "name": "hmrc/self_employment_income_count_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 444000.0, + "name": "hmrc/self_employment_income_count_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 40000.0, + "name": "hmrc/self_employment_income_count_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 651000.0, + "name": "hmrc/self_employment_income_count_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 11000.0, + "name": "hmrc/self_employment_income_count_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 34000.0, + "name": "hmrc/self_employment_income_count_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 961000.0, + "name": "hmrc/self_employment_income_count_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 21000.0, + "name": "hmrc/self_employment_income_count_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 595000.0, + "name": "hmrc/self_employment_income_count_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 359000.0, + "name": "hmrc/self_employment_income_count_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 15000.0, + "name": "hmrc/self_employment_income_count_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 311000.0, + "name": "hmrc/self_employment_income_count_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 143000.0, + "name": "hmrc/self_employment_income_count_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4980000000.0, + "name": "hmrc/self_employment_income_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4810000000.0, + "name": "hmrc/self_employment_income_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3650000000.0, + "name": "hmrc/self_employment_income_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8030000000.0, + "name": "hmrc/self_employment_income_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 19500000000.0, + "name": "hmrc/self_employment_income_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4390000000.0, + "name": "hmrc/self_employment_income_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 15700000000.0, + "name": "hmrc/self_employment_income_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4840000000.0, + "name": "hmrc/self_employment_income_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 12600000000.0, + "name": "hmrc/self_employment_income_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8730000000.0, + "name": "hmrc/self_employment_income_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 6670000000.0, + "name": "hmrc/self_employment_income_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8220000000.0, + "name": "hmrc/self_employment_income_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5360000000.0, + "name": "hmrc/self_employment_income_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 74000.0, + "name": "hmrc/state_pension_count_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1140000.0, + "name": "hmrc/state_pension_count_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 21000.0, + "name": "hmrc/state_pension_count_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2050000.0, + "name": "hmrc/state_pension_count_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2000.0, + "name": "hmrc/state_pension_count_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 14000.0, + "name": "hmrc/state_pension_count_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2320000.0, + "name": "hmrc/state_pension_count_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8000.0, + "name": "hmrc/state_pension_count_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1160000.0, + "name": "hmrc/state_pension_count_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 568000.0, + "name": "hmrc/state_pension_count_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3000.0, + "name": "hmrc/state_pension_count_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 441000.0, + "name": "hmrc/state_pension_count_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 176000.0, + "name": "hmrc/state_pension_count_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 847000000.0, + "name": "hmrc/state_pension_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 11800000000.0, + "name": "hmrc/state_pension_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 265000000.0, + "name": "hmrc/state_pension_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 22200000000.0, + "name": "hmrc/state_pension_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 20000000.0, + "name": "hmrc/state_pension_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 179000000.0, + "name": "hmrc/state_pension_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 24900000000.0, + "name": "hmrc/state_pension_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 96000000.0, + "name": "hmrc/state_pension_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 12300000000.0, + "name": "hmrc/state_pension_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 6020000000.0, + "name": "hmrc/state_pension_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 43000000.0, + "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 4660000000.0, + "name": "hmrc/state_pension_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1890000000.0, + "name": "hmrc/state_pension_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7497928.0, + "name": "ons.population.age_0_9_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8161755.0, + "name": "ons.population.age_10_19_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8525289.0, + "name": "ons.population.age_20_29_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 9336791.0, + "name": "ons.population.age_30_39_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 8489468.0, + "name": "ons.population.age_40_49_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 9148143.0, + "name": "ons.population.age_50_59_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 7671378.0, + "name": "ons.population.age_60_69_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5963774.0, + "name": "ons.population.age_70_79_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2858964.0, + "name": "ons.population.age_80_89_by_region", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1742660.0, + "name": "ons.population.female_0_4", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2025209.0, + "name": "ons.population.female_10_14", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1947075.0, + "name": "ons.population.female_15_19", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2008105.0, + "name": "ons.population.female_20_24", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2232408.0, + "name": "ons.population.female_25_29", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2417082.0, + "name": "ons.population.female_30_34", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2396290.0, + "name": "ons.population.female_35_39", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2282889.0, + "name": "ons.population.female_40_44", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2056833.0, + "name": "ons.population.female_45_49", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2304569.0, + "name": "ons.population.female_50_54", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2360196.0, + "name": "ons.population.female_55_59", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1916898.0, + "name": "ons.population.female_5_9", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2133183.0, + "name": "ons.population.female_60_64", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1794961.0, + "name": "ons.population.female_65_69", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1633749.0, + "name": "ons.population.female_70_74", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1518990.0, + "name": "ons.population.female_75_79", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 985351.0, + "name": "ons.population.female_80_84", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 650117.0, + "name": "ons.population.female_85_89", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 408216.0, + "name": "ons.population.female_90_plus", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1829347.0, + "name": "ons.population.male_0_4", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2125078.0, + "name": "ons.population.male_10_14", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2064393.0, + "name": "ons.population.male_15_19", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2089437.0, + "name": "ons.population.male_20_24", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2195339.0, + "name": "ons.population.male_25_29", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2283116.0, + "name": "ons.population.male_30_34", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2240303.0, + "name": "ons.population.male_35_39", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2163337.0, + "name": "ons.population.male_40_44", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1986409.0, + "name": "ons.population.male_45_49", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2218309.0, + "name": "ons.population.male_50_54", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2265069.0, + "name": "ons.population.male_55_59", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2009023.0, + "name": "ons.population.male_5_9", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2048486.0, + "name": "ons.population.male_60_64", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1694748.0, + "name": "ons.population.male_65_69", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1486710.0, + "name": "ons.population.male_70_74", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1324325.0, + "name": "ons.population.male_75_79", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 777961.0, + "name": "ons.population.male_80_84", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 445535.0, + "name": "ons.population.male_85_89", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 203503.0, + "name": "ons.population.male_90_plus", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 68265209.0, + "name": "ons.population.uk_total", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "fixture_value": 557000.0, + "kind": "calibration_drift", + "ledger_value": 554243.0, + "name": "isc.private_school_students", + "period": 2023, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 1957550396058.5835, + "kind": "calibration_drift", + "ledger_value": 1976893000000.0, + "name": "ons.land.corporate_land_value", + "period": 2023, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 4798764603941.416, + "kind": "calibration_drift", + "ledger_value": 4383082000000.0, + "name": "ons.land.household_land_value", + "period": 2023, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 46000.0, + "kind": "calibration_drift", + "ledger_value": 46197.0, + "name": "ons.population.scotland_babies_under_1", + "period": 2023, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 900000.0, + "kind": "calibration_drift", + "ledger_value": 894695.0, + "name": "ons.population.scotland_children_under_16", + "period": 2023, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, + { + "fixture_value": 5900000.0, + "kind": "calibration_drift", + "ledger_value": 6089000.0, + "name": "ons.public_sector_employment", + "period": 2023, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + } + ], + "fixture_count": 149 +} diff --git a/packages/microcosm-build/src/microcosm/build/uk/parity_fixture_production_2023.json b/packages/microcosm-build/src/microcosm/build/uk/parity_fixture_production_2023.json new file mode 100644 index 000000000..6d00f42b5 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/parity_fixture_production_2023.json @@ -0,0 +1,2019 @@ +{ + "country": "uk", + "fixture": "production_2023", + "mapping": { + "mapped_count": 133, + "unmapped": [ + { + "name": "ons/household_land_value/NORTH_EAST", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/NORTH_WEST", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/YORKSHIRE", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/EAST_MIDLANDS", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/WEST_MIDLANDS", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/EAST_OF_ENGLAND", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/LONDON", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/SOUTH_EAST", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/SOUTH_WEST", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/WALES", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/household_land_value/SCOTLAND", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/tenure_england_owned_outright", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/tenure_england_owned_with_mortgage", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/tenure_england_rented_privately", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/tenure_england_social_rent", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + }, + { + "name": "ons/tenure_england_total", + "period": 2023, + "reason": "No registry_parity.mapped contract counterpart for the production 2023 target name." + } + ] + }, + "provenance": { + "release_id": "populace-uk-2023-dd68c73-4aa4b14-20260619T023711Z", + "source_path": "packages/microcosm-data/tests/fixtures/uk_june_2023/populace-uk-2023-dd68c73-4aa4b14-20260619T023711Z/calibration_diagnostics.json", + "source_sha256": "134fa8dd6da2f5a3b4f41d2c725ce9ec410c14eddce74cba3ed62d5b6dd1b90d", + "target_surface_sha256": "fb2fc115fbae53a501b8acbc1529f319b9e07b74478c7bd02d00c674d4c10022" + }, + "rows": [ + { + "contract_target_id": "isc.private_school_students", + "entity": "household", + "family": "obr", + "measure": "obr/private_school_students", + "metadata": { + "fixture": "production_2023" + }, + "name": "obr/private_school_students", + "period": 2023, + "source": "obr", + "value": 557000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_households_under_65", + "entity": "household", + "family": "ons", + "measure": "ons/lone_households_under_65", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/lone_households_under_65", + "period": 2023, + "source": "ons", + "value": 4166000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_households_over_65", + "entity": "household", + "family": "ons", + "measure": "ons/lone_households_over_65", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/lone_households_over_65", + "period": 2023, + "source": "ons", + "value": 4214000.0 + }, + { + "contract_target_id": "ons.household_composition.unrelated_adult_households", + "entity": "household", + "family": "ons", + "measure": "ons/unrelated_adult_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/unrelated_adult_households", + "period": 2023, + "source": "ons", + "value": 827000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_no_children_households", + "entity": "household", + "family": "ons", + "measure": "ons/couple_no_children_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/couple_no_children_households", + "period": 2023, + "source": "ons", + "value": 7956000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_under_3_children_households", + "entity": "household", + "family": "ons", + "measure": "ons/couple_under_3_children_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/couple_under_3_children_households", + "period": 2023, + "source": "ons", + "value": 5210000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_3_plus_children_households", + "entity": "household", + "family": "ons", + "measure": "ons/couple_3_plus_children_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/couple_3_plus_children_households", + "period": 2023, + "source": "ons", + "value": 907000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_non_dependent_children_only_households", + "entity": "household", + "family": "ons", + "measure": "ons/couple_non_dependent_children_only_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/couple_non_dependent_children_only_households", + "period": 2023, + "source": "ons", + "value": 1793000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_parent_dependent_children_households", + "entity": "household", + "family": "ons", + "measure": "ons/lone_parent_dependent_children_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/lone_parent_dependent_children_households", + "period": 2023, + "source": "ons", + "value": 1904000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_parent_non_dependent_children_households", + "entity": "household", + "family": "ons", + "measure": "ons/lone_parent_non_dependent_children_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/lone_parent_non_dependent_children_households", + "period": 2023, + "source": "ons", + "value": 1089000.0 + }, + { + "contract_target_id": "ons.household_composition.multi_family_households", + "entity": "household", + "family": "ons", + "measure": "ons/multi_family_households", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/multi_family_households", + "period": 2023, + "source": "ons", + "value": 290000.0 + }, + { + "contract_target_id": "ons.land.household_land_value", + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value", + "period": 2023, + "source": "ons", + "value": 4798764603941.416 + }, + { + "contract_target_id": "ons.land.corporate_land_value", + "entity": "household", + "family": "ons", + "measure": "ons/corporate_land_value", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/corporate_land_value", + "period": 2023, + "source": "ons", + "value": 1957550396058.5835 + }, + { + "contract_target_id": "ons.land.land_value", + "entity": "household", + "family": "ons", + "measure": "ons/land_value", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/land_value", + "period": 2023, + "source": "ons", + "value": 6756315000000.0 + }, + { + "contract_target_id": "ons.public_sector_employment", + "entity": "household", + "family": "ons", + "measure": "ons/public_sector_employment", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/public_sector_employment", + "period": 2023, + "source": "ons", + "value": 5900000.0 + }, + { + "contract_target_id": "ons.savings_interest_income", + "entity": "household", + "family": "ons", + "measure": "ons/savings_interest_income", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/savings_interest_income", + "period": 2023, + "source": "ons", + "value": 86040000000.0 + }, + { + "contract_target_id": "slc.support.maintenance_loan_recipients", + "entity": "household", + "family": "slc", + "measure": "slc/maintenance_loan_recipients", + "metadata": { + "fixture": "production_2023" + }, + "name": "slc/maintenance_loan_recipients", + "period": 2023, + "source": "slc", + "value": 1151607.0 + }, + { + "contract_target_id": "slc.support.maintenance_loan_spend", + "entity": "household", + "family": "slc", + "measure": "slc/maintenance_loan_spend", + "metadata": { + "fixture": "production_2023" + }, + "name": "slc/maintenance_loan_spend", + "period": 2023, + "source": "slc", + "value": 8594103415.0 + }, + { + "contract_target_id": "slc.support.parents_learning_allowance_recipients", + "entity": "household", + "family": "slc", + "measure": "slc/parents_learning_allowance_recipients", + "metadata": { + "fixture": "production_2023" + }, + "name": "slc/parents_learning_allowance_recipients", + "period": 2023, + "source": "slc", + "value": 89283.0 + }, + { + "contract_target_id": "slc.support.parents_learning_allowance_spend", + "entity": "household", + "family": "slc", + "measure": "slc/parents_learning_allowance_spend", + "metadata": { + "fixture": "production_2023" + }, + "name": "slc/parents_learning_allowance_spend", + "period": 2023, + "source": "slc", + "value": 153266251.0 + }, + { + "contract_target_id": "slc.support.adult_dependants_grant_recipients", + "entity": "household", + "family": "slc", + "measure": "slc/adult_dependants_grant_recipients", + "metadata": { + "fixture": "production_2023" + }, + "name": "slc/adult_dependants_grant_recipients", + "period": 2023, + "source": "slc", + "value": 20226.0 + }, + { + "contract_target_id": "slc.support.adult_dependants_grant_spend", + "entity": "household", + "family": "slc", + "measure": "slc/adult_dependants_grant_spend", + "metadata": { + "fixture": "production_2023" + }, + "name": "slc/adult_dependants_grant_spend", + "period": 2023, + "source": "slc", + "value": 54638997.0 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/NORTH_EAST", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/NORTH_EAST", + "period": 2023, + "source": "ons", + "value": 113814239475.71474 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/NORTH_WEST", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/NORTH_WEST", + "period": 2023, + "source": "ons", + "value": 402421888791.4934 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/YORKSHIRE", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/YORKSHIRE", + "period": 2023, + "source": "ons", + "value": 283675747954.8778 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/EAST_MIDLANDS", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/EAST_MIDLANDS", + "period": 2023, + "source": "ons", + "value": 290045387683.9658 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/WEST_MIDLANDS", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/WEST_MIDLANDS", + "period": 2023, + "source": "ons", + "value": 346703742992.981 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/EAST_OF_ENGLAND", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/EAST_OF_ENGLAND", + "period": 2023, + "source": "ons", + "value": 516403292240.49414 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/LONDON", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/LONDON", + "period": 2023, + "source": "ons", + "value": 1130653075012.1692 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/SOUTH_EAST", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/SOUTH_EAST", + "period": 2023, + "source": "ons", + "value": 842967388093.2286 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/SOUTH_WEST", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/SOUTH_WEST", + "period": 2023, + "source": "ons", + "value": 434617600950.541 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/WALES", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/WALES", + "period": 2023, + "source": "ons", + "value": 170639951561.47794 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/household_land_value/SCOTLAND", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/household_land_value/SCOTLAND", + "period": 2023, + "source": "ons", + "value": 266822289184.47226 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_0_9", + "period": 2023, + "source": "ons", + "value": 730000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_10_19", + "period": 2023, + "source": "ons", + "value": 745000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_20_29", + "period": 2023, + "source": "ons", + "value": 729000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_30_39", + "period": 2023, + "source": "ons", + "value": 868000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_40_49", + "period": 2023, + "source": "ons", + "value": 829000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_50_59", + "period": 2023, + "source": "ons", + "value": 873000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_60_69", + "period": 2023, + "source": "ons", + "value": 721000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_70_79", + "period": 2023, + "source": "ons", + "value": 612000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_age_80_89", + "period": 2023, + "source": "ons", + "value": 360000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_0_9", + "period": 2023, + "source": "ons", + "value": 535000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_10_19", + "period": 2023, + "source": "ons", + "value": 588000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_20_29", + "period": 2023, + "source": "ons", + "value": 614000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_30_39", + "period": 2023, + "source": "ons", + "value": 652000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_40_49", + "period": 2023, + "source": "ons", + "value": 605000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_50_59", + "period": 2023, + "source": "ons", + "value": 686000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_60_69", + "period": 2023, + "source": "ons", + "value": 572000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_70_79", + "period": 2023, + "source": "ons", + "value": 475000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/east_midlands_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/east_midlands_age_80_89", + "period": 2023, + "source": "ons", + "value": 260000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_0_9", + "period": 2023, + "source": "ons", + "value": 1047000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_10_19", + "period": 2023, + "source": "ons", + "value": 1043000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_20_29", + "period": 2023, + "source": "ons", + "value": 1429000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_30_39", + "period": 2023, + "source": "ons", + "value": 1545000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_40_49", + "period": 2023, + "source": "ons", + "value": 1280000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_50_59", + "period": 2023, + "source": "ons", + "value": 1086000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_60_69", + "period": 2023, + "source": "ons", + "value": 751000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_70_79", + "period": 2023, + "source": "ons", + "value": 484000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/london_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/london_age_80_89", + "period": 2023, + "source": "ons", + "value": 289000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_0_9", + "period": 2023, + "source": "ons", + "value": 283000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_10_19", + "period": 2023, + "source": "ons", + "value": 312000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_20_29", + "period": 2023, + "source": "ons", + "value": 333000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_30_39", + "period": 2023, + "source": "ons", + "value": 347000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_40_49", + "period": 2023, + "source": "ons", + "value": 314000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_50_59", + "period": 2023, + "source": "ons", + "value": 371000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_60_69", + "period": 2023, + "source": "ons", + "value": 341000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_70_79", + "period": 2023, + "source": "ons", + "value": 264000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_east_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_east_age_80_89", + "period": 2023, + "source": "ons", + "value": 145000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_0_9", + "period": 2023, + "source": "ons", + "value": 851000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_10_19", + "period": 2023, + "source": "ons", + "value": 906000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_20_29", + "period": 2023, + "source": "ons", + "value": 958000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_30_39", + "period": 2023, + "source": "ons", + "value": 1029000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_40_49", + "period": 2023, + "source": "ons", + "value": 914000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_50_59", + "period": 2023, + "source": "ons", + "value": 1018000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_60_69", + "period": 2023, + "source": "ons", + "value": 858000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_70_79", + "period": 2023, + "source": "ons", + "value": 680000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/north_west_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/north_west_age_80_89", + "period": 2023, + "source": "ons", + "value": 379000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_0_9", + "period": 2023, + "source": "ons", + "value": 235000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_10_19", + "period": 2023, + "source": "ons", + "value": 245000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_20_29", + "period": 2023, + "source": "ons", + "value": 224000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_30_39", + "period": 2023, + "source": "ons", + "value": 258000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_40_49", + "period": 2023, + "source": "ons", + "value": 247000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_50_59", + "period": 2023, + "source": "ons", + "value": 258000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_60_69", + "period": 2023, + "source": "ons", + "value": 217000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_70_79", + "period": 2023, + "source": "ons", + "value": 157000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/northern_ireland_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/northern_ireland_age_80_89", + "period": 2023, + "source": "ons", + "value": 89000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_0_9", + "period": 2023, + "source": "ons", + "value": 528000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_10_19", + "period": 2023, + "source": "ons", + "value": 600000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_20_29", + "period": 2023, + "source": "ons", + "value": 689000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_30_39", + "period": 2023, + "source": "ons", + "value": 717000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_40_49", + "period": 2023, + "source": "ons", + "value": 673000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_50_59", + "period": 2023, + "source": "ons", + "value": 793000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_60_69", + "period": 2023, + "source": "ons", + "value": 702000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_70_79", + "period": 2023, + "source": "ons", + "value": 520000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_age_80_89", + "period": 2023, + "source": "ons", + "value": 282000.0 + }, + { + "contract_target_id": "ons.population.scotland_children_under_16", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_children_under_16", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_children_under_16", + "period": 2023, + "source": "ons", + "value": 900000.0 + }, + { + "contract_target_id": "ons.population.scotland_babies_under_1", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_babies_under_1", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_babies_under_1", + "period": 2023, + "source": "ons", + "value": 46000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_0_9", + "period": 2023, + "source": "ons", + "value": 1044000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_10_19", + "period": 2023, + "source": "ons", + "value": 1119000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_20_29", + "period": 2023, + "source": "ons", + "value": 1062000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_30_39", + "period": 2023, + "source": "ons", + "value": 1250000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_40_49", + "period": 2023, + "source": "ons", + "value": 1241000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_50_59", + "period": 2023, + "source": "ons", + "value": 1296000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_60_69", + "period": 2023, + "source": "ons", + "value": 1052000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_70_79", + "period": 2023, + "source": "ons", + "value": 882000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_east_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_east_age_80_89", + "period": 2023, + "source": "ons", + "value": 531000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_0_9", + "period": 2023, + "source": "ons", + "value": 579000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_10_19", + "period": 2023, + "source": "ons", + "value": 650000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_20_29", + "period": 2023, + "source": "ons", + "value": 675000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_30_39", + "period": 2023, + "source": "ons", + "value": 724000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_40_49", + "period": 2023, + "source": "ons", + "value": 686000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_50_59", + "period": 2023, + "source": "ons", + "value": 800000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_60_69", + "period": 2023, + "source": "ons", + "value": 716000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_70_79", + "period": 2023, + "source": "ons", + "value": 630000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/south_west_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/south_west_age_80_89", + "period": 2023, + "source": "ons", + "value": 369000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_0_9", + "period": 2023, + "source": "ons", + "value": 326000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_10_19", + "period": 2023, + "source": "ons", + "value": 364000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_20_29", + "period": 2023, + "source": "ons", + "value": 378000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_30_39", + "period": 2023, + "source": "ons", + "value": 398000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_40_49", + "period": 2023, + "source": "ons", + "value": 364000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_50_59", + "period": 2023, + "source": "ons", + "value": 436000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_60_69", + "period": 2023, + "source": "ons", + "value": 393000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_70_79", + "period": 2023, + "source": "ons", + "value": 327000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/wales_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/wales_age_80_89", + "period": 2023, + "source": "ons", + "value": 181000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_0_9", + "period": 2023, + "source": "ons", + "value": 703000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_10_19", + "period": 2023, + "source": "ons", + "value": 747000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_20_29", + "period": 2023, + "source": "ons", + "value": 753000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_30_39", + "period": 2023, + "source": "ons", + "value": 813000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_40_49", + "period": 2023, + "source": "ons", + "value": 739000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_50_59", + "period": 2023, + "source": "ons", + "value": 805000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_60_69", + "period": 2023, + "source": "ons", + "value": 661000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_70_79", + "period": 2023, + "source": "ons", + "value": 542000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/west_midlands_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/west_midlands_age_80_89", + "period": 2023, + "source": "ons", + "value": 321000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_0_9", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_0_9", + "period": 2023, + "source": "ons", + "value": 621000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_10_19", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_10_19", + "period": 2023, + "source": "ons", + "value": 669000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_20_29", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_20_29", + "period": 2023, + "source": "ons", + "value": 713000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_30_39", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_30_39", + "period": 2023, + "source": "ons", + "value": 745000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_40_49", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_40_49", + "period": 2023, + "source": "ons", + "value": 668000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_50_59", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_50_59", + "period": 2023, + "source": "ons", + "value": 751000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_60_69", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_60_69", + "period": 2023, + "source": "ons", + "value": 635000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_70_79", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_70_79", + "period": 2023, + "source": "ons", + "value": 510000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "measure": "ons/yorkshire_and_the_humber_age_80_89", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/yorkshire_and_the_humber_age_80_89", + "period": 2023, + "source": "ons", + "value": 287000.0 + }, + { + "contract_target_id": "ons.population.scotland_households_3plus_children", + "entity": "household", + "family": "ons", + "measure": "ons/scotland_households_3plus_children", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/scotland_households_3plus_children", + "period": 2023, + "source": "ons", + "value": 82000.0 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/tenure_england_owned_outright", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/tenure_england_owned_outright", + "period": 2023, + "source": "ons", + "value": 8298342.0 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/tenure_england_owned_with_mortgage", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/tenure_england_owned_with_mortgage", + "period": 2023, + "source": "ons", + "value": 7597225.0 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/tenure_england_rented_privately", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/tenure_england_rented_privately", + "period": 2023, + "source": "ons", + "value": 5251573.0 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/tenure_england_social_rent", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/tenure_england_social_rent", + "period": 2023, + "source": "ons", + "value": 4247906.0 + }, + { + "entity": "household", + "family": "ons", + "measure": "ons/tenure_england_total", + "metadata": { + "fixture": "production_2023" + }, + "name": "ons/tenure_england_total", + "period": 2023, + "source": "ons", + "value": 25395046.0 + } + ], + "schema_version": 1 +} diff --git a/packages/microcosm-build/src/microcosm/build/uk/registry_parity_fixture_2025.json b/packages/microcosm-build/src/microcosm/build/uk/registry_parity_fixture_2025.json new file mode 100644 index 000000000..ea8f2f9ba --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/registry_parity_fixture_2025.json @@ -0,0 +1,10334 @@ +{ + "country": "uk", + "fixture": "incumbent_2025", + "ledger_side_additions": [ + { + "contract_target_id": "dwp.uc.two_child_limit.households_affected", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/households_affected", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 453600.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_in_affected_households", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/children_in_affected_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 1613980.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_affected", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/children_affected", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 580400.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.households_3_children", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/3_children_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 283290.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_in_3_children_households", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/3_children_households_total_children", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 849860.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.households_4_children", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/4_children_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 115630.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_in_4_children_households", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/4_children_households_total_children", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 462520.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.households_5_children", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/5_children_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 36590.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_in_5_children_households", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/5_children_households_total_children", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 182940.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.households_6_plus_children", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/6_children_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 18090.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_in_6_plus_children_households", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/6_children_households_total_children", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 118670.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.households_claimant_pip", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/adult_pip_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 62260.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_claimant_pip", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/adult_pip_children", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 225320.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.households_disabled_child_element", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/disabled_child_element_households", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 124560.0 + }, + { + "contract_target_id": "dwp.uc.two_child_limit.children_disabled_child_element", + "geographic_level": "national", + "name": "dwp/uc/two_child_limit/disabled_child_element_children", + "period": 2026, + "reason": "Incumbent resolves this two-child-limit target only at 2026; Ledger activates the April-2025 publication at calibration period 2025.", + "resolved_from_year": 2026, + "source": "dwp", + "value": 462660.0 + } + ], + "provenance": { + "extraction_utc": "2026-08-20T08:23:27.636917+00:00", + "method": "level-union name-dedup per build_loss_matrix.create_target_matrix:93-103; values via build_loss_matrix._resolve_value at years 2025 and 2026; network-dependent get_targets() sources fetched live at extraction time", + "pinned_ref": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3", + "runtime_version": "3.13.14", + "source_repository": "retired UK data package" + }, + "rows": [ + { + "contract_target_id": "dwp.pip.daily_living_standard_claimants", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.pip.daily_living_standard_claimants", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/pip_dl_standard_claimants", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1283000.0 + }, + { + "contract_target_id": "dwp.pip.daily_living_enhanced_claimants", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.pip.daily_living_enhanced_claimants", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/pip_dl_enhanced_claimants", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1608000.0 + }, + { + "contract_target_id": "dwp.esa_claimants", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.esa_claimants", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/esa_claimants", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 999000.0 + }, + { + "contract_target_id": "dwp.esa_contrib_claimants", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.esa_contrib_claimants", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/esa_contrib_claimants", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 620000.0 + }, + { + "contract_target_id": "dwp.esa_income_claimants", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.esa_income_claimants", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/esa_income_claimants", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 180000.0 + }, + { + "contract_target_id": "dwp.jsa_claimants", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.jsa_claimants", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/jsa_claimants", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 71000.0 + }, + { + "contract_target_id": "dwp.benefit_cap.capped_households", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.benefit_cap.capped_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/benefit_capped_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 110637.0 + }, + { + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp/benefit_cap_total_reduction", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/benefit_cap_total_reduction", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 320866000.0 + }, + { + "contract_target_id": "dwp.uc.scotland_households_child_under_1", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.scotland_households_child_under_1", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/scotland_uc_households_child_under_1", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 14000.0 + }, + { + "contract_target_id": "dwp.uc.households_children_1", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_children_1", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_with_1_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1222944.0 + }, + { + "contract_target_id": "dwp.uc.households_children_2", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_children_2", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_with_2_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1058967.0 + }, + { + "contract_target_id": "dwp.uc.households_children_3", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_children_3", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_with_3_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 473500.0 + }, + { + "contract_target_id": "dwp.uc.households_children_4", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_children_4", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_with_4_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 166790.0 + }, + { + "contract_target_id": "dwp.uc.households_children_5_or_more", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_children_5_or_more", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_with_5+_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 75910.0 + }, + { + "contract_target_id": "dwp.uc.households_single_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_single_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_single_no_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 2868011.0 + }, + { + "contract_target_id": "dwp.uc.households_single_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_single_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_single_with_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 2156879.0 + }, + { + "contract_target_id": "dwp.uc.households_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_couple_no_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 231368.0 + }, + { + "contract_target_id": "dwp.uc.households_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/claimants_couple_with_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 839379.0 + }, + { + "contract_target_id": "dwp.uc.households", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc/households", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 6700000.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 102312.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 24639.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 7610.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 18714.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 120819.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 34670.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 8906.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 22489.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 173925.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 43623.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 11750.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 26734.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 375706.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 55622.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 10802.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 29189.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 200713.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 67901.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 12168.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 33137.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 107860.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 89314.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 12461.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 35834.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 144036.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 118641.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 15787.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 38338.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 377221.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 99069.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 14248.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 40685.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 341138.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 102251.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 17559.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 40564.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 95698.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 126949.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 12370.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 42188.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 106663.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 131129.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 15175.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 41520.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 181180.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 131289.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 12297.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 41159.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 189861.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 119355.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 17828.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 42515.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 129174.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 130802.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 14427.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 38527.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 84690.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 141848.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 11892.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 38894.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 46244.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 136835.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 9463.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 38659.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 26481.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 107556.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 8443.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 34318.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 18143.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 86616.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 5770.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 30116.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 12325.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 80294.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 3485.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 28519.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 9555.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 70309.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 2360.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 26014.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 6230.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 50510.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1815.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 23159.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 5884.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 42522.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1186.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 20618.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 5362.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 33508.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 935.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 17493.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1786.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 27063.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 632.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 15437.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1491.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 21663.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 580.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 12836.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_single", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_single", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_nan_to_nan", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 3518.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_lone_parent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_nan_to_nan", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 82905.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_no_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_nan_to_nan", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 1424.0 + }, + { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "entity": "household", + "family": "dwp", + "geographic_level": "national", + "measure": "dwp.uc.payment_distribution_couple_with_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_nan_to_nan", + "period": 2025, + "resolved_from_year": 2025, + "source": "dwp", + "value": 61727.0 + }, + { + "contract_target_id": "hmrc.cgt.gains_total", + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc.cgt.gains_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_total", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 67727478991.59665 + }, + { + "contract_target_id": "hmrc.cgt.taxpayers_total", + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc.cgt.taxpayers_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 378000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_12300", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_12300", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 79000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_12300", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_12300", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 1457322689.0756304 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_25000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_25000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 74000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_25000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_25000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 2718348739.4957986 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_50000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_50000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 53000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_50000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_50000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 3834464705.8823533 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_100000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_100000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 37000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_100000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_100000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 5805652941.176472 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_250000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_250000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 14000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_250000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_250000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 4898166386.554623 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_500000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_500000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 8000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_500000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_500000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 5863205882.3529415 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_1000000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_1000000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 5000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_1000000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_1000000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 6567201680.67227 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_2000000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_2000000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 3000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_2000000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_2000000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 9443821008.403362 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/cgt_taxpayers_band_5000000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/cgt_taxpayers_band_5000000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 2000.0 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/capital_gains_band_5000000", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/capital_gains_band_5000000", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 23343884033.61345 + }, + { + "entity": "household", + "family": "hmrc", + "geographic_level": "national", + "measure": "hmrc/salary_sacrifice_contributions", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "hmrc/salary_sacrifice_contributions", + "period": 2025, + "resolved_from_year": 2025, + "source": "hmrc", + "value": 24720000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 16900000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1360000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4810000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 444000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 11800000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1140000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4350000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1070000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1273000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 101000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 175000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_12_570_to_15_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 115000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 48600000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3100000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 8030000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 651000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 22200000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2050000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 13600000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2140000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3211000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 232000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 855000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_15_000_to_20_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 372000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 172000000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 7470000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 15700000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 961000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 24900000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2320000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 30200000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2660000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 7258000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 431000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3330000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_20_000_to_30_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 843000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 170000000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 5370000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 12600000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 595000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 12300000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1160000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 24900000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1450000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 7220000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 364000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4700000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_30_000_to_40_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 667000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 139000000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3500000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 8730000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 359000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 6020000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 568000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 16900000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 779000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 7182000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 325000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 8400000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_40_000_to_50_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 627000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 174000000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3430000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 8220000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 311000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4660000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 441000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 17400000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 643000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 10260000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 397000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 12500000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_50_000_to_70_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 643000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 118000000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1640000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 5360000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 143000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1890000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 176000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 9470000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 259000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 7163000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 226000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 9440000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_70_000_to_100_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 336000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 82300000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 791000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4980000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 85000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 847000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 74000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 5430000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 109000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4845000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 137000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 6870000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_100_000_to_150_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 222000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 39200000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 264000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3650000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 40000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 265000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 21000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1810000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 29000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2185000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 54000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3450000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_150_000_to_200_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 92000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 36600000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 180000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4390000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 34000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 179000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 14000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1570000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 20000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1995000000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 41000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3700000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_200_000_to_300_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 75000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 29000000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 93000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4840000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 21000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 96000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 8000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1120000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 10000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 1453500000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 23000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3430000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_300_000_to_500_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 49000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 23100000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 44000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 6670000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 15000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 43000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 640000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 4000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 900600000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 13000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 3820000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 32000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 35500000000.0 + }, + { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/employment_income_count_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 21000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 19500000000.0 + }, + { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.self_employment_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/self_employment_income_count_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 11000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 20000000.0 + }, + { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.state_pension.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/state_pension_count_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 370000000.0 + }, + { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.private_pension_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/private_pension_income_count_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 2000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 834100000.0 + }, + { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.property_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/property_income_count_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 7000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.amount_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 11100000000.0 + }, + { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "entity": "household", + "family": "hmrc_spi", + "geographic_level": "national", + "measure": "hmrc.spi.dividend_income.count_by_total_income_band", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "hmrc/dividend_income_count_income_band_1_000_000_to_inf", + "period": 2025, + "resolved_from_year": 2024, + "source": "hmrc_spi", + "value": 19000.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "housing/total_mortgage", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "housing/total_mortgage", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 99000000000.0 + }, + { + "entity": "household", + "family": "ehs", + "geographic_level": "national", + "measure": "housing/rent_private", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "housing/rent_private", + "period": 2025, + "resolved_from_year": 2025, + "source": "ehs", + "value": 89035200000.0 + }, + { + "entity": "household", + "family": "ehs", + "geographic_level": "national", + "measure": "housing/rent_social", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "housing/rent_social", + "period": 2025, + "resolved_from_year": 2025, + "source": "ehs", + "value": 30680000000.0 + }, + { + "entity": "household", + "family": "nts", + "geographic_level": "national", + "measure": "nts/households_no_vehicle", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "nts/households_no_vehicle", + "period": 2025, + "resolved_from_year": 2024, + "source": "nts", + "value": 6512000.0 + }, + { + "entity": "household", + "family": "nts", + "geographic_level": "national", + "measure": "nts/households_one_vehicle", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "nts/households_one_vehicle", + "period": 2025, + "resolved_from_year": 2024, + "source": "nts", + "value": 13024000.0 + }, + { + "entity": "household", + "family": "nts", + "geographic_level": "national", + "measure": "nts/households_two_plus_vehicles", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "nts/households_two_plus_vehicles", + "period": 2025, + "resolved_from_year": 2024, + "source": "nts", + "value": 10064000.0 + }, + { + "contract_target_id": "obr.income_tax", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.income_tax", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/income_tax", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 331437583074.4429 + }, + { + "contract_target_id": "obr.ni", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.ni", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/ni", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 200081395082.7125 + }, + { + "contract_target_id": "obr.vat", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.vat", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/vat", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 180168938685.41794 + }, + { + "contract_target_id": "obr.fuel_duties", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.fuel_duties", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/fuel_duties", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 24241874775.213375 + }, + { + "contract_target_id": "obr.capital_gains_tax", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.capital_gains_tax", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/capital_gains_tax", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 21801546197.09165 + }, + { + "contract_target_id": "obr.sdlt", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.sdlt", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/sdlt", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 15406516698.785578 + }, + { + "contract_target_id": "obr.ni_employee", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.ni_employee", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/ni_employee", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 49544363784.26465 + }, + { + "contract_target_id": "obr.ni_employer", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.ni_employer", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/ni_employer", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 145324007512.71753 + }, + { + "contract_target_id": "obr.ni_self_employed", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.ni_self_employed", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/ni_self_employed", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 2902816090.4147716 + }, + { + "contract_target_id": "obr.council_tax", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.council_tax", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/council_tax", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 50925163826.30539 + }, + { + "contract_target_id": "obr.council_tax_england", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.council_tax_england", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/council_tax_england", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 44117237614.71528 + }, + { + "contract_target_id": "obr.council_tax_scotland", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.council_tax_scotland", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/council_tax_scotland", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 3051227494.93594 + }, + { + "contract_target_id": "obr.council_tax_wales", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.council_tax_wales", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/council_tax_wales", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 2400769752.36827 + }, + { + "contract_target_id": "obr.domestic_rates", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.domestic_rates", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/domestic_rates", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 494000000.0 + }, + { + "contract_target_id": "obr.housing_benefit", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.housing_benefit", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/housing_benefit", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 12103254163.788864 + }, + { + "contract_target_id": "obr.pip", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.pip", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/pip", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 36910059270.5278 + }, + { + "contract_target_id": "obr.esa", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.esa", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/esa", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 7206287181.538654 + }, + { + "contract_target_id": "obr.attendance_allowance", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.attendance_allowance", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/attendance_allowance", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 8492497075.074617 + }, + { + "contract_target_id": "obr.pension_credit", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.pension_credit", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/pension_credit", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 6146422389.476461 + }, + { + "contract_target_id": "obr.carers_allowance", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.carers_allowance", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/carers_allowance", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 4569403813.760573 + }, + { + "contract_target_id": "obr.statutory_maternity_pay", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.statutory_maternity_pay", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/statutory_maternity_pay", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 3194800881.520547 + }, + { + "contract_target_id": "obr.winter_fuel_allowance", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.winter_fuel_allowance", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/winter_fuel_allowance", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 1911040880.4619167 + }, + { + "contract_target_id": "obr.universal_credit_in_cap", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.universal_credit_in_cap", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/universal_credit_in_cap", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 66410800011.47837 + }, + { + "contract_target_id": "obr.child_benefit", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.child_benefit", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/child_benefit", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 13389272724.45089 + }, + { + "contract_target_id": "obr.state_pension", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.state_pension", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/state_pension", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 146185954351.57382 + }, + { + "contract_target_id": "obr.jobseekers_allowance", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.jobseekers_allowance", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/jobseekers_allowance", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 280558748.04472804 + }, + { + "contract_target_id": "obr.universal_credit_outside_cap", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.universal_credit_outside_cap", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/universal_credit_outside_cap", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 12875549128.065746 + }, + { + "contract_target_id": "obr.tv_licence_fee", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "obr.tv_licence_fee", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/tv_licence_fee", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 3872000000.0 + }, + { + "contract_target_id": "isc.private_school_students", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "isc.private_school_students", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/private_school_students", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 557000.0 + }, + { + "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employee", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "hmrc.salary_sacrifice.nics_relief_employee", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/salary_sacrifice_employee_ni_relief", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 1236000000.0 + }, + { + "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employer", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "hmrc.salary_sacrifice.nics_relief_employer", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/salary_sacrifice_employer_ni_relief", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 2987000000.0 + }, + { + "contract_target_id": "hmrc.salary_sacrifice.users_total", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "hmrc.salary_sacrifice.users_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/salary_sacrifice_users_total", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 7884800.0 + }, + { + "contract_target_id": "hmrc.salary_sacrifice.users_below_cap", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "hmrc.salary_sacrifice.users_below_cap", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/salary_sacrifice_users_below_cap", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 4403200.0 + }, + { + "contract_target_id": "hmrc.salary_sacrifice.users_above_cap", + "entity": "household", + "family": "obr", + "geographic_level": "national", + "measure": "hmrc.salary_sacrifice.users_above_cap", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "obr/salary_sacrifice_users_above_cap", + "period": 2025, + "resolved_from_year": 2025, + "source": "obr", + "value": 3379200.0 + }, + { + "contract_target_id": "ons.population.uk_total", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.uk_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/uk_population", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 69502341.0 + }, + { + "contract_target_id": "ons.population.female_0_4", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_0_4", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_0_4", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1698816.0 + }, + { + "contract_target_id": "ons.population.female_5_9", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_5_9", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_5_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1918180.0 + }, + { + "contract_target_id": "ons.population.female_10_14", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_10_14", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_10_14", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2041879.0 + }, + { + "contract_target_id": "ons.population.female_15_19", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_15_19", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_15_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2036402.0 + }, + { + "contract_target_id": "ons.population.female_20_24", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_20_24", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_20_24", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2033478.0 + }, + { + "contract_target_id": "ons.population.female_25_29", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_25_29", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_25_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2258028.0 + }, + { + "contract_target_id": "ons.population.female_30_34", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_30_34", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_30_34", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2443559.0 + }, + { + "contract_target_id": "ons.population.female_35_39", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_35_39", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_35_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2497122.0 + }, + { + "contract_target_id": "ons.population.female_40_44", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_40_44", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_40_44", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2356214.0 + }, + { + "contract_target_id": "ons.population.female_45_49", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_45_49", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_45_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2135556.0 + }, + { + "contract_target_id": "ons.population.female_50_54", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_50_54", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_50_54", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2206473.0 + }, + { + "contract_target_id": "ons.population.female_55_59", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_55_59", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_55_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2340737.0 + }, + { + "contract_target_id": "ons.population.female_60_64", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_60_64", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_60_64", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2248908.0 + }, + { + "contract_target_id": "ons.population.female_65_69", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_65_69", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_65_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1890892.0 + }, + { + "contract_target_id": "ons.population.female_70_74", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_70_74", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_70_74", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1619328.0 + }, + { + "contract_target_id": "ons.population.female_75_79", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_75_79", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_75_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1575830.0 + }, + { + "contract_target_id": "ons.population.female_80_84", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_80_84", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_80_84", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1064043.0 + }, + { + "contract_target_id": "ons.population.female_85_89", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.female_85_89", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/female_85_90", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 766765.0 + }, + { + "contract_target_id": "ons.population.male_0_4", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_0_4", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_0_4", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1784490.0 + }, + { + "contract_target_id": "ons.population.male_5_9", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_5_9", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_5_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2011903.0 + }, + { + "contract_target_id": "ons.population.male_10_14", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_10_14", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_10_14", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2143309.0 + }, + { + "contract_target_id": "ons.population.male_15_19", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_15_19", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_15_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2149930.0 + }, + { + "contract_target_id": "ons.population.male_20_24", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_20_24", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_20_24", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2136737.0 + }, + { + "contract_target_id": "ons.population.male_25_29", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_25_29", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_25_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2246892.0 + }, + { + "contract_target_id": "ons.population.male_30_34", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_30_34", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_30_34", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2323977.0 + }, + { + "contract_target_id": "ons.population.male_35_39", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_35_39", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_35_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2325815.0 + }, + { + "contract_target_id": "ons.population.male_40_44", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_40_44", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_40_44", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2208064.0 + }, + { + "contract_target_id": "ons.population.male_45_49", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_45_49", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_45_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2040636.0 + }, + { + "contract_target_id": "ons.population.male_50_54", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_50_54", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_50_54", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2119462.0 + }, + { + "contract_target_id": "ons.population.male_55_59", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_55_59", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_55_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2234921.0 + }, + { + "contract_target_id": "ons.population.male_60_64", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_60_64", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_60_64", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2138720.0 + }, + { + "contract_target_id": "ons.population.male_65_69", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_65_69", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_65_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1785048.0 + }, + { + "contract_target_id": "ons.population.male_70_74", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_70_74", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_70_74", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1472190.0 + }, + { + "contract_target_id": "ons.population.male_75_79", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_75_79", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_75_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1370172.0 + }, + { + "contract_target_id": "ons.population.male_80_84", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_80_84", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_80_84", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 853423.0 + }, + { + "contract_target_id": "ons.population.male_85_89", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.population.male_85_89", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/male_85_90", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 524918.0 + }, + { + "contract_target_id": "ons.household_composition.lone_households_under_65", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.lone_households_under_65", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/lone_households_under_65", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 4316000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_households_over_65", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.lone_households_over_65", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/lone_households_over_65", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 4254000.0 + }, + { + "contract_target_id": "ons.household_composition.unrelated_adult_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.unrelated_adult_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/unrelated_adult_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 813000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_no_children_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.couple_no_children_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/couple_no_children_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 8119000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_under_3_children_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.couple_under_3_children_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/couple_under_3_children_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 5439000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_3_plus_children_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.couple_3_plus_children_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/couple_3_plus_children_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 931000.0 + }, + { + "contract_target_id": "ons.household_composition.couple_non_dependent_children_only_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.couple_non_dependent_children_only_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/couple_non_dependent_children_only_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1848000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_parent_dependent_children_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.lone_parent_dependent_children_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/lone_parent_dependent_children_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1835000.0 + }, + { + "contract_target_id": "ons.household_composition.lone_parent_non_dependent_children_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.lone_parent_non_dependent_children_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/lone_parent_non_dependent_children_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1204000.0 + }, + { + "contract_target_id": "ons.household_composition.multi_family_households", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.household_composition.multi_family_households", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/multi_family_households", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 244000.0 + }, + { + "contract_target_id": "ons.land.household_land_value", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.land.household_land_value", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 5042871548763.499 + }, + { + "contract_target_id": "ons.land.corporate_land_value", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.land.corporate_land_value", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/corporate_land_value", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 2057128451236.5015 + }, + { + "contract_target_id": "ons.land.land_value", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.land.land_value", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/land_value", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 7100000000000.0 + }, + { + "contract_target_id": "ons.public_sector_employment", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.public_sector_employment", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "ons/public_sector_employment", + "period": 2025, + "resolved_from_year": 2024, + "source": "ons", + "value": 5940000.0 + }, + { + "contract_target_id": "ons.savings_interest_income", + "entity": "household", + "family": "ons", + "geographic_level": "national", + "measure": "ons.savings_interest_income", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/savings_interest_income", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 95503000000.0 + }, + { + "contract_target_id": "slc.borrowers.plan_2_above_threshold", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.borrowers.plan_2_above_threshold", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/plan_2_borrowers_above_threshold", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 3985000.0 + }, + { + "contract_target_id": "slc.borrowers.plan_2_liable", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.borrowers.plan_2_liable", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/plan_2_borrowers_liable", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 8940000.0 + }, + { + "contract_target_id": "slc.borrowers.plan_5_above_threshold", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.borrowers.plan_5_above_threshold", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/plan_5_borrowers_above_threshold", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 0.0 + }, + { + "contract_target_id": "slc.borrowers.plan_5_liable", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.borrowers.plan_5_liable", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/plan_5_borrowers_liable", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 10000.0 + }, + { + "contract_target_id": "slc.support.maintenance_loan_recipients", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.support.maintenance_loan_recipients", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/maintenance_loan_recipients", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 1159761.0 + }, + { + "contract_target_id": "slc.support.maintenance_loan_spend", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.support.maintenance_loan_spend", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/maintenance_loan_spend", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 8591659718.0 + }, + { + "contract_target_id": "slc.support.parents_learning_allowance_recipients", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.support.parents_learning_allowance_recipients", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/parents_learning_allowance_recipients", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 99645.0 + }, + { + "contract_target_id": "slc.support.parents_learning_allowance_spend", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.support.parents_learning_allowance_spend", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/parents_learning_allowance_spend", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 181421659.0 + }, + { + "contract_target_id": "slc.support.adult_dependants_grant_recipients", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.support.adult_dependants_grant_recipients", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/adult_dependants_grant_recipients", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 18611.0 + }, + { + "contract_target_id": "slc.support.adult_dependants_grant_spend", + "entity": "household", + "family": "slc", + "geographic_level": "national", + "measure": "slc.support.adult_dependants_grant_spend", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/adult_dependants_grant_spend", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 55364917.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/NORTH_EAST", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/NORTH_EAST", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 119603822538.99867 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/NORTH_WEST", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/NORTH_WEST", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 422892569458.29254 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/YORKSHIRE", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/YORKSHIRE", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 298105966119.05054 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/EAST_MIDLANDS", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/EAST_MIDLANDS", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 304799621177.5439 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/WEST_MIDLANDS", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/WEST_MIDLANDS", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 364340113693.65784 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/EAST_OF_ENGLAND", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/EAST_OF_ENGLAND", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 542672059385.554 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/LONDON", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/LONDON", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1188167933642.289 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/SOUTH_EAST", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/SOUTH_EAST", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 885848048153.7532 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/SOUTH_WEST", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/SOUTH_WEST", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 456726035827.05096 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/WALES", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/WALES", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 179320185054.4999 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons/household_land_value/SCOTLAND", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/household_land_value/SCOTLAND", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 280395193712.8084 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 726000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 741000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 749000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 890000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 851000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 867000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 746000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 643000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 379000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 532000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 585000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 632000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 669000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 621000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 681000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 592000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 500000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/east_midlands_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 273000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1042000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1038000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1470000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1585000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1314000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1078000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 778000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 509000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/london_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 304000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 281000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 311000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 343000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 356000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 323000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 369000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 353000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 278000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_east_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 153000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 847000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 901000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 986000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1056000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 938000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1011000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 888000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 715000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/north_west_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 399000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 234000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 244000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 230000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 264000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 254000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 257000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 224000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 165000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/northern_ireland_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 93000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 526000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 597000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 709000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 736000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 691000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 788000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 727000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 546000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 297000.0 + }, + { + "contract_target_id": "ons.population.scotland_children_under_16", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.scotland_children_under_16", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_children_under_16", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 892000.0 + }, + { + "contract_target_id": "ons.population.scotland_babies_under_1", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.scotland_babies_under_1", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_babies_under_1", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 46000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1039000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1114000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1093000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1283000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1273000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1287000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 1089000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 927000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_east_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 559000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 576000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 646000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 694000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 743000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 704000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 794000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 741000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 662000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/south_west_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 388000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 325000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 362000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 389000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 408000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 374000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 432000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 407000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 343000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/wales_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 190000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 700000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 743000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 774000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 834000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 758000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 800000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 685000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 570000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/west_midlands_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 337000.0 + }, + { + "contract_target_id": "ons.population.age_0_9_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_0_9_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_0_9", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 618000.0 + }, + { + "contract_target_id": "ons.population.age_10_19_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_10_19_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_10_19", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 666000.0 + }, + { + "contract_target_id": "ons.population.age_20_29_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_20_29_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_20_29", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 733000.0 + }, + { + "contract_target_id": "ons.population.age_30_39_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_30_39_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_30_39", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 764000.0 + }, + { + "contract_target_id": "ons.population.age_40_49_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_40_49_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_40_49", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 686000.0 + }, + { + "contract_target_id": "ons.population.age_50_59_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_50_59_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_50_59", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 745000.0 + }, + { + "contract_target_id": "ons.population.age_60_69_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_60_69_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_60_69", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 658000.0 + }, + { + "contract_target_id": "ons.population.age_70_79_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_70_79_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_70_79", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 536000.0 + }, + { + "contract_target_id": "ons.population.age_80_89_by_region", + "entity": "household", + "family": "ons", + "geographic_level": "region", + "measure": "ons.population.age_80_89_by_region", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/yorkshire_and_the_humber_age_80_89", + "period": 2025, + "resolved_from_year": 2025, + "source": "ons", + "value": 302000.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 667540.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 206790.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 196180.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 113460.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 61090.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 26600.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 14600.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1570.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_EAST/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1287830.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1386260.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 705450.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 616070.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 363970.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 216990.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 104330.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 65750.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 7350.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/NORTH_WEST/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 3466140.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1070830.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 514190.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 432290.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 249530.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 158600.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 75690.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 42180.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 3770.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/YORKSHIRE/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 2547080.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 804340.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 505610.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 403840.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 247850.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 154970.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 73920.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 39400.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 3480.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_MIDLANDS/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 2233400.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 786010.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 654140.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 526260.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 302500.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 193700.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 105630.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 62780.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 6170.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WEST_MIDLANDS/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 2637190.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 403180.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 598950.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 739570.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 506540.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 313840.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 172960.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 113720.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 14830.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/EAST_OF_ENGLAND/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 2863600.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 144550.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 499130.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1040280.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 975750.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 585130.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 298920.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 225170.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 68500.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/LONDON/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 3837430.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 367610.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 687430.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1075940.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 843560.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 551730.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 337260.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 265610.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 40390.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_EAST/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 4169520.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 473020.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 644890.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 624030.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 432070.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 292090.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 147920.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 81960.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 8430.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SOUTH_WEST/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 2704390.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 215380.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 307070.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 323220.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 241220.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 200840.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 122650.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 55190.0 + }, + { + "contract_target_id": "voa.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 13190.0 + }, + { + "contract_target_id": "voa.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "voa.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/WALES/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 1484410.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_a", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_a", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/A", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 498707.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_b", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_b", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/B", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 583705.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_c", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_c", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/C", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 426388.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_d", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_d", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/D", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 369621.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_e", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_e", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/E", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 366881.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_f", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_f", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/F", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 221282.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_g", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_g", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/G", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 142084.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.band_h", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.band_h", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/H", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 14481.0 + }, + { + "contract_target_id": "scotgov.council_tax_stock.total", + "entity": "household", + "family": "voa", + "geographic_level": "region", + "measure": "scotgov.council_tax_stock.total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "voa/council_tax/SCOTLAND/total", + "period": 2025, + "resolved_from_year": 2025, + "source": "voa", + "value": 2623149.0 + }, + { + "contract_target_id": "ons.population.scotland_households_3plus_children", + "entity": "household", + "family": "scotland_census", + "geographic_level": "country", + "measure": "ons.population.scotland_households_3plus_children", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "ons/scotland_households_3plus_children", + "period": 2025, + "resolved_from_year": 2025, + "source": "scotland_census", + "value": 82000.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "country", + "measure": "ons/tenure_england_owned_outright", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "ons/tenure_england_owned_outright", + "period": 2025, + "resolved_from_year": 2024, + "source": "ons", + "value": 8374612.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "country", + "measure": "ons/tenure_england_owned_with_mortgage", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "ons/tenure_england_owned_with_mortgage", + "period": 2025, + "resolved_from_year": 2024, + "source": "ons", + "value": 7667051.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "country", + "measure": "ons/tenure_england_rented_privately", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "ons/tenure_england_rented_privately", + "period": 2025, + "resolved_from_year": 2024, + "source": "ons", + "value": 5299840.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "country", + "measure": "ons/tenure_england_social_rent", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "ons/tenure_england_social_rent", + "period": 2025, + "resolved_from_year": 2024, + "source": "ons", + "value": 4274613.0 + }, + { + "entity": "household", + "family": "ons", + "geographic_level": "country", + "measure": "ons/tenure_england_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2024" + }, + "name": "ons/tenure_england_total", + "period": 2025, + "resolved_from_year": 2024, + "source": "ons", + "value": 25616116.0 + }, + { + "contract_target_id": "scotgov.scottish_child_payment_spending", + "entity": "household", + "family": "scottish_government", + "geographic_level": "country", + "measure": "scotgov.scottish_child_payment_spending", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "sss/scottish_child_payment", + "period": 2025, + "resolved_from_year": 2025, + "source": "scottish_government", + "value": 471000000.0 + }, + { + "contract_target_id": "slc.repayments.england_total_higher_education", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.england_total_higher_education", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/england", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 5018231834.95 + }, + { + "contract_target_id": "slc.repayments.england_plan_1", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.england_plan_1", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/england/plan_1", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 1852699178.55 + }, + { + "contract_target_id": "slc.repayments.england_plan_2", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.england_plan_2", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/england/plan_2", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 2778253361.64 + }, + { + "contract_target_id": "slc.repayments.england_postgraduate", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.england_postgraduate", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/england/postgraduate", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 346409713.95 + }, + { + "contract_target_id": "slc.repayments.england_plan_5", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.england_plan_5", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/england/plan_5", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 40869580.81 + }, + { + "contract_target_id": "slc.repayments.devolved_total", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.devolved_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/scotland", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 203300000.0 + }, + { + "contract_target_id": "slc.repayments.devolved_total", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.devolved_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/wales", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 229100000.0 + }, + { + "contract_target_id": "slc.repayments.devolved_total", + "entity": "household", + "family": "slc", + "geographic_level": "country", + "measure": "slc.repayments.devolved_total", + "metadata": { + "fixture": "incumbent_2025", + "resolved_from_year": "2025" + }, + "name": "slc/student_loan_repayment/northern_ireland", + "period": 2025, + "resolved_from_year": 2025, + "source": "slc", + "value": 181700000.0 + } + ], + "schema_version": 1, + "surface": { + "by_source": { + "dwp": 138, + "ehs": 2, + "hmrc": 21, + "hmrc_spi": 156, + "nts": 3, + "obr": 34, + "ons": 179, + "scotland_census": 1, + "scottish_government": 1, + "slc": 18, + "voa": 99 + }, + "resolved_at_2025": 637, + "resolved_at_2026": 652, + "union_rows": 652 + } +} 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 new file mode 100644 index 000000000..d940016b4 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -0,0 +1,7641 @@ +{ + "source_fact_feed": ".codex-work/consumer_facts_uk.jsonl", + "target_period": 2025, + "candidate_count": 417, + "contract_target_count": 189, + "active_reference_count": 387, + "status_counts": { + "active": 387, + "multi_fact": 1, + "no_fact_at_or_before_period": 28, + "signed_excluded": 1 + }, + "geography_pins": { + "obr.income_tax": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.ni": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.ni_employee": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.ni_employer": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.ni_self_employed": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.vat": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.fuel_duties": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.capital_gains_tax": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.sdlt": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.attendance_allowance": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.carers_allowance": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.child_benefit": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.council_tax": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.council_tax_england": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "obr.council_tax_scotland": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "obr.council_tax_wales": { + "geography_level": "country", + "geography_id": "W92000004" + }, + "obr.domestic_rates": { + "geography_level": "country", + "geography_id": "N92000002" + }, + "obr.esa": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.housing_benefit": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.jobseekers_allowance": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.pension_credit": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.pip": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.state_pension": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.statutory_maternity_pay": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.tv_licence_fee": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.universal_credit_in_cap": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.universal_credit_outside_cap": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "obr.winter_fuel_allowance": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "isc.private_school_students": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.it_relief_basic_rate": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.it_relief_higher_rate": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.it_relief_additional_rate": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.nics_relief_employee": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.nics_relief_employer": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.users_total": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.users_below_cap": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.salary_sacrifice.users_above_cap": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.employment_income.amount_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.employment_income.count_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.self_employment_income.amount_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.self_employment_income.count_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.dividend_income.amount_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.dividend_income.count_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.property_income.amount_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.property_income.count_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.private_pension_income.amount_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.private_pension_income.count_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.state_pension.amount_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.spi.state_pension.count_by_total_income_band": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.cgt.taxpayers_total": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.cgt.gains_total": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "dwp.benefit_cap.capped_households": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pip.daily_living_standard_claimants": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.pip.daily_living_enhanced_claimants": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.esa_claimants": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.esa_contrib_claimants": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.esa_income_claimants": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.jsa_claimants": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_children_1": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_children_2": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_children_3": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_children_4": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_children_5_or_more": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_single_no_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_single_with_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_couple_no_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households_couple_with_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.payment_distribution_single": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.payment_distribution_lone_parent": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.payment_distribution_couple_no_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.payment_distribution_couple_with_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.scotland_households_child_under_1": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "dwp.uc.two_child_limit.households_affected": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_affected": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_in_affected_households": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.households_3_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_in_3_children_households": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.households_4_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_in_4_children_households": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.households_5_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_in_5_children_households": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.households_6_plus_children": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_in_6_plus_children_households": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.households_claimant_pip": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_claimant_pip": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.households_disabled_child_element": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.two_child_limit.children_disabled_child_element": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "ons.population.uk_total": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_0_9_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_10_19_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_20_29_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_30_39_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_40_49_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_50_59_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_60_69_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_70_79_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.age_80_89_by_region": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_0_4": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_10_14": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_15_19": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_20_24": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_25_29": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_30_34": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_35_39": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_40_44": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_45_49": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_50_54": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_55_59": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_5_9": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_60_64": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_65_69": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_70_74": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_75_79": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_80_84": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_85_89": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.female_90_plus": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_0_4": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_10_14": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_15_19": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_20_24": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_25_29": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_30_34": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_35_39": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_40_44": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_45_49": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_50_54": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_55_59": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_5_9": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_60_64": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_65_69": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_70_74": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_75_79": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_80_84": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_85_89": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.male_90_plus": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.population.scotland_children_under_16": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "ons.population.scotland_babies_under_1": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "ons.population.scotland_households_3plus_children": { + "geography_level": "country", + "geography_id": "S92000003" + }, + "ons.household_composition.lone_households_under_65": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.lone_households_over_65": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.unrelated_adult_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.couple_no_children_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.couple_under_3_children_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.couple_3_plus_children_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.couple_non_dependent_children_only_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.lone_parent_dependent_children_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.lone_parent_non_dependent_children_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.household_composition.multi_family_households": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_a": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_a": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_b": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_b": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_c": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_c": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_d": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_d": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_e": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_e": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_f": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_f": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_g": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_g": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.band_h": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.band_h": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "voa.council_tax_stock.total": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "scotgov.council_tax_stock.total": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "scotgov.scottish_child_payment_spending": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.savings_interest_income": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.public_sector_employment": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.land.land_value": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.land.household_land_value": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "ons.land.corporate_land_value": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "slc.repayments.devolved_total": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.repayments.england_total_higher_education": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "slc.repayments.england_plan_1": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "slc.repayments.england_plan_2": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "slc.repayments.england_postgraduate": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "slc.repayments.england_plan_5": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "slc.borrowers.plan_2_above_threshold": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.borrowers.plan_2_liable": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.borrowers.plan_5_above_threshold": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.borrowers.plan_5_liable": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.support.maintenance_loan_recipients": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.support.maintenance_loan_spend": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.support.parents_learning_allowance_recipients": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.support.parents_learning_allowance_spend": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.support.adult_dependants_grant_recipients": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "slc.support.adult_dependants_grant_spend": { + "geography_level": "country", + "geography_id": "K03000001" + }, + "dwp.uc.households": { + "geography_level": "country", + "geography_id": "K03000001" + } + }, + "genuine_sum_residue": [ + "obr.esa", + "ons.population.age_0_9_by_region", + "ons.population.age_10_19_by_region", + "ons.population.age_20_29_by_region", + "ons.population.age_30_39_by_region", + "ons.population.age_40_49_by_region", + "ons.population.age_50_59_by_region", + "ons.population.age_60_69_by_region", + "ons.population.age_70_79_by_region", + "ons.population.age_80_89_by_region", + "ons.population.female_0_4", + "ons.population.female_10_14", + "ons.population.female_15_19", + "ons.population.female_20_24", + "ons.population.female_25_29", + "ons.population.female_30_34", + "ons.population.female_35_39", + "ons.population.female_40_44", + "ons.population.female_45_49", + "ons.population.female_50_54", + "ons.population.female_55_59", + "ons.population.female_5_9", + "ons.population.female_60_64", + "ons.population.female_65_69", + "ons.population.female_70_74", + "ons.population.female_75_79", + "ons.population.female_80_84", + "ons.population.female_85_89", + "ons.population.female_90_plus", + "ons.population.male_0_4", + "ons.population.male_10_14", + "ons.population.male_15_19", + "ons.population.male_20_24", + "ons.population.male_25_29", + "ons.population.male_30_34", + "ons.population.male_35_39", + "ons.population.male_40_44", + "ons.population.male_45_49", + "ons.population.male_50_54", + "ons.population.male_55_59", + "ons.population.male_5_9", + "ons.population.male_60_64", + "ons.population.male_65_69", + "ons.population.male_70_74", + "ons.population.male_75_79", + "ons.population.male_80_84", + "ons.population.male_85_89", + "ons.population.male_90_plus", + "ons.population.scotland_babies_under_1", + "ons.population.scotland_children_under_16", + "ons.population.uk_total", + "slc.repayments.england_plan_1", + "slc.repayments.england_plan_2", + "slc.repayments.england_plan_5", + "slc.repayments.england_postgraduate", + "slc.repayments.england_total_higher_education" + ], + "uprating_holds": [ + { + "name": "isc.private_school_students", + "from": "2024-01", + "to": "2025" + }, + { + "name": "hmrc.salary_sacrifice.it_relief_basic_rate", + "from": "2024", + "to": "2025" + }, + { + "name": "hmrc.salary_sacrifice.it_relief_higher_rate", + "from": "2024", + "to": "2025" + }, + { + "name": "hmrc.salary_sacrifice.it_relief_additional_rate", + "from": "2024", + "to": "2025" + }, + { + "name": "hmrc.salary_sacrifice.nics_relief_employee", + "from": "2024", + "to": "2025" + }, + { + "name": "hmrc.salary_sacrifice.nics_relief_employer", + "from": "2024", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/self_employment_income_count_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/dividend_income_count_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/property_income_count_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/private_pension_income_count_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc/state_pension_count_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc.cgt.taxpayers_total", + "from": "2023", + "to": "2025" + }, + { + "name": "hmrc.cgt.gains_total", + "from": "2023", + "to": "2025" + }, + { + "name": "dwp.benefit_cap.capped_households", + "from": "2025-11", + "to": "2025" + }, + { + "name": "dwp.esa_claimants", + "from": "2025-08", + "to": "2025" + }, + { + "name": "dwp.esa_contrib_claimants", + "from": "2025-08", + "to": "2025" + }, + { + "name": "dwp.esa_income_claimants", + "from": "2025-08", + "to": "2025" + }, + { + "name": "dwp.jsa_claimants", + "from": "2025-08", + "to": "2025" + }, + { + "name": "dwp.uc.households_children_1", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_children_2", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_children_3", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_children_4", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_children_5_or_more", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_single_no_children", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_single_with_children", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_couple_no_children", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.households_couple_with_children", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.scotland_households_child_under_1", + "from": "2025-05", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_affected", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_affected", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_in_affected_households", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_3_children", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_in_3_children_households", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_4_children", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_in_4_children_households", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_5_children", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_in_5_children_households", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_in_6_plus_children_households", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_claimant_pip", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_claimant_pip", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.households_disabled_child_element", + "from": "2025-04", + "to": "2025" + }, + { + "name": "dwp.uc.two_child_limit.children_disabled_child_element", + "from": "2025-04", + "to": "2025" + }, + { + "name": "ons.population.uk_total", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_0_9_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_10_19_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_20_29_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_30_39_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_40_49_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_50_59_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_60_69_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_70_79_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.age_80_89_by_region", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_0_4", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_10_14", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_15_19", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_20_24", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_25_29", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_30_34", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_35_39", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_40_44", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_45_49", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_50_54", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_55_59", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_5_9", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_60_64", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_65_69", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_70_74", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_75_79", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_80_84", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_85_89", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.female_90_plus", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_0_4", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_10_14", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_15_19", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_20_24", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_25_29", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_30_34", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_35_39", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_40_44", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_45_49", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_50_54", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_55_59", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_5_9", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_60_64", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_65_69", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_70_74", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_75_79", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_80_84", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_85_89", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.male_90_plus", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.scotland_children_under_16", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.population.scotland_babies_under_1", + "from": "2024", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_a", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_b", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_c", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_d", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_e", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_f", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_g", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.band_h", + "from": "2025-03", + "to": "2025" + }, + { + "name": "voa.council_tax_stock.total", + "from": "2025-03", + "to": "2025" + }, + { + "name": "ons.public_sector_employment", + "from": "2024-12", + "to": "2025" + }, + { + "name": "ons.land.land_value", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.land.household_land_value", + "from": "2024", + "to": "2025" + }, + { + "name": "ons.land.corporate_land_value", + "from": "2024", + "to": "2025" + }, + { + "name": "slc.repayments.england_total_higher_education", + "from": "2024", + "to": "2025" + }, + { + "name": "slc.repayments.england_plan_1", + "from": "2024", + "to": "2025" + }, + { + "name": "slc.repayments.england_plan_2", + "from": "2024", + "to": "2025" + }, + { + "name": "slc.repayments.england_postgraduate", + "from": "2024", + "to": "2025" + }, + { + "name": "slc.repayments.england_plan_5", + "from": "2024", + "to": "2025" + } + ], + "targets": { + "obr.income_tax": { + "status": "active", + "candidates": [ + { + "name": "obr.income_tax", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 331437583074.4429, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_d928e7da0fbfe088ca1a30d7" + } + ] + }, + "obr.ni": { + "status": "active", + "candidates": [ + { + "name": "obr.ni", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 200081395082.7125, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_eccab3ee763d68bb782276a7" + } + ] + }, + "obr.ni_employee": { + "status": "active", + "candidates": [ + { + "name": "obr.ni_employee", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 49544363784.26465, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_7e3e3e637a9134760a0a530a" + } + ] + }, + "obr.ni_employer": { + "status": "active", + "candidates": [ + { + "name": "obr.ni_employer", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 145324007512.71753, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_c8719021c501d9757e0e0814" + } + ] + }, + "obr.ni_self_employed": { + "status": "active", + "candidates": [ + { + "name": "obr.ni_self_employed", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 2902816090.4147716, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_b94b7d74d7df7ff5f9309f3b" + } + ] + }, + "obr.vat": { + "status": "active", + "candidates": [ + { + "name": "obr.vat", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 180168938685.41794, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_3c534c3e6313150f8081b777" + } + ] + }, + "obr.fuel_duties": { + "status": "active", + "candidates": [ + { + "name": "obr.fuel_duties", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 24241874775.213375, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_9273c0c9f7045493ed2e984a" + } + ] + }, + "obr.capital_gains_tax": { + "status": "active", + "candidates": [ + { + "name": "obr.capital_gains_tax", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 21801546197.09165, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_93699bb9caa7ec0d6833f420" + } + ] + }, + "obr.sdlt": { + "status": "active", + "candidates": [ + { + "name": "obr.sdlt", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 15406516698.785578, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b6d55fc4ccd78bd0ae457e9" + } + ] + }, + "obr.attendance_allowance": { + "status": "active", + "candidates": [ + { + "name": "obr.attendance_allowance", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 8492497075.074617, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_4fe1b1966eeb22c0c5ca464c" + } + ] + }, + "obr.carers_allowance": { + "status": "active", + "candidates": [ + { + "name": "obr.carers_allowance", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 4569403813.760573, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_ca7be49d51152bcc4c6662f2" + } + ] + }, + "obr.child_benefit": { + "status": "active", + "candidates": [ + { + "name": "obr.child_benefit", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 13389272724.45089, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_d3ab2c54ce0c4c6a46a7a36b" + } + ] + }, + "obr.council_tax": { + "status": "active", + "candidates": [ + { + "name": "obr.council_tax", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 50925163826.30539, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_16bcd3e2a16bfa44c0b1ea74" + } + ] + }, + "obr.council_tax_england": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "obr.council_tax_england", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "obr.council_tax_scotland": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "obr.council_tax_scotland", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "obr.council_tax_wales": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "obr.council_tax_wales", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "obr.domestic_rates": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "obr.domestic_rates", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "obr.esa": { + "status": "active", + "candidates": [ + { + "name": "obr.esa", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 7206287181.538654, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_632a67850494984d9b35e639" + } + ] + }, + "obr.housing_benefit": { + "status": "active", + "candidates": [ + { + "name": "obr.housing_benefit", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 12103254163.788864, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_984cc88cfc4242bd80c679f3" + } + ] + }, + "obr.jobseekers_allowance": { + "status": "active", + "candidates": [ + { + "name": "obr.jobseekers_allowance", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 280558748.04472804, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_d505f8a08a29411dcf69287b" + } + ] + }, + "obr.pension_credit": { + "status": "active", + "candidates": [ + { + "name": "obr.pension_credit", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 6146422389.476461, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_95ea9bc008361c26f90591d4" + } + ] + }, + "obr.pip": { + "status": "active", + "candidates": [ + { + "name": "obr.pip", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 36910059270.5278, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_548ebadeb7d774b32fa6f4ff" + } + ] + }, + "obr.state_pension": { + "status": "active", + "candidates": [ + { + "name": "obr.state_pension", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 146185954351.57382, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_567e55f9f73df2808c1c4be8" + } + ] + }, + "obr.statutory_maternity_pay": { + "status": "active", + "candidates": [ + { + "name": "obr.statutory_maternity_pay", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 3194800881.520547, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_0c45b526e2b233b22d955cc6" + } + ] + }, + "obr.tv_licence_fee": { + "status": "active", + "candidates": [ + { + "name": "obr.tv_licence_fee", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 3872000000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_b0f0afcd44c93532837c9f2a" + } + ] + }, + "obr.universal_credit_in_cap": { + "status": "active", + "candidates": [ + { + "name": "obr.universal_credit_in_cap", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 66410800011.47837, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_e680fe36115d1372d12072e1" + } + ] + }, + "obr.universal_credit_outside_cap": { + "status": "active", + "candidates": [ + { + "name": "obr.universal_credit_outside_cap", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 12875549128.065746, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_4c927d7b33d1eee2455bdbd0" + } + ] + }, + "obr.winter_fuel_allowance": { + "status": "active", + "candidates": [ + { + "name": "obr.winter_fuel_allowance", + "status": "active", + "matched_fact_count_overall": 7, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 1911040880.4619167, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_575778670363b5890c8de847" + } + ] + }, + "isc.private_school_students": { + "status": "active", + "candidates": [ + { + "name": "isc.private_school_students", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 556551.0, + "resolved_fact_period": "2024-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_67bd24e7f9158af756625865" + } + ] + }, + "hmrc.salary_sacrifice.it_relief_basic_rate": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.it_relief_basic_rate", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1600000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_7320889e57785e6997224191" + } + ] + }, + "hmrc.salary_sacrifice.it_relief_higher_rate": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.it_relief_higher_rate", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5500000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_7d9ff26814151157071301e9" + } + ] + }, + "hmrc.salary_sacrifice.it_relief_additional_rate": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.it_relief_additional_rate", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1800000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_49a712ba4b22f0b4b2925ef9" + } + ] + }, + "hmrc.salary_sacrifice.nics_relief_employee": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.nics_relief_employee", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1000000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_341767859ef6030c06c7a153" + } + ] + }, + "hmrc.salary_sacrifice.nics_relief_employer": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.nics_relief_employer", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3400000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_026ae1169f5f0f997bb06479" + } + ] + }, + "hmrc.salary_sacrifice.users_total": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.users_total", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 7700000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_06d585b8684b5fe0ce25f6ec" + } + ] + }, + "hmrc.salary_sacrifice.users_below_cap": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.users_below_cap", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4300000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_a48e584180a6f33d07112d3c" + } + ] + }, + "hmrc.salary_sacrifice.users_above_cap": { + "status": "active", + "candidates": [ + { + "name": "hmrc.salary_sacrifice.users_above_cap", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3300000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_0331d77688891a3c3c3307b6" + } + ] + }, + "hmrc.spi.employment_income.amount_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/employment_income_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 82300000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_b1c634a871c843888ab00545" + }, + { + "name": "hmrc/employment_income_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 35500000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_16019afa59e224b690877826" + }, + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 16900000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_a82c84f67b40867564d2c847" + }, + { + "name": "hmrc/employment_income_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 48600000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_42eb325b6a29afb3e6d157fa" + }, + { + "name": "hmrc/employment_income_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 39200000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1f93702eb88f381f0701c4f8" + }, + { + "name": "hmrc/employment_income_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 172000000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_794fd9633d6a2018fee633e7" + }, + { + "name": "hmrc/employment_income_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 36600000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d85ad655daaa164b1ab33231" + }, + { + "name": "hmrc/employment_income_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 170000000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3607635c72d16b4059b6a3f6" + }, + { + "name": "hmrc/employment_income_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 29000000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_5c3674b48269ffe3c7b28a1b" + }, + { + "name": "hmrc/employment_income_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 139000000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_525aeb02ab9a831608756200" + }, + { + "name": "hmrc/employment_income_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 174000000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_9f1a70b4e0995af34d7dbbfb" + }, + { + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 23100000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1944a2f33309b41b2d5f348d" + }, + { + "name": "hmrc/employment_income_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 118000000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_6178d003a4c1a6198294f174" + } + ] + }, + "hmrc.spi.employment_income.count_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 791000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_b83fec2e722ef22cbe28ee76" + }, + { + "name": "hmrc/employment_income_count_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 21000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_618b4f84a2b10fdf0d901df6" + }, + { + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1360000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_5a2e006ccd94f8754760661c" + }, + { + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3100000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_a4ecaa65aa113092a1c8fcf7" + }, + { + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 264000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_ffcb46afae1c469de75ee9b3" + }, + { + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 7470000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1bbafa142b4bfc426ce5bdac" + }, + { + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 180000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_dd00b1e66c3254ddc0e108a6" + }, + { + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5370000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3bd51396d03aee4164d7c1d6" + }, + { + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 93000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d1f4ceb7f4e676d9ff044d80" + }, + { + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3500000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_874b13ae1da1064e73055c39" + }, + { + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3430000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_572104f32689df4a2dc4c334" + }, + { + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 44000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3b99d6944753bf5696bdc8f9" + }, + { + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1640000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_8eec35d25c57e9c2e2c7962b" + } + ] + }, + "hmrc.spi.self_employment_income.amount_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/self_employment_income_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4980000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_5b616c7ebeb21ef5305b8beb" + }, + { + "name": "hmrc/self_employment_income_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 19500000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_761827852b6a2fccb3d15132" + }, + { + "name": "hmrc/self_employment_income_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4810000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1a69068db718770de7df525e" + }, + { + "name": "hmrc/self_employment_income_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8030000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c1df7ca022a9c007f122de6d" + }, + { + "name": "hmrc/self_employment_income_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3650000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7183b7c143f8e897552ad685" + }, + { + "name": "hmrc/self_employment_income_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 15700000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_33c4f0779c40ec91ff6761da" + }, + { + "name": "hmrc/self_employment_income_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4390000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_90652f32ebe0ff36c569998d" + }, + { + "name": "hmrc/self_employment_income_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12600000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b9ad3f39e949b92a26ec28c" + }, + { + "name": "hmrc/self_employment_income_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4840000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_96f921ffdb56a575057076f8" + }, + { + "name": "hmrc/self_employment_income_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8730000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_645090db5db62f7c47a34f60" + }, + { + "name": "hmrc/self_employment_income_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8220000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_f0d7af3458463a645af3cb76" + }, + { + "name": "hmrc/self_employment_income_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 6670000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_fc7a985c6a2a3d69e2c9ae75" + }, + { + "name": "hmrc/self_employment_income_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5360000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c588886840e4e7e4a141ac75" + } + ] + }, + "hmrc.spi.self_employment_income.count_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/self_employment_income_count_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 85000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_db16ef55b3b0f60d292b745b" + }, + { + "name": "hmrc/self_employment_income_count_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 11000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_315a063dab8497ed5b8837b6" + }, + { + "name": "hmrc/self_employment_income_count_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 444000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_498ad10a35b58ff55819bc8b" + }, + { + "name": "hmrc/self_employment_income_count_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 651000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_eb849a98f57c60bd507d621b" + }, + { + "name": "hmrc/self_employment_income_count_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 40000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_cfb6ca3c4eff6a83bd5c10ac" + }, + { + "name": "hmrc/self_employment_income_count_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 961000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_72bd71f362434b2260a4b407" + }, + { + "name": "hmrc/self_employment_income_count_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 34000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_fe86d957cb9590b3292e1757" + }, + { + "name": "hmrc/self_employment_income_count_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 595000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_84b75f0a77e11de0182b9d87" + }, + { + "name": "hmrc/self_employment_income_count_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 21000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_5c668fd92047d28d73d7c36d" + }, + { + "name": "hmrc/self_employment_income_count_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 359000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_876b5e55461ed15a7456d8b3" + }, + { + "name": "hmrc/self_employment_income_count_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 311000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_09e5a5c61ccf990f6104a903" + }, + { + "name": "hmrc/self_employment_income_count_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 15000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_73031eb82b28c872e4371fae" + }, + { + "name": "hmrc/self_employment_income_count_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 143000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c35c3f72e5f7901457970c8d" + } + ] + }, + "hmrc.spi.dividend_income.amount_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/dividend_income_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 6870000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_6fd01f132dc6b218c02326b1" + }, + { + "name": "hmrc/dividend_income_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 11100000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3c0cd54a0f0609d8ebc58a25" + }, + { + "name": "hmrc/dividend_income_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 175000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_b63a84056f85bed14b8ab8fd" + }, + { + "name": "hmrc/dividend_income_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 855000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3c4f22fc63944665033b18b3" + }, + { + "name": "hmrc/dividend_income_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3450000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_ced1a5840ced099b471d4e84" + }, + { + "name": "hmrc/dividend_income_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3330000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_8a115e840b38a6603d618bc0" + }, + { + "name": "hmrc/dividend_income_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3700000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0394e55216df7f3dcab84fb5" + }, + { + "name": "hmrc/dividend_income_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4700000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_ea93d59adaf66ef73e9dddbf" + }, + { + "name": "hmrc/dividend_income_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3430000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_8d09d2287cbdb2e4f4004521" + }, + { + "name": "hmrc/dividend_income_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8400000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0a4329a3eb027a530c6f02ec" + }, + { + "name": "hmrc/dividend_income_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12500000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c11497ffe45250b909593f1d" + }, + { + "name": "hmrc/dividend_income_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3820000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_dafc8ca1cd03e5d461b11d4e" + }, + { + "name": "hmrc/dividend_income_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 9440000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_940e6ce9db10080ed5613faa" + } + ] + }, + "hmrc.spi.dividend_income.count_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/dividend_income_count_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 222000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_35b535ef60b7e9e8ddad45af" + }, + { + "name": "hmrc/dividend_income_count_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 19000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_fbe097b0ffbcc0e7a301478d" + }, + { + "name": "hmrc/dividend_income_count_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 115000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3a657db84b033007853ec14b" + }, + { + "name": "hmrc/dividend_income_count_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 372000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_418541677821ff087753a7b4" + }, + { + "name": "hmrc/dividend_income_count_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 92000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_426db10645b611899a770dbd" + }, + { + "name": "hmrc/dividend_income_count_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 843000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_937f405149e37c0c900a62ee" + }, + { + "name": "hmrc/dividend_income_count_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 75000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_6c0e32c82b968ba545457cab" + }, + { + "name": "hmrc/dividend_income_count_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 667000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c8fc2a8e3993c51b68cc6f8a" + }, + { + "name": "hmrc/dividend_income_count_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 49000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_439d9908bf6880e33103ea7d" + }, + { + "name": "hmrc/dividend_income_count_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 627000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_60bb54980a6ca69ff77d07f0" + }, + { + "name": "hmrc/dividend_income_count_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 643000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_56b8b1dd7aec08c3abddc3a0" + }, + { + "name": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 32000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c9f024b8595617fc8dd8e416" + }, + { + "name": "hmrc/dividend_income_count_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 336000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_2ed13533e012fdd1fec68a67" + } + ] + }, + "hmrc.spi.property_income.amount_by_total_income_band": { + "status": "signed_excluded", + "candidates": [ + { + "name": "hmrc.spi.property_income.amount_by_total_income_band", + "status": "signed_excluded", + "matched_fact_count_overall": 13, + "matched_fact_count_at_or_before_period": 13, + "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is policyengine-uk-data PR #311 / issue policyengine-uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." + } + ] + }, + "hmrc.spi.property_income.count_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/property_income_count_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 137000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_50e02eb85969a4773af5cade" + }, + { + "name": "hmrc/property_income_count_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 7000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d286366fea43c9f897936709" + }, + { + "name": "hmrc/property_income_count_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 101000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_80d817cee2f3592809f3a194" + }, + { + "name": "hmrc/property_income_count_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 232000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_2c0d78b9f9dff4e5fdfa250c" + }, + { + "name": "hmrc/property_income_count_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 54000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_5ec672db73bb4f35958a409e" + }, + { + "name": "hmrc/property_income_count_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 431000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3eb40c70c3de0d0c29253566" + }, + { + "name": "hmrc/property_income_count_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 41000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0394669c5734865fda5f0541" + }, + { + "name": "hmrc/property_income_count_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 364000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_6564bb4b662365729676a9e1" + }, + { + "name": "hmrc/property_income_count_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 23000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_87c457b7ee2392ee8360893b" + }, + { + "name": "hmrc/property_income_count_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 325000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7187a98d8342886b08e3f9e2" + }, + { + "name": "hmrc/property_income_count_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 397000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c44a33c3bc4454de20132027" + }, + { + "name": "hmrc/property_income_count_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 13000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_831e0c70ca80d37c785d4122" + }, + { + "name": "hmrc/property_income_count_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 226000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_f93d04a399cee892e5ec86b6" + } + ] + }, + "hmrc.spi.private_pension_income.amount_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/private_pension_income_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5430000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_cb943439ee9edfb445bc3fa5" + }, + { + "name": "hmrc/private_pension_income_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 370000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7dcf8568040de10d9b3765da" + }, + { + "name": "hmrc/private_pension_income_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4350000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_699889c2fb48479e27e44a4a" + }, + { + "name": "hmrc/private_pension_income_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 13600000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0f977d0b50c1d0f1d1364e88" + }, + { + "name": "hmrc/private_pension_income_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1810000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d29aac0680380c80bd842bae" + }, + { + "name": "hmrc/private_pension_income_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 30200000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_bafcebe21a05cb0ca19d5e4f" + }, + { + "name": "hmrc/private_pension_income_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1570000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_de0ed091681463c4ddec5b85" + }, + { + "name": "hmrc/private_pension_income_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 24900000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_2884a006a8d7c144a8570a7d" + }, + { + "name": "hmrc/private_pension_income_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1120000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_73e8de3b1ac198cc75c2b696" + }, + { + "name": "hmrc/private_pension_income_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 16900000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_6b29cd5a1d665a00bb3e8046" + }, + { + "name": "hmrc/private_pension_income_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 17400000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_8f911d955de4f80e87dc69d8" + }, + { + "name": "hmrc/private_pension_income_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 640000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_a13e6165bec82537c5c2883c" + }, + { + "name": "hmrc/private_pension_income_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 9470000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0a1db235b87cad00eeddbfd8" + } + ] + }, + "hmrc.spi.private_pension_income.count_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 109000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1fa1ba97628c6c2c315f0e15" + }, + { + "name": "hmrc/private_pension_income_count_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_188f8f1a0535263e4db7c9a8" + }, + { + "name": "hmrc/private_pension_income_count_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1070000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_853f104082cf479b98952c1a" + }, + { + "name": "hmrc/private_pension_income_count_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2140000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c785199ee1d08fabfe927ff0" + }, + { + "name": "hmrc/private_pension_income_count_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 29000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_a98ec830dee0eceb16b452e7" + }, + { + "name": "hmrc/private_pension_income_count_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2660000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1df6f17a33011c1c026dbc09" + }, + { + "name": "hmrc/private_pension_income_count_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 20000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_042ab8896eb0214e7bbad477" + }, + { + "name": "hmrc/private_pension_income_count_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1450000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0a28fd76533fc93cf8dbfe4a" + }, + { + "name": "hmrc/private_pension_income_count_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 10000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7fccfc3ee4246841b3ed391b" + }, + { + "name": "hmrc/private_pension_income_count_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 779000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_0f808aa135a13e5aa4668d22" + }, + { + "name": "hmrc/private_pension_income_count_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 643000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_097efdacf2adf0f90f90d1de" + }, + { + "name": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_8abdd0aa368c3d693e6d0989" + }, + { + "name": "hmrc/private_pension_income_count_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 259000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_f75fc4c3e2cb06bbdb7543f8" + } + ] + }, + "hmrc.spi.state_pension.amount_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/state_pension_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 847000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d63e1a96cab57582f482b8c2" + }, + { + "name": "hmrc/state_pension_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 20000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_9a20bd62d4d5984865242929" + }, + { + "name": "hmrc/state_pension_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 11800000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_45083c1383ea711226aebd1b" + }, + { + "name": "hmrc/state_pension_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 22200000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_310febb949c686fad2b71a94" + }, + { + "name": "hmrc/state_pension_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 265000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_e79668076aadc063559585e9" + }, + { + "name": "hmrc/state_pension_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 24900000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3d18e138c32f6581d6dafdd7" + }, + { + "name": "hmrc/state_pension_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 179000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_e1dda799099ac0f4f439700d" + }, + { + "name": "hmrc/state_pension_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12300000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_151045b793ac454ab29260fc" + }, + { + "name": "hmrc/state_pension_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 96000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_c95154893499181b7f3a8903" + }, + { + "name": "hmrc/state_pension_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 6020000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_bc4cee7d39f5e1c311464a55" + }, + { + "name": "hmrc/state_pension_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4660000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7f09c940c0fbc3cc42b9e510" + }, + { + "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 43000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d265dfcd4ba09d10053a78a4" + }, + { + "name": "hmrc/state_pension_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1890000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_41c1df25454fdf413d5765d7" + } + ] + }, + "hmrc.spi.state_pension.count_by_total_income_band": { + "status": "active", + "candidates": [ + { + "name": "hmrc/state_pension_count_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 74000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_01b8f391c006c09d3ed51865" + }, + { + "name": "hmrc/state_pension_count_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_b8c359bb976d919bedb9076a" + }, + { + "name": "hmrc/state_pension_count_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1140000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_05f2cd00648c7f8225723a9c" + }, + { + "name": "hmrc/state_pension_count_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2050000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_ced75bd10fbfa56ef2eabeae" + }, + { + "name": "hmrc/state_pension_count_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 21000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_73d438db1a168d794e290b0e" + }, + { + "name": "hmrc/state_pension_count_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2320000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_69b521bf537da156d2afa48e" + }, + { + "name": "hmrc/state_pension_count_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 14000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_3edcf70605856bb8b906ea19" + }, + { + "name": "hmrc/state_pension_count_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1160000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1cafb0f484a7d8191b7fb989" + }, + { + "name": "hmrc/state_pension_count_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7f510c873457703c57c16983" + }, + { + "name": "hmrc/state_pension_count_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 568000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_d4ff6839b2d936396ae33f67" + }, + { + "name": "hmrc/state_pension_count_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 441000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_2b5023baae0b6814c07afbe9" + }, + { + "name": "hmrc/state_pension_count_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_f9a834c26fa7c215c052f4f5" + }, + { + "name": "hmrc/state_pension_count_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 176000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_7514fbdbf5f909008b617d06" + } + ] + }, + "hmrc.cgt.taxpayers_total": { + "status": "active", + "candidates": [ + { + "name": "hmrc.cgt.taxpayers_total", + "status": "active", + "matched_fact_count_overall": 37, + "matched_fact_count_at_or_before_period": 37, + "resolved_period": 2025, + "resolved_value": 378000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_78fb64bd2e9774df4b2f2d56" + } + ] + }, + "hmrc.cgt.gains_total": { + "status": "active", + "candidates": [ + { + "name": "hmrc.cgt.gains_total", + "status": "active", + "matched_fact_count_overall": 37, + "matched_fact_count_at_or_before_period": 37, + "resolved_period": 2025, + "resolved_value": 65937000000.0, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b082e386beee3c6900e9dfa" + } + ] + }, + "dwp.benefit_cap.capped_households": { + "status": "active", + "candidates": [ + { + "name": "dwp.benefit_cap.capped_households", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 110637.0, + "resolved_fact_period": "2025-11", + "resolved_fact_key": "ledger_aggregate_fact_v2_b698397897ed849f096cdd94" + } + ] + }, + "dwp.pip.daily_living_standard_claimants": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "dwp.pip.daily_living_standard_claimants", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "dwp.pip.daily_living_enhanced_claimants": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "dwp.pip.daily_living_enhanced_claimants", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "dwp.esa_claimants": { + "status": "active", + "candidates": [ + { + "name": "dwp.esa_claimants", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1000000.0, + "resolved_fact_period": "2025-08", + "resolved_fact_key": "ledger_aggregate_fact_v2_16ef67af9274891abd5e4fdc" + } + ] + }, + "dwp.esa_contrib_claimants": { + "status": "active", + "candidates": [ + { + "name": "dwp.esa_contrib_claimants", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 620000.0, + "resolved_fact_period": "2025-08", + "resolved_fact_key": "ledger_aggregate_fact_v2_bf22883b03cf631864b2ae1d" + } + ] + }, + "dwp.esa_income_claimants": { + "status": "active", + "candidates": [ + { + "name": "dwp.esa_income_claimants", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 180000.0, + "resolved_fact_period": "2025-08", + "resolved_fact_key": "ledger_aggregate_fact_v2_8684f0c35a1d71a291e61c81" + } + ] + }, + "dwp.jsa_claimants": { + "status": "active", + "candidates": [ + { + "name": "dwp.jsa_claimants", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 71000.0, + "resolved_fact_period": "2025-08", + "resolved_fact_key": "ledger_aggregate_fact_v2_b5d92ff094ad2c534847291a" + } + ] + }, + "dwp.uc.households_children_1": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_children_1", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1269512.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_644c4f00ec93656261edcf42" + } + ] + }, + "dwp.uc.households_children_2": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_children_2", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1103880.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_9ab84c46af8587c44e728bf3" + } + ] + }, + "dwp.uc.households_children_3": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_children_3", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 497665.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_6dcdc6d11cf3afee5beeffa6" + } + ] + }, + "dwp.uc.households_children_4": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_children_4", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 176202.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_615b1a43ca3d51a46d4f46a6" + } + ] + }, + "dwp.uc.households_children_5_or_more": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_children_5_or_more", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 77894.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_d0e380e6527f49dd3585c634" + } + ] + }, + "dwp.uc.households_single_no_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_single_no_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3191316.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_459c91f3fc3a98a523da443f" + } + ] + }, + "dwp.uc.households_single_with_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_single_with_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2213760.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_41f5ed85cf8b0bb1e30ed3c0" + } + ] + }, + "dwp.uc.households_couple_no_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_couple_no_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 266160.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_db1b0c763265b66903558f63" + } + ] + }, + "dwp.uc.households_couple_with_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.households_couple_with_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 911392.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_d4b90e6010117d5593724efa" + } + ] + }, + "dwp.uc.payment_distribution_single": { + "status": "active", + "candidates": [ + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 101189.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_7c22cffc1a38778c7c43ed3c" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 121018.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_d3e756c93a3c0143508d1266" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 106102.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_7403d7adc181e8d2f6c832d0" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 182183.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_b7e5703a6a7e90d9384d821e" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 191730.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_40ccf757e12c655dde7c28a9" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 130302.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_5495d957950548ee5265e578" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 86110.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_7f32751b273236019d0798b0" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 47330.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_52effa75479c574acf4134d9" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 27065.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_073ef8770019305805c7074e" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 18536.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_05d7866882726d294cb2b698" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12726.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_ed6eafde744f64d26d82dbf2" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 9793.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_16597c41c14d5cebd04c4378" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 173855.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_92ccc0cdeecc8d39c5addbbc" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 6398.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_fd890e1b94309f81f9ec55bb" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 6020.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_afeee8c7da377064d0933593" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5488.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_9745e30f3384edf22e35cded" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1829.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_9327cf3a591e2df94e342811" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1543.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_029a3e490eb607ddc8e6e0e8" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 369404.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_014f43c525c174241f9ae3f2" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 197717.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_6f4d510b41bea88731dbad53" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 106706.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_7b0eac6a3e7fa0fdf30ae20b" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 143277.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_b956dc2e29d5cd357cfb526e" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 379652.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_b66198d395778d35ce86a34a" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 341457.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_3818f2d9e159770543dac328" + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 94296.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_1cf99ad91d162c4b4a10ba6d" + } + ] + }, + "dwp.uc.payment_distribution_lone_parent": { + "status": "active", + "candidates": [ + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 24828.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_4273e312b98b380662c03f93" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 34587.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_0694e810a066ab1790440425" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 129699.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_b673f0ea23294b3fa927464d" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 129699.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_960bd045472cf623c35cf664" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 117812.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_210996567d5bf54f88063c27" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 128991.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_222b9723363faf4129bbdf63" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 139675.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_3dd7c7c9e33c076b3d69bc58" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 134650.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_0c94d038c83605df1791d447" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 106818.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_5a7d3c0f71bf8db13f2a649a" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 86255.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_bea1b398332d1d61c0471393" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 80273.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_fd5aac9d266aee092d14bd76" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 70319.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_44b81b3b7676500a87a60938" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 43550.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_a316ad8358830ca46c06b8a3" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 50805.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_bd5c3628d5556986948de1a5" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 43132.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_6a09ee4de44449dfc8c84307" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 34342.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_44655134e1437b8245aadfd5" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 27650.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_06c7d10a8b8ad631c14e5aa2" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 22058.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_b138657095f80dfd0a4ba4dc" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 55560.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_6d87d6eb32df7d87c29c57f7" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 68058.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_54b83995b46b86deae16f2a3" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 89174.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_cc4b36a430821375a2ed82e0" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 117236.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_cf9c6c694bfbd98b7fb42670" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 98877.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_397b502ee3e68b1b94361cd8" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 102069.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_28de432bddc47503ed9234dc" + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 125466.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_8a9d5f54da5f13cda4d7c879" + } + ] + }, + "dwp.uc.payment_distribution_couple_no_children": { + "status": "active", + "candidates": [ + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 7553.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_822a65a1958c79035950ef6d" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8732.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_8f96da01c8e98a3e520ad3af" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 15096.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_1320bfc5a74354fc0b932e45" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12422.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_266208dfcf14fec7202d3f81" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 17851.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_2ad978ed7754cd1bff3ec521" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 14493.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_703d368c208e2bbfdd0ee5f8" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 11914.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_2326bacf548613787d0e5265" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 9478.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_3c8b4dcf3516206f4f91536f" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 8479.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_64fc1a0b6ffa5d083131e00f" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5764.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_61477c25c1bda2189013f5d8" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 3525.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_1bfbe99d32b115fb101c16f3" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2356.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_e7b1f279ad3f7193ae68fc74" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 11606.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_d4d9c99c13e5ffddf9807229" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1797.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_64cb01bb1cff7752e7ac9fd6" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1214.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_c3cdf2a650039f3befb16629" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 958.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_03928eb7a88eb005e4e749af" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 654.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_4f7d04b28e459dfa105f04a2" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 578.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_d6b8079542fdf9ba694c65d4" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 10672.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_58fdd30eacb059011b021576" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12199.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_47d90f6b52d026e685875309" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12405.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_082b5365b7fdf6c1c7040844" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 15632.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_065a04ded463b0db36bc03f1" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 14298.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_398a20f6c941d7755751b050" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 17626.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_3d6203f0f1f7d8a09fbbd123" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12318.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_81b85753a70cc5e10a83f605" + } + ] + }, + "dwp.uc.payment_distribution_couple_with_children": { + "status": "active", + "candidates": [ + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 18896.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_e61e3d1fb68d75f854dd7925" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 22614.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_8d35301acbeaea0ec16d784b" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 41349.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_9d5313777ece292ab0076e87" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 40850.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_532aa299693f3fa7546b54ca" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 42101.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_1bc71ee7fea828fe2503e115" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 38379.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_5975a3ac278b3656e0f56800" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 38725.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_fa8e258f094fc3ec208b2813" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 38124.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_031b8e5a3da66a77e7116170" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 33871.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_287bb8dc3393d9ebe342c045" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 29950.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_9d97c8b17ae6e786901f969a" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 28186.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_fa0e34a52ba5fb25f60b470c" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 25960.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_12f9a2c5aa63563eae9aef60" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 26768.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_1df3a18d5e1e627972812530" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 23231.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_0c182b7ed2813f434c7faf96" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 20598.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_89cd3e4f357479a172b9e1a4" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 17650.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_1cfec0935e609d67288403ee" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 15499.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_14e996afeb0a61b020c8e38a" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 12912.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_59b6b903ae94ade8466c9f8f" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 29288.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_0bedfcd27e528d6ad1ede930" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 33072.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_53248eeb98cd236f5f3474d3" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 35834.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_e5dd88072bae31da148f1987" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 38337.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_f9ceb07914176c0c6e3b7306" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 40556.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_f010d0b94b60241806a2ccac" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 40399.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_359b4b0c64a9f950a630fd06" + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 41858.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_010fe13b9bcf93223a51f16b" + } + ] + }, + "dwp.uc.scotland_households_child_under_1": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.scotland_households_child_under_1", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 14412.0, + "resolved_fact_period": "2025-05", + "resolved_fact_key": "ledger_aggregate_fact_v2_a2cdcfc2cd3c4f56e33bfba2" + } + ] + }, + "dwp.uc.two_child_limit.households_affected": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_affected", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 469780.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_860a48172c62298ceb00c20b" + } + ] + }, + "dwp.uc.two_child_limit.children_affected": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_affected", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 597920.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_4378e45ac129e036b4a6ca03" + } + ] + }, + "dwp.uc.two_child_limit.children_in_affected_households": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_in_affected_households", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1665540.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_05774e34488c474df7f84742" + } + ] + }, + "dwp.uc.two_child_limit.households_3_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_3_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 297310.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_dca7734c17910c213e397741" + } + ] + }, + "dwp.uc.two_child_limit.children_in_3_children_households": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_in_3_children_households", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 891930.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_515b2aeb394a9a9a1fd2d195" + } + ] + }, + "dwp.uc.two_child_limit.households_4_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_4_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 117190.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_a78a141d4018bdd92678b497" + } + ] + }, + "dwp.uc.two_child_limit.children_in_4_children_households": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_in_4_children_households", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 468760.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_adef094060710c5b354e7ac4" + } + ] + }, + "dwp.uc.two_child_limit.households_5_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_5_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 37020.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_2c9cfcd7cc862c9c1dd57e4d" + } + ] + }, + "dwp.uc.two_child_limit.children_in_5_children_households": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_in_5_children_households", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 185120.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_2134e60314c98faf54df2498" + } + ] + }, + "dwp.uc.two_child_limit.households_6_plus_children": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_6_plus_children", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 18260.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_e6302f9f933c14e97fc2fcae" + } + ] + }, + "dwp.uc.two_child_limit.children_in_6_plus_children_households": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_in_6_plus_children_households", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 119720.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_235cb4e779dd669dad2cd421" + } + ] + }, + "dwp.uc.two_child_limit.households_claimant_pip": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_claimant_pip", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 65280.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_55dd86462d71be247206b5a2" + } + ] + }, + "dwp.uc.two_child_limit.children_claimant_pip": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_claimant_pip", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 235270.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_fe554fcdcb22a77d71c01537" + } + ] + }, + "dwp.uc.two_child_limit.households_disabled_child_element": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.households_disabled_child_element", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 129630.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_535ef3b4afd474ea14d16d27" + } + ] + }, + "dwp.uc.two_child_limit.children_disabled_child_element": { + "status": "active", + "candidates": [ + { + "name": "dwp.uc.two_child_limit.children_disabled_child_element", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 479460.0, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_ac642b7002518167b56e1537" + } + ] + }, + "ons.population.uk_total": { + "status": "active", + "candidates": [ + { + "name": "ons.population.uk_total", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 69281437.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_6c212695ea75be0d2a635e9b" + } + ] + }, + "ons.population.age_0_9_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_0_9_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 7553013.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0e19ecf4b9c7d7a9900bffdf" + } + ] + }, + "ons.population.age_10_19_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_10_19_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 8331437.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_056705672c64e72f531c221b" + } + ] + }, + "ons.population.age_20_29_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_20_29_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 8715225.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_042a0452abe737cbcc2d7826" + } + ] + }, + "ons.population.age_30_39_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_30_39_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 9572397.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_2734cfcd60cab009d837006f" + } + ] + }, + "ons.population.age_40_49_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_40_49_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 8622506.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1940860d399a82f4953535b7" + } + ] + }, + "ons.population.age_50_59_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_50_59_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 9036816.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_13df792a886048bb2e017b3e" + } + ] + }, + "ons.population.age_60_69_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_60_69_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 7861034.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b10577c910ab5947a3a3bd6" + } + ] + }, + "ons.population.age_70_79_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_70_79_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 5998605.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_00e6f6b5b503ef40b6cbf115" + } + ] + }, + "ons.population.age_80_89_by_region": { + "status": "active", + "candidates": [ + { + "name": "ons.population.age_80_89_by_region", + "status": "active", + "matched_fact_count_overall": 20, + "matched_fact_count_at_or_before_period": 20, + "resolved_period": 2025, + "resolved_value": 2965168.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_276abb5d5c7c00362cf78f33" + } + ] + }, + "ons.population.female_0_4": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_0_4", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1744355.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_14a33ace3e56eb04af5d87e2" + } + ] + }, + "ons.population.female_10_14": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_10_14", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2052052.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_69562b00dd7ef3ef3809099d" + } + ] + }, + "ons.population.female_15_19": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_15_19", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2002835.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_39672ee0d1ba0e02ee364c96" + } + ] + }, + "ons.population.female_20_24": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_20_24", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2034609.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0d03f42e5a79ed4d112f75ec" + } + ] + }, + "ons.population.female_25_29": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_25_29", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2291610.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_338ba5d59faea729e03e51b2" + } + ] + }, + "ons.population.female_30_34": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_30_34", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2463301.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_336866742a8407c730f81183" + } + ] + }, + "ons.population.female_35_39": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_35_39", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2472291.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_4f49ba3ae81ec559c7398ffc" + } + ] + }, + "ons.population.female_40_44": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_40_44", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2333109.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_7859c22fe4165e9485429122" + } + ] + }, + "ons.population.female_45_49": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_45_49", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2088285.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1c2c4f630fa703234d347657" + } + ] + }, + "ons.population.female_50_54": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_50_54", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2255231.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_46413aa8f6dcd7af317652d0" + } + ] + }, + "ons.population.female_55_59": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_55_59", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2360202.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_461f5d83eddd94c18f5012bd" + } + ] + }, + "ons.population.female_5_9": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_5_9", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1941658.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1d7696486b18cf31492cf093" + } + ] + }, + "ons.population.female_60_64": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_60_64", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2193915.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_2363408a28ac0f04f37a7abb" + } + ] + }, + "ons.population.female_65_69": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_65_69", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1838574.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_5639c42596c626737c3d636b" + } + ] + }, + "ons.population.female_70_74": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_70_74", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1622996.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0b9535bcf00bdc5d3799040b" + } + ] + }, + "ons.population.female_75_79": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_75_79", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1551183.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_21695e80cb8e5cc51ca40d00" + } + ] + }, + "ons.population.female_80_84": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_80_84", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1024480.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_29dc57985627ae76af0982b8" + } + ] + }, + "ons.population.female_85_89": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_85_89", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 665267.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_062c21fd48c78155323c1909" + } + ] + }, + "ons.population.female_90_plus": { + "status": "active", + "candidates": [ + { + "name": "ons.population.female_90_plus", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 414716.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_009d5dd487f317483e9d7b3d" + } + ] + }, + "ons.population.male_0_4": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_0_4", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1829801.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_09e0a2d15c8f38d824915eb8" + } + ] + }, + "ons.population.male_10_14": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_10_14", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2152800.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_224df58ddebb1d0487ed7392" + } + ] + }, + "ons.population.male_15_19": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_15_19", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2123750.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b9d5e734a49a6e40c2372f5" + } + ] + }, + "ons.population.male_20_24": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_20_24", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2131646.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_57f4c483dce77b29592b4a5a" + } + ] + }, + "ons.population.male_25_29": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_25_29", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2257360.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_25a1eab35b7fc183d3840893" + } + ] + }, + "ons.population.male_30_34": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_30_34", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2333326.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_49f185aef55e9fe5d593a3ec" + } + ] + }, + "ons.population.male_35_39": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_35_39", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2303479.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_75f8a8ec8fee89fe6fc9c442" + } + ] + }, + "ons.population.male_40_44": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_40_44", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2196013.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_260f74dc33a844072323920a" + } + ] + }, + "ons.population.male_45_49": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_45_49", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2005099.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b027f41f03030f8efe0d79b" + } + ] + }, + "ons.population.male_50_54": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_50_54", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2164862.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_40adbc7adb975592e807d0ae" + } + ] + }, + "ons.population.male_55_59": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_55_59", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2256521.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0e114e47a57d10fc54609670" + } + ] + }, + "ons.population.male_5_9": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_5_9", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2037199.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_404750682cef86219e756295" + } + ] + }, + "ons.population.male_60_64": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_60_64", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 2094462.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1f9b2912ecff29a76b1c72b8" + } + ] + }, + "ons.population.male_65_69": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_65_69", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1734083.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_25d519d64483ae31cf018715" + } + ] + }, + "ons.population.male_70_74": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_70_74", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1473758.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0d81360984ebade7169a9ae0" + } + ] + }, + "ons.population.male_75_79": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_75_79", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 1350668.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_14458a77bb7a0723408b86f2" + } + ] + }, + "ons.population.male_80_84": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_80_84", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 815910.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_042ccd2b5c0becef2c35911d" + } + ] + }, + "ons.population.male_85_89": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_85_89", + "status": "active", + "matched_fact_count_overall": 10, + "matched_fact_count_at_or_before_period": 10, + "resolved_period": 2025, + "resolved_value": 459511.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_092abe3c418343972da4d863" + } + ] + }, + "ons.population.male_90_plus": { + "status": "active", + "candidates": [ + { + "name": "ons.population.male_90_plus", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 210520.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_8ec6d2d034546c9693c4f6ed" + } + ] + }, + "ons.population.scotland_children_under_16": { + "status": "active", + "candidates": [ + { + "name": "ons.population.scotland_children_under_16", + "status": "active", + "matched_fact_count_overall": 32, + "matched_fact_count_at_or_before_period": 32, + "resolved_period": 2025, + "resolved_value": 896833.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_001f7a945bd3844e6fcc5b0e" + } + ] + }, + "ons.population.scotland_babies_under_1": { + "status": "active", + "candidates": [ + { + "name": "ons.population.scotland_babies_under_1", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 46776.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_edd043df0081e63ad0876932" + } + ] + }, + "ons.population.scotland_households_3plus_children": { + "status": "multi_fact", + "candidates": [ + { + "name": "ons/scotland_households_3plus_children", + "status": "multi_fact", + "matched_fact_count_overall": 6, + "matched_fact_count_at_or_before_period": 6, + "error": "ledger_reference_compile_status_multi_fact" + } + ] + }, + "ons.household_composition.lone_households_under_65": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.lone_households_under_65", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 4316000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_b9e5e398b210a3ea68426ecf" + } + ] + }, + "ons.household_composition.lone_households_over_65": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.lone_households_over_65", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 4254000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_64eb1c1c056801b5d35b4d54" + } + ] + }, + "ons.household_composition.unrelated_adult_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.unrelated_adult_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 813000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_b376430d8bd3c235b6700e8e" + } + ] + }, + "ons.household_composition.couple_no_children_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.couple_no_children_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 8119000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_6b742175372b64a00bc0f099" + } + ] + }, + "ons.household_composition.couple_under_3_children_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.couple_under_3_children_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 5439000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_076e38042145c010a7559f88" + } + ] + }, + "ons.household_composition.couple_3_plus_children_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.couple_3_plus_children_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 931000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_e8702e666eefe9371822496a" + } + ] + }, + "ons.household_composition.couple_non_dependent_children_only_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.couple_non_dependent_children_only_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 1848000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_f8816414af21bafd4920fe77" + } + ] + }, + "ons.household_composition.lone_parent_dependent_children_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.lone_parent_dependent_children_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 1835000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_c4cbf7c83596d1e7fdb04d9f" + } + ] + }, + "ons.household_composition.lone_parent_non_dependent_children_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.lone_parent_non_dependent_children_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 1204000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_207a9bb610afeb3f75f58baa" + } + ] + }, + "ons.household_composition.multi_family_households": { + "status": "active", + "candidates": [ + { + "name": "ons.household_composition.multi_family_households", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 244000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_59100f5ffbe83b5a59271e60" + } + ] + }, + "voa.council_tax_stock.band_a": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_a", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 6103320.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_401f12d7af649e0fd5779ac4" + } + ] + }, + "scotgov.council_tax_stock.band_a": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_a", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_b": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_b", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5016580.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_56854712efa30950d408790e" + } + ] + }, + "scotgov.council_tax_stock.band_b": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_b", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_c": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_c", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5654450.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_fc068d151c19fb214f6df036" + } + ] + }, + "scotgov.council_tax_stock.band_c": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_c", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_d": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_d", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4035220.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_0eb041a728d3c583d0687fbd" + } + ] + }, + "scotgov.council_tax_stock.band_d": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_d", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_e": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_e", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2528140.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_b0fdb6a16964ec71bf031981" + } + ] + }, + "scotgov.council_tax_stock.band_e": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_e", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_f": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_f", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1343220.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_a99d214f6f55e7f54a423a71" + } + ] + }, + "scotgov.council_tax_stock.band_f": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_f", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_g": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_g", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 911160.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_5d2bfddb2effd2adc195fcb5" + } + ] + }, + "scotgov.council_tax_stock.band_g": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_g", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.band_h": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.band_h", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 154470.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_67f3a58d14df489820a9f9ab" + } + ] + }, + "scotgov.council_tax_stock.band_h": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.band_h", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "voa.council_tax_stock.total": { + "status": "active", + "candidates": [ + { + "name": "voa.council_tax_stock.total", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 25746570.0, + "resolved_fact_period": "2025-03", + "resolved_fact_key": "ledger_aggregate_fact_v2_a9db0e47afe1d9b6eca42b97" + } + ] + }, + "scotgov.council_tax_stock.total": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.council_tax_stock.total", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "scotgov.scottish_child_payment_spending": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "scotgov.scottish_child_payment_spending", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "ons.savings_interest_income": { + "status": "active", + "candidates": [ + { + "name": "ons.savings_interest_income", + "status": "active", + "matched_fact_count_overall": 8, + "matched_fact_count_at_or_before_period": 8, + "resolved_period": 2025, + "resolved_value": 95503000000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_8de1806d1330bcb80a1f4988" + } + ] + }, + "ons.public_sector_employment": { + "status": "active", + "candidates": [ + { + "name": "ons.public_sector_employment", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 6146000.0, + "resolved_fact_period": "2024-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ff79b4e2301f564ec4203235" + } + ] + }, + "ons.land.land_value": { + "status": "active", + "candidates": [ + { + "name": "ons.land.land_value", + "status": "active", + "matched_fact_count_overall": 30, + "matched_fact_count_at_or_before_period": 30, + "resolved_period": 2025, + "resolved_value": 7117771000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_4daf8d1b8830f72bba924d56" + } + ] + }, + "ons.land.household_land_value": { + "status": "active", + "candidates": [ + { + "name": "ons.land.household_land_value", + "status": "active", + "matched_fact_count_overall": 30, + "matched_fact_count_at_or_before_period": 30, + "resolved_period": 2025, + "resolved_value": 4559831000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0e5f9867ab377dffd8a8941f" + } + ] + }, + "ons.land.corporate_land_value": { + "status": "active", + "candidates": [ + { + "name": "ons.land.corporate_land_value", + "status": "active", + "matched_fact_count_overall": 30, + "matched_fact_count_at_or_before_period": 30, + "resolved_period": 2025, + "resolved_value": 2103053000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_ab561a17be0af52de30cca88" + } + ] + }, + "slc.repayments.devolved_total": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.repayments.devolved_total", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.repayments.england_total_higher_education": { + "status": "active", + "candidates": [ + { + "name": "slc.repayments.england_total_higher_education", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5018231834.949999, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_b947d1f3c3659d252194c102" + } + ] + }, + "slc.repayments.england_plan_1": { + "status": "active", + "candidates": [ + { + "name": "slc.repayments.england_plan_1", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1852699178.55, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_1d9680e6eaf243227fed5ef2" + } + ] + }, + "slc.repayments.england_plan_2": { + "status": "active", + "candidates": [ + { + "name": "slc.repayments.england_plan_2", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 2778253361.64, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_5c8d18b2366a234482594297" + } + ] + }, + "slc.repayments.england_postgraduate": { + "status": "active", + "candidates": [ + { + "name": "slc.repayments.england_postgraduate", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 346409713.95000005, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0d0ef6ca9882046f4b79b739" + } + ] + }, + "slc.repayments.england_plan_5": { + "status": "active", + "candidates": [ + { + "name": "slc.repayments.england_plan_5", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 40869580.81, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_0a43ec6d32083e092bcee693" + } + ] + }, + "slc.borrowers.plan_2_above_threshold": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.borrowers.plan_2_above_threshold", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.borrowers.plan_2_liable": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.borrowers.plan_2_liable", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.borrowers.plan_5_above_threshold": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.borrowers.plan_5_above_threshold", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.borrowers.plan_5_liable": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.borrowers.plan_5_liable", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.support.maintenance_loan_recipients": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.support.maintenance_loan_recipients", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.support.maintenance_loan_spend": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.support.maintenance_loan_spend", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.support.parents_learning_allowance_recipients": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.support.parents_learning_allowance_recipients", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.support.parents_learning_allowance_spend": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.support.parents_learning_allowance_spend", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.support.adult_dependants_grant_recipients": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.support.adult_dependants_grant_recipients", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "slc.support.adult_dependants_grant_spend": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "slc.support.adult_dependants_grant_spend", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + }, + "dwp.uc.households": { + "status": "no_fact_at_or_before_period", + "candidates": [ + { + "name": "dwp.uc.households", + "status": "no_fact_at_or_before_period", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + } + ] + } + }, + "fanout_family_outcomes": [ + { + "family": "hmrc_spi", + "status": "active_with_signed_property_amount_exclusion", + "active_reference_count": 143, + "signed_rationale": "SPI income-band targets fan out by strict total-income-band dimension pins, except the HMRC property-income amount surface. Those 13 rows are signed out because Ledger carries the official SPI Table 3.7 net property-income amounts, while the incumbent target applies the populace-side x1.9 property-income undercount adjustment traced to policyengine-uk-data PR #311 / issue #230 and HMRC Property Rental Income Statistics." + }, + { + "family": "dwp_universal_credit", + "status": "active_with_unmapped_vintage_residue_skipped", + "active_reference_count": 100, + "skipped_unmapped_fact_count": 12, + "signed_rationale": "UC payment-distribution targets fan out over family_type and monthly_award_amount_bands into incumbent-compatible annual-payment rows. The four source-only 'No payment' facts and eight overlapping source-only 'or over' facts are left out; no active reference may use the legacy nan_to_nan band name." + }, + { + "family": "council_tax_stock", + "status": "active_declared_rows", + "active_reference_count": 9, + "signed_rationale": "VOA council-tax stock bands are declared as nine explicit target rows, including total, and each resolves with its country-level geography and band pin." + } + ], + "signed_exclusion_rationales": [ + { + "family": "hmrc_spi", + "target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "status": "signed_excluded", + "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is policyengine-uk-data PR #311 / issue policyengine-uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." + } + ], + "multi_fact_rationales": [ + { + "family": "ons_population", + "target_id": "ons.population.scotland_households_3plus_children", + "candidate_name": "ons/scotland_households_3plus_children", + "status": "adjudication_pending", + "signed_rationale": "Remaining multi_fact is genuine: the selector reaches ONS mid-year population age rows for Scotland across six eligible periods, while the contract target is a household count with three or more children. No Ledger household-composition fact at or before 2025 is selected by the current contract, so Microcosm must not adjudicate a replacement source here." + } + ] +} 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 10c1ac1e4..bfc678d85 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -1,25 +1,8769 @@ { "country": "uk", - "description": "UK active-subset Ledger target references for the national 2023 spine. Rows are generated from uk_national_targets.json: name is the contract target_id; ledger_selector is the contract selector plus geography_level country for the first national activation; entity is from_entity, then map_to, then household; measure is bindings.policyengine.metric_name; family is the contract family; period is 2023; metadata.contract_target_id points back to the contract row. Observed values stay in Ledger facts and resolve by identity only. Deferred classes are recorded in .codex-work/membership_report.json: no fact at or before 2023, multi-fact sum resolution pending, source-projection policy pending, country-level geography ambiguity, or missing/non-finite fact values. Measures name prepared columns, not raw model variables: each reference's measure is the slash-named column the microcosm#622 UK materializer must prepare on the reference's entity table from the contract binding payload (value_variable plus filters/conditions) referenced by metadata.contract_target_id, following the US prepared-indicator-column doctrine (target_spec_from_ledger_reference: count-like facts are sums of prepared indicator columns; the JCT materializer names household columns after their targets). metadata.measure_kind records this on every row. Activation is resolve-or-defer, not resolve-or-fail: a dimension pin whose type disagrees with the fact's value (float 5.0 vs int 5) deactivates the target rather than erroring - when a target is unexpectedly inactive, check the authoring-run membership report on the PR before suspecting the feed. Empty pin or membership lists are refused at resolve time.", + "description": "UK active-subset Ledger target references for the FRS 2024-25 line. Rows are generated from uk_national_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 2025 (opening-year convention for the FRS 2024-25 survey line). Observed values stay in Ledger facts and resolve by identity unless the reference declares value_operation=sum for a genuine multi-fact residue. 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" + "identity", + "sum", + "calendar_year_average", + "latest_plateau" ], "target_references": [ + { + "name": "obr.income_tax", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.income_tax", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/income_tax", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.income_tax", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.ni", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.ni_total", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/ni", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.ni", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.ni_employee", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.ni_employee", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/ni_employee", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.ni_employee", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.ni_employer", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.ni_employer", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/ni_employer", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.ni_employer", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.ni_self_employed", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.ni_self_employed", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/ni_self_employed", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.ni_self_employed", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.vat", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.vat", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/vat", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.vat", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.fuel_duties", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.fuel_duties", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/fuel_duties", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.fuel_duties", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.capital_gains_tax", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.capital_gains_tax", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/capital_gains_tax", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.capital_gains_tax", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.sdlt", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.sdlt", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/sdlt", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.sdlt", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.attendance_allowance", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.attendance_allowance", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/attendance_allowance", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.attendance_allowance", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.carers_allowance", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.carers_allowance", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/carers_allowance", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.carers_allowance", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.child_benefit", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.child_benefit", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "benunit", + "measure": "obr/child_benefit", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.child_benefit", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.council_tax", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.council_tax_total", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/council_tax", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.council_tax", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.esa", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.incapacity_benefits", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/esa", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.esa", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection", + "value_operation": "sum" + }, + { + "name": "obr.housing_benefit", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.housing_benefit", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "benunit", + "measure": "obr/housing_benefit", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.housing_benefit", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.jobseekers_allowance", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.jobseekers_allowance", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "benunit", + "measure": "obr/jobseekers_allowance", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.jobseekers_allowance", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.pension_credit", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.pension_credit", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "benunit", + "measure": "obr/pension_credit", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.pension_credit", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.pip", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.dla_and_pip", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/pip", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.pip", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.state_pension", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.state_pension", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/state_pension", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.state_pension", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.statutory_maternity_pay", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.statutory_maternity_pay", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/statutory_maternity_pay", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.statutory_maternity_pay", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.tv_licence_fee", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.tv_licence_fee", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/tv_licence_fee", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.tv_licence_fee", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.universal_credit_in_cap", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.universal_credit_in_cap", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "benunit", + "measure": "obr/universal_credit_in_cap", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.universal_credit_in_cap", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.universal_credit_outside_cap", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.universal_credit_outside_cap", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "benunit", + "measure": "obr/universal_credit_outside_cap", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.universal_credit_outside_cap", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, + { + "name": "obr.winter_fuel_allowance", + "ledger_selector": { + "source_name": "obr", + "source_concept": "obr.winter_fuel_payment", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "obr/winter_fuel_allowance", + "family": "obr", + "period": 2025, + "metadata": { + "contract_target_id": "obr.winter_fuel_allowance", + "measure_kind": "prepared_column" + }, + "assertion_policy": "allow_source_projection" + }, { "name": "isc.private_school_students", "ledger_selector": { - "source_name": "isc", - "source_concept": "isc.pupils_at_member_schools", - "geography_level": "country" + "source_name": "isc", + "source_concept": "isc.pupils_at_member_schools", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/private_school_students", + "family": "isc", + "period": 2025, + "metadata": { + "contract_target_id": "isc.private_school_students", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024-01", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.salary_sacrifice.it_relief_basic_rate", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_income_tax_relief_basic_rate", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/salary_sacrifice_it_relief_basic_rate", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_basic_rate", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.salary_sacrifice.it_relief_higher_rate", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_income_tax_relief_higher_rate", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/salary_sacrifice_it_relief_higher_rate", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_higher_rate", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.salary_sacrifice.it_relief_additional_rate", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_income_tax_relief_additional_rate", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/salary_sacrifice_it_relief_additional_rate", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_additional_rate", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.salary_sacrifice.nics_relief_employee", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_nics_relief_employee", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/salary_sacrifice_employee_nics_relief", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employee", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.salary_sacrifice.nics_relief_employer", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.ss_nics_relief_employer", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/salary_sacrifice_employer_nics_relief", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employer", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.salary_sacrifice.users_total", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.salary_sacrifice_pension_users", + "dimension_values": { + "salary_sacrifice_threshold_position": "all" + }, + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/salary_sacrifice_users_total", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.users_total", + "measure_kind": "prepared_column" + } + }, + { + "name": "hmrc.salary_sacrifice.users_below_cap", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.salary_sacrifice_pension_users", + "dimension_values": { + "salary_sacrifice_threshold_position": "within_2000" + }, + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/salary_sacrifice_users_below_cap", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.users_below_cap", + "measure_kind": "prepared_column" + } + }, + { + "name": "hmrc.salary_sacrifice.users_above_cap", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.salary_sacrifice_pension_users", + "dimension_values": { + "salary_sacrifice_threshold_position": "above_2000" + }, + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "obr/salary_sacrifice_users_above_cap", + "family": "hmrc_salary_sacrifice", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.salary_sacrifice.users_above_cap", + "measure_kind": "prepared_column" + } + }, + { + "name": "hmrc/employment_income_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/employment_income_count_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/self_employment_income_count_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_self_employment_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/self_employment_income_count_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.self_employment_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/dividend_income_count_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_dividend_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/dividend_income_count_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.dividend_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_count_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_count_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/private_pension_income_count_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_private_pension_income_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/private_pension_income_count_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.private_pension_income.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_amount", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/state_pension_count_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_state_pension_count", + "groupby_dimension": "hmrc.total_income_band", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/state_pension_count_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.state_pension.count_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.cgt.taxpayers_total", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.cgt_taxpayers_total", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/cgt_taxpayers", + "family": "hmrc_cgt", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.cgt.taxpayers_total", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc.cgt.gains_total", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.cgt_gains_total", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/capital_gains_total", + "family": "hmrc_cgt", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.cgt.gains_total", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "dwp.benefit_cap.capped_households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_capped_households_total", + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/benefit_capped_households", + "family": "dwp_benefit_cap", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.benefit_cap.capped_households", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-11", + "uprating_to_period": 2025 + }, + { + "name": "dwp.esa_claimants", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.esa_claimants", + "dimension_values": { + "esa_claim_type": "all" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/esa_claimants", + "family": "dwp_legacy_benefits", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.esa_claimants", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-08", + "uprating_to_period": 2025 + }, + { + "name": "dwp.esa_contrib_claimants", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.esa_claimants", + "dimension_values": { + "esa_claim_type": "contributions_based" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/esa_contrib_claimants", + "family": "dwp_legacy_benefits", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.esa_contrib_claimants", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-08", + "uprating_to_period": 2025 + }, + { + "name": "dwp.esa_income_claimants", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.esa_claimants", + "dimension_values": { + "esa_claim_type": "income_related" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/esa_income_claimants", + "family": "dwp_legacy_benefits", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.esa_income_claimants", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-08", + "uprating_to_period": 2025 + }, + { + "name": "dwp.jsa_claimants", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.jsa_claimants", + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "person", + "measure": "dwp/jsa_claimants", + "family": "dwp_legacy_benefits", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.jsa_claimants", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-08", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_children_1", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_number_of_children", + "dimension_values": { + "number_of_children": 1 + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_with_1_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_children_1", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_children_2", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_number_of_children", + "dimension_values": { + "number_of_children": 2 + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_with_2_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_children_2", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_children_3", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_number_of_children", + "dimension_values": { + "number_of_children": 3 + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_with_3_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_children_3", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_children_4", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_number_of_children", + "dimension_values": { + "number_of_children": 4 + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_with_4_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_children_4", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_children_5_or_more", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_number_of_children", + "dimension_values": { + "number_of_children": "5 or more" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_with_5+_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_children_5_or_more", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_single_no_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_family_type", + "dimension_values": { + "family_type": "Single, no children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_single_no_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_single_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_single_with_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_family_type", + "dimension_values": { + "family_type": "Single, with children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_single_with_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_single_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_couple_no_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_family_type", + "dimension_values": { + "family_type": "Couple, no children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_couple_no_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households_couple_with_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_family_type", + "dimension_values": { + "family_type": "Couple, with children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/claimants_couple_with_children", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, no children", + "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_single", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Single, with children", + "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_lone_parent", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, no children", + "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_monthly_award_band", + "dimension_values": { + "family_type": "Couple, with children", + "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.scotland_households_child_under_1", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_households", + "groupby_dimension": "dwp.uc_youngest_child_age", + "dimension_values": { + "age_of_youngest_child_bands_and_single_year": 0 + }, + "geography_level": "country", + "geography_id": "S92000003" + }, + "entity": "household", + "measure": "dwp/scotland_uc_households_child_under_1", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.scotland_households_child_under_1", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-05", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_affected", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_headline_households_affected", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/households_affected", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_affected", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_affected", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_headline_children_affected_by_policy", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/children_affected", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_affected", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_in_affected_households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_headline_children_within_affected_households", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/children_in_affected_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_in_affected_households", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_3_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_households_by_children_3", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/3_children_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_3_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_in_3_children_households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_children_by_children_3", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/3_children_households_total_children", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_in_3_children_households", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_4_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_households_by_children_4", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/4_children_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_4_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_in_4_children_households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_children_by_children_4", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/4_children_households_total_children", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_in_4_children_households", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_households_by_children_5", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/5_children_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_5_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_in_5_children_households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_children_by_children_5", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/5_children_households_total_children", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_in_5_children_households", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_households_by_children_6_plus", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/6_children_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_6_plus_children", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_in_6_plus_children_households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_children_by_children_6_plus", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/6_children_households_total_children", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_in_6_plus_children_households", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_claimant_pip", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_households_by_disability_claimant_pip", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/adult_pip_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_claimant_pip", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_claimant_pip", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_children_by_disability_claimant_pip", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/adult_pip_children", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_claimant_pip", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.households_disabled_child_element", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_households_by_disability_disabled_child_element", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/disabled_child_element_households", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.households_disabled_child_element", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.two_child_limit.children_disabled_child_element", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_tcl_children_by_disability_disabled_child_element", + "dimension_values": { + "two_child_limit_status": "affected_3plus_children" + }, + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "household", + "measure": "dwp/uc/two_child_limit/disabled_child_element_children", + "family": "dwp_two_child_limit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.two_child_limit.children_disabled_child_element", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.uk_total", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimensions": [], + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "ons/uk_population", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.uk_total", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_0_9_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/0_9", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_0_9_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_10_19_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/10_19", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_10_19_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_20_29_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/20_29", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_20_29_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_30_39_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/30_39", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_30_39_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_40_49_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/40_49", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_40_49_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_50_59_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/50_59", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_50_59_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_60_69_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/60_69", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_60_69_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_70_79_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/70_79", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_70_79_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.age_80_89_by_region", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/regional_age/80_89", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.age_80_89_by_region", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_0_4", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 0, + 1, + 2, + 3, + 4 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_0_4", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_0_4", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_10_14", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 10, + 11, + 12, + 13, + 14 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_10_14", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_10_14", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_15_19", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 15, + 16, + 17, + 18, + 19 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_15_19", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_15_19", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_20_24", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 20, + 21, + 22, + 23, + 24 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_20_24", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_20_24", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_25_29", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 25, + 26, + 27, + 28, + 29 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_25_29", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_25_29", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_30_34", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 30, + 31, + 32, + 33, + 34 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_30_34", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_30_34", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_35_39", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 35, + 36, + 37, + 38, + 39 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_35_39", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_35_39", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_40_44", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 40, + 41, + 42, + 43, + 44 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_40_44", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_40_44", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_45_49", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 45, + 46, + 47, + 48, + 49 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_45_49", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_45_49", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_50_54", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 50, + 51, + 52, + 53, + 54 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_50_54", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_50_54", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_55_59", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 55, + 56, + 57, + 58, + 59 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_55_59", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_55_59", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_5_9", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 5, + 6, + 7, + 8, + 9 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_5_9", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_5_9", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_60_64", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 60, + 61, + 62, + 63, + 64 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_60_64", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_60_64", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_65_69", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 65, + 66, + 67, + 68, + 69 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_65_69", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_65_69", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_70_74", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 70, + 71, + 72, + 73, + 74 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_70_74", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_70_74", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_75_79", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 75, + 76, + 77, + 78, + 79 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_75_79", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_75_79", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_80_84", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 80, + 81, + 82, + 83, + 84 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_80_84", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_80_84", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_85_89", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + 85, + 86, + 87, + 88, + 89 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_85_89", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_85_89", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.female_90_plus", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ + "90_plus" + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/female_90_plus", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.female_90_plus", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_0_4", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 0, + 1, + 2, + 3, + 4 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_0_4", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_0_4", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_10_14", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 10, + 11, + 12, + 13, + 14 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_10_14", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_10_14", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_15_19", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 15, + 16, + 17, + 18, + 19 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_15_19", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_15_19", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_20_24", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 20, + 21, + 22, + 23, + 24 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_20_24", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_20_24", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_25_29", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 25, + 26, + 27, + 28, + 29 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_25_29", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_25_29", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_30_34", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 30, + 31, + 32, + 33, + 34 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_30_34", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_30_34", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_35_39", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 35, + 36, + 37, + 38, + 39 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_35_39", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_35_39", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_40_44", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 40, + 41, + 42, + 43, + 44 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_40_44", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_40_44", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_45_49", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 45, + 46, + 47, + 48, + 49 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_45_49", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_45_49", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_50_54", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 50, + 51, + 52, + 53, + 54 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_50_54", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_50_54", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_55_59", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 55, + 56, + 57, + 58, + 59 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_55_59", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_55_59", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_5_9", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 5, + 6, + 7, + 8, + 9 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_5_9", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_5_9", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_60_64", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 60, + 61, + 62, + 63, + 64 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_60_64", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_60_64", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_65_69", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 65, + 66, + 67, + 68, + 69 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_65_69", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_65_69", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_70_74", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 70, + 71, + 72, + 73, + 74 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] }, "entity": "person", - "measure": "obr/private_school_students", - "family": "isc", - "period": 2023, + "measure": "ons/male_70_74", + "family": "ons_population", + "period": 2025, "metadata": { - "contract_target_id": "isc.private_school_students", + "contract_target_id": "ons.population.male_70_74", "measure_kind": "prepared_column" - } + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_75_79", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 75, + 76, + 77, + 78, + 79 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_75_79", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_75_79", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_80_84", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 80, + 81, + 82, + 83, + 84 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_80_84", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_80_84", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_85_89", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + 85, + 86, + 87, + 88, + 89 + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_85_89", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_85_89", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.male_90_plus", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ + "90_plus" + ] + }, + "geography_level": "country", + "geography_id": "K02000001", + "dimensions": [ + "age", + "sex" + ] + }, + "entity": "person", + "measure": "ons/male_90_plus", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.male_90_plus", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.scotland_children_under_16", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + }, + "geography_level": "country", + "geography_id": "S92000003", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/scotland_children_under_16", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.scotland_children_under_16", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.population.scotland_babies_under_1", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "age": [ + 0 + ] + }, + "geography_level": "country", + "geography_id": "S92000003", + "dimensions": [ + "age" + ] + }, + "entity": "person", + "measure": "ons/scotland_babies_under_1", + "family": "ons_population", + "period": 2025, + "metadata": { + "contract_target_id": "ons.population.scotland_babies_under_1", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 }, { "name": "ons.household_composition.lone_households_under_65", @@ -30,12 +8774,13 @@ "dimension_values": { "household_type": "lone_households_under_65" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/lone_households_under_65", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.lone_households_under_65", "measure_kind": "prepared_column" @@ -50,12 +8795,13 @@ "dimension_values": { "household_type": "lone_households_over_65" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/lone_households_over_65", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.lone_households_over_65", "measure_kind": "prepared_column" @@ -70,12 +8816,13 @@ "dimension_values": { "household_type": "unrelated_adult_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/unrelated_adult_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.unrelated_adult_households", "measure_kind": "prepared_column" @@ -90,12 +8837,13 @@ "dimension_values": { "household_type": "couple_no_children_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/couple_no_children_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.couple_no_children_households", "measure_kind": "prepared_column" @@ -110,12 +8858,13 @@ "dimension_values": { "household_type": "couple_under_3_children_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/couple_under_3_children_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.couple_under_3_children_households", "measure_kind": "prepared_column" @@ -130,12 +8879,13 @@ "dimension_values": { "household_type": "couple_3_plus_children_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/couple_3_plus_children_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.couple_3_plus_children_households", "measure_kind": "prepared_column" @@ -150,12 +8900,13 @@ "dimension_values": { "household_type": "couple_non_dependent_children_only_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/couple_non_dependent_children_only_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.couple_non_dependent_children_only_households", "measure_kind": "prepared_column" @@ -170,12 +8921,13 @@ "dimension_values": { "household_type": "lone_parent_dependent_children_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/lone_parent_dependent_children_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.lone_parent_dependent_children_households", "measure_kind": "prepared_column" @@ -190,12 +8942,13 @@ "dimension_values": { "household_type": "lone_parent_non_dependent_children_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/lone_parent_non_dependent_children_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.lone_parent_non_dependent_children_households", "measure_kind": "prepared_column" @@ -210,28 +8963,201 @@ "dimension_values": { "household_type": "multi_family_households" }, - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "household", "measure": "ons/multi_family_households", "family": "ons_household_composition", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.household_composition.multi_family_households", "measure_kind": "prepared_column" } }, + { + "name": "voa.council_tax_stock.band_a", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_a", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_a", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_a", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_b", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_b", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_b", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_b", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_c", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_c", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_c", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_c", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_d", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_d", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_d", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_d", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_e", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_e", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_e", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_e", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_f", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_f", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_f", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_f", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_g", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_g", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_g", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_g", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.band_h", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "band_h", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/band_h", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.band_h", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, + { + "name": "voa.council_tax_stock.total", + "ledger_selector": { + "source_name": "voa", + "source_measure_id": "all_properties", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "voa/council_tax/total", + "family": "council_tax_stock", + "period": 2025, + "metadata": { + "contract_target_id": "voa.council_tax_stock.total", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2025-03", + "uprating_to_period": 2025 + }, { "name": "ons.savings_interest_income", "ledger_selector": { "source_name": "ons", "source_concept": "ons.ukea_haxv", - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "person", "measure": "ons/savings_interest_income", "family": "ons_national_accounts", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.savings_interest_income", "measure_kind": "prepared_column" @@ -242,48 +9168,194 @@ "ledger_selector": { "source_name": "ons", "source_measure_id": "total_public_sector", - "geography_level": "country" + "geography_level": "country", + "geography_id": "K02000001" }, "entity": "person", "measure": "ons/public_sector_employment", "family": "ons_employment", - "period": 2023, + "period": 2025, "metadata": { "contract_target_id": "ons.public_sector_employment", "measure_kind": "prepared_column" - } + }, + "uprating_from_period": "2024-12", + "uprating_to_period": 2025 }, { - "name": "dwp.uc.households", + "name": "ons.land.land_value", "ledger_selector": { - "source_name": "dwp", - "source_concept": "dwp.uc_benefit_units", - "geography_level": "country" + "source_name": "ons", + "source_concept": "ons.e44r", + "geography_level": "country", + "geography_id": "K02000001" }, - "entity": "benunit", - "measure": "dwp/uc/households", - "family": "dwp_universal_credit", + "entity": "household", + "measure": "ons/land_value", + "family": "ons_land", "period": 2025, "metadata": { - "contract_target_id": "dwp.uc.households", + "contract_target_id": "ons.land.land_value", "measure_kind": "prepared_column" - } + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 }, { - "name": "obr.universal_credit_in_cap", + "name": "ons.land.household_land_value", "ledger_selector": { - "source_name": "obr", - "source_concept": "obr.universal_credit_in_cap", - "geography_level": "country" + "source_name": "ons", + "source_concept": "ons.e44n", + "geography_level": "country", + "geography_id": "K02000001" }, - "entity": "benunit", - "measure": "obr/universal_credit_in_cap", - "family": "obr", + "entity": "household", + "measure": "ons/household_land_value", + "family": "ons_land", "period": 2025, "metadata": { - "contract_target_id": "obr.universal_credit_in_cap", + "contract_target_id": "ons.land.household_land_value", "measure_kind": "prepared_column" - } + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "ons.land.corporate_land_value", + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.e43b", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "household", + "measure": "ons/corporate_land_value", + "family": "ons_land", + "period": 2025, + "metadata": { + "contract_target_id": "ons.land.corporate_land_value", + "measure_kind": "prepared_column" + }, + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "slc.repayments.england_total_higher_education", + "ledger_selector": { + "source_name": "slc", + "groupby_dimension": "slc.repayment_plan", + "source_measure_id": [ + "total_higher_education" + ], + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "slc/student_loan_repayment/england", + "family": "slc_repayments", + "period": 2025, + "metadata": { + "contract_target_id": "slc.repayments.england_total_higher_education", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "slc.repayments.england_plan_1", + "ledger_selector": { + "source_name": "slc", + "groupby_dimension": "slc.repayment_plan", + "source_measure_id": [ + "plan_1" + ], + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "slc/student_loan_repayment/england/plan_1", + "family": "slc_repayments", + "period": 2025, + "metadata": { + "contract_target_id": "slc.repayments.england_plan_1", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "slc.repayments.england_plan_2", + "ledger_selector": { + "source_name": "slc", + "groupby_dimension": "slc.repayment_plan", + "source_measure_id": [ + "plan_2_full_time", + "plan_2_part_time" + ], + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "slc/student_loan_repayment/england/plan_2", + "family": "slc_repayments", + "period": 2025, + "metadata": { + "contract_target_id": "slc.repayments.england_plan_2", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "slc.repayments.england_postgraduate", + "ledger_selector": { + "source_name": "slc", + "groupby_dimension": "slc.repayment_plan", + "source_measure_id": [ + "plan_3_postgraduate_masters", + "plan_3_postgraduate_doctoral" + ], + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "slc/student_loan_repayment/england/postgraduate", + "family": "slc_repayments", + "period": 2025, + "metadata": { + "contract_target_id": "slc.repayments.england_postgraduate", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 + }, + { + "name": "slc.repayments.england_plan_5", + "ledger_selector": { + "source_name": "slc", + "groupby_dimension": "slc.repayment_plan", + "source_measure_id": [ + "plan_5_full_time", + "plan_5_part_time" + ], + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "slc/student_loan_repayment/england/plan_5", + "family": "slc_repayments", + "period": 2025, + "metadata": { + "contract_target_id": "slc.repayments.england_plan_5", + "measure_kind": "prepared_column" + }, + "value_operation": "sum", + "uprating_from_period": "2024", + "uprating_to_period": 2025 } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_national_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_national_targets.json index a018711a6..f36048e62 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_national_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_national_targets.json @@ -387,7 +387,7 @@ "ons/female_70_74": "ons.population.female_70_74", "ons/female_75_79": "ons.population.female_75_79", "ons/female_80_84": "ons.population.female_80_84", - "ons/female_85_90": "ons.population.female_85_90", + "ons/female_85_90": "ons.population.female_85_89", "ons/household_land_value": "ons.land.household_land_value", "ons/land_value": "ons.land.land_value", "ons/london_age_0_9": "ons.population.age_0_9_by_region", @@ -420,7 +420,7 @@ "ons/male_70_74": "ons.population.male_70_74", "ons/male_75_79": "ons.population.male_75_79", "ons/male_80_84": "ons.population.male_80_84", - "ons/male_85_90": "ons.population.male_85_90", + "ons/male_85_90": "ons.population.male_85_89", "ons/multi_family_households": "ons.household_composition.multi_family_households", "ons/north_east_age_0_9": "ons.population.age_0_9_by_region", "ons/north_east_age_10_19": "ons.population.age_10_19_by_region", @@ -674,15 +674,41 @@ "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)." }, "unmapped_declarations": { - "hmrc.salary_sacrifice.it_relief_basic_rate": "New declaration backed by chronicle#139 salary-sacrifice facts; the incumbent source CSV is 410-Gone at ebf733c and its rows were silently suppressed by the bare-except drop in build_loss_matrix.py:376-394.", - "hmrc.salary_sacrifice.it_relief_higher_rate": "New declaration backed by chronicle#139 salary-sacrifice facts; the incumbent source CSV is 410-Gone at ebf733c and its rows were silently suppressed by the bare-except drop in build_loss_matrix.py:376-394.", - "hmrc.salary_sacrifice.it_relief_additional_rate": "New declaration backed by chronicle#139 salary-sacrifice facts; the incumbent source CSV is 410-Gone at ebf733c and its rows were silently suppressed by the bare-except drop in build_loss_matrix.py:376-394." + "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.", + "hmrc.salary_sacrifice.it_relief_higher_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.", + "hmrc.salary_sacrifice.it_relief_additional_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.", + "ons.population.female_90_plus": "María ruling 2026-08-21: split the incumbent terminal sex bands into uniform five-year 85_89 bands plus 90_plus tails. The incumbent six-year 85_90 terminal rows leave ages 91+ unconstrained; Microcosm keeps the uniform five-year bands and constrains the tail. The 85_89-vs-85_90 value gap is the single-age-90 share and is a signed semantic difference.", + "ons.population.male_90_plus": "María ruling 2026-08-21: split the incumbent terminal sex bands into uniform five-year 85_89 bands plus 90_plus tails. The incumbent six-year 85_90 terminal rows leave ages 91+ unconstrained; Microcosm keeps the uniform five-year bands and constrains the tail. The 85_89-vs-85_90 value gap is the single-age-90 share and is a signed semantic difference." + }, + "suppressed_ancestors": { + "hmrc/salary_sacrifice_it_relief_basic_rate": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_basic_rate", + "rationale": "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." + }, + "hmrc/salary_sacrifice_it_relief_higher_rate": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_higher_rate", + "rationale": "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." + }, + "hmrc/salary_sacrifice_it_relief_additional_rate": { + "contract_target_id": "hmrc.salary_sacrifice.it_relief_additional_rate", + "rationale": "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." + }, + "hmrc/salary_sacrifice_employee_nics_relief": { + "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employee", + "rationale": "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." + }, + "hmrc/salary_sacrifice_employer_nics_relief": { + "contract_target_id": "hmrc.salary_sacrifice.nics_relief_employer", + "rationale": "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." + } }, "accounting_notes": { "v1_56_16_refresh": "Compared with ebf733c, the governed registry surface adds dwp/uc/households. The four deleted universal-credit jobseeker dispatch names were not registry rows in the carried contract, so there were no parity entries to remove; obr/jobseekers_allowance remains a distinct published JSA expenditure target.", "cross_level_duplicate_names": "Name-only identity flattens two-level emissions for ons/uk_population, ons/scotland_children_under_16, and ons/scotland_babies_under_1.", - "two_child_limit_year_surface": "The 15 dwp/uc/two_child_limit/* rows are 2026-only; the incumbent effective surface is 636 at calibration year 2025 and 651 at 2026. This is microcosm#622 Fixture-B input because the incumbent cannot self-report the year-specific surface.", - "geography_level_order_canonicalization": "The 9 voa.council_tax_stock.* rows use country, region order to match the rest of the contract; consumers use membership only." + "salary_sacrifice_obr_near_equivalents": "The contract separately maps OBR near-equivalents obr/salary_sacrifice_employee_ni_relief and obr/salary_sacrifice_employer_ni_relief onto hmrc.salary_sacrifice.nics_relief_employee and hmrc.salary_sacrifice.nics_relief_employer.", + "two_child_limit_year_surface": "Chronicle's 15 dwp/uc/two_child_limit/* facts are the April-2025 publication (period month 2025-04) and are the only TCL facts; there are no 2026 Ledger facts. At 12a1e028, the incumbent pins the same published numbers at {2026}, so at calibration year 2025 Ledger activates all 15 TCL targets while the incumbent drops them from the 652-row union to the 637-row effective surface; the 2026 effective surface remains 652. The same 12a1e028 refresh adds the new incumbent dwp/uc/households row. Fixture B treats the 15 TCL rows as enumerated ledger-side additions.", + "geography_level_order_canonicalization": "The 9 voa.council_tax_stock.* rows use country, region order to match the rest of the contract; consumers use membership only.", + "ons_terminal_sex_band_split": "María ruling 2026-08-21: split the incumbent terminal sex bands into uniform five-year 85_89 bands plus 90_plus tails. The incumbent six-year 85_90 terminal rows leave ages 91+ unconstrained; Microcosm keeps the uniform five-year bands and constrains the tail. The 85_89-vs-85_90 value gap is the single-age-90 share and is a signed semantic difference." } }, "targets": [ @@ -6090,7 +6116,7 @@ } }, { - "target_id": "ons.population.female_85_90", + "target_id": "ons.population.female_85_89", "family": "ons_population", "geography_levels": [ "country" @@ -6112,13 +6138,13 @@ { "concept": "uk.demographics.age", "operator": "<=", - "value": 90 + "value": 89 } ] }, "bindings": { "policyengine": { - "metric_name": "ons/female_85_90", + "metric_name": "ons/female_85_89", "filters": [ { "variable": "gender", @@ -6132,7 +6158,7 @@ { "variable": "age", "operator": "<=", - "value": 90 + "value": 89 } ], "value_variable": "person_count", @@ -6140,7 +6166,7 @@ "map_to": "household" }, "axiom": { - "metric_name": "ons/female_85_90", + "metric_name": "ons/female_85_89", "status": "pending", "value_rule": "uk.person.count" } @@ -6156,7 +6182,64 @@ 86, 87, 88, - 89, + 89 + ] + } + } + }, + { + "target_id": "ons.population.female_90_plus", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.gender", + "equals": "female" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 90 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/female_90_plus", + "filters": [ + { + "variable": "gender", + "equals": "FEMALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 90 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/female_90_plus", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "female", + "age": [ "90_plus" ] } @@ -7387,7 +7470,7 @@ } }, { - "target_id": "ons.population.male_85_90", + "target_id": "ons.population.male_85_89", "family": "ons_population", "geography_levels": [ "country" @@ -7409,13 +7492,13 @@ { "concept": "uk.demographics.age", "operator": "<=", - "value": 90 + "value": 89 } ] }, "bindings": { "policyengine": { - "metric_name": "ons/male_85_90", + "metric_name": "ons/male_85_89", "filters": [ { "variable": "gender", @@ -7429,7 +7512,7 @@ { "variable": "age", "operator": "<=", - "value": 90 + "value": 89 } ], "value_variable": "person_count", @@ -7437,7 +7520,7 @@ "map_to": "household" }, "axiom": { - "metric_name": "ons/male_85_90", + "metric_name": "ons/male_85_89", "status": "pending", "value_rule": "uk.person.count" } @@ -7453,7 +7536,64 @@ 86, 87, 88, - 89, + 89 + ] + } + } + }, + { + "target_id": "ons.population.male_90_plus", + "family": "ons_population", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.gender", + "equals": "male" + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 90 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "ons/male_90_plus", + "filters": [ + { + "variable": "gender", + "equals": "MALE" + }, + { + "variable": "age", + "operator": ">=", + "value": 90 + } + ], + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household" + }, + "axiom": { + "metric_name": "ons/male_90_plus", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "ons", + "source_concept": "ons.mid_year_population_estimate", + "groupby_dimension": "age", + "dimension_values": { + "sex": "male", + "age": [ "90_plus" ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py index e6e823792..79072bf57 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py @@ -248,6 +248,12 @@ ladder_target_provenance, local_authority_household_targets, ) +from microcosm.build.uk_runtime.ledger_targets import ( + UKLedgerTargetCompilation, + UKPolicyEngineAdapter, + compile_uk_target_registry, + materialize_uk_ledger_targets, +) from microcosm.build.uk_runtime.local_doctrine import ( UK_LOCAL_MAX_WEIGHT_RATIO, UK_LOCAL_SOLVE_DOCTRINE, @@ -490,6 +496,10 @@ "UK_CGT_TARGET_SPECS", "UK_DIAGNOSTICS_SCHEMA_VERSION", "UK_FISCAL_TARGET_REGISTRY", + "UKLedgerTargetCompilation", + "UKPolicyEngineAdapter", + "compile_uk_target_registry", + "materialize_uk_ledger_targets", "AGE_BANDS", "AREA_TYPE_TO_LEDGER_GEOGRAPHY_LEVEL", "AREA_TYPES", 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 new file mode 100644 index 000000000..eb6a2102d --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py @@ -0,0 +1,169 @@ +"""UK Ledger target-reference compilation and materialization helpers.""" + +from __future__ import annotations + +import json +from collections.abc import Iterable, Mapping +from dataclasses import dataclass +from importlib import resources as importlib_resources +from typing import Any + +import numpy as np + +from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_targets import ( + LedgerTargetReference, + _fact_matches_selector, + compile_ledger_target_references, +) +from microcosm.build.target_materialization import ( + TargetMaterializationResult, + materialize_target_bindings, +) +from microcosm.build.uk_runtime.cgt_calibration import uk_cgt_annual_exempt_amount +from microcosm.calibrate import TargetRegistry + + +@dataclass(frozen=True) +class UKLedgerTargetCompilation: + """Compiled UK Ledger target registry and unsupported-reference report.""" + + registry: TargetRegistry + unsupported: tuple[dict[str, str], ...] + + +def compile_uk_target_registry( + facts: Iterable[Mapping[str, Any]], + *, + target_period: int | str, +) -> UKLedgerTargetCompilation: + """Compile packaged UK Ledger references against consumer fact rows.""" + + fact_rows = tuple(facts) + spec = load_country_spec("uk") + compiled = [] + unsupported: list[dict[str, str]] = [] + for reference in spec.target_references: + restamped = LedgerTargetReference( + **{**reference.__dict__, "period": target_period} + ) + candidate_facts = _candidate_facts_for_reference(fact_rows, restamped) + try: + registry = compile_ledger_target_references( + candidate_facts, + [restamped], + country="uk", + ) + except ValueError as error: + unsupported.append( + { + "name": reference.name, + "period": target_period, + "reason": str(error), + } + ) + else: + compiled.extend(registry.specs) + return UKLedgerTargetCompilation( + TargetRegistry(compiled, country="uk"), + tuple(unsupported), + ) + + +def _candidate_facts_for_reference( + facts: tuple[Mapping[str, Any], ...], + reference: LedgerTargetReference, +) -> tuple[Mapping[str, Any], ...]: + if not reference.ledger_selector: + return facts + return tuple( + fact for fact in facts if _fact_matches_selector(fact, reference.ledger_selector) + ) + + +def materialize_uk_ledger_targets( + adapter: Any, + registry: TargetRegistry, + *, + period: int | str, +) -> TargetMaterializationResult: + """Materialize compiled UK Ledger target bindings on an adapter.""" + + contract = _uk_contract_targets() + return materialize_target_bindings( + adapter, + registry, + contract, + period=period, + providers={ + "parameter_gated_threshold": _uk_parameter_gated_threshold, + "baseline_flag_crosstab": _uk_baseline_flag_crosstab, + "input_substitution_counterfactual": _uk_input_substitution, + }, + ) + + +class UKPolicyEngineAdapter: + """Small adapter around policyengine-uk simulation-like objects.""" + + def __init__(self, simulation: Any): + self.simulation = simulation + self.tables: dict[str, dict[str, np.ndarray]] = {} + + def column(self, entity: str, variable: str) -> np.ndarray: + table = self.tables.get(entity, {}) + if variable in table: + return np.asarray(table[variable], dtype=float) + values = self.simulation.calculate(variable) + return np.asarray(values, dtype=float) + + def set_column(self, entity: str, variable: str, values: object) -> None: + self.tables.setdefault(entity, {})[variable] = np.asarray(values, dtype=float) + + def parameter(self, parameter: str, period: int | str) -> float: + if parameter in { + "cgt_calibration.uk_cgt_annual_exempt_amount", + "gov.hmrc.cgt.annual_exempt_amount", + }: + return uk_cgt_annual_exempt_amount(period) + raise KeyError(parameter) + + +def _uk_contract_targets() -> dict[str, Mapping[str, Any]]: + payload = ( + importlib_resources.files("microcosm.build.uk") + .joinpath("uk_national_targets.json") + .read_text() + ) + contract = json.loads(payload) + return {target["target_id"]: target for target in contract["targets"]} + + +def _uk_parameter_gated_threshold( + adapter: Any, + binding: Mapping[str, Any], + period: int | str, +) -> np.ndarray: + from microcosm.build.target_materialization import parameter_gated_threshold + + return parameter_gated_threshold(adapter, binding, period) + + +def _uk_baseline_flag_crosstab( + adapter: Any, + binding: Mapping[str, Any], + period: int | str, +) -> np.ndarray: + from microcosm.build.target_materialization import baseline_flag_crosstab + + return baseline_flag_crosstab(adapter, binding, period) + + +def _uk_input_substitution( + adapter: Any, + binding: Mapping[str, Any], + period: int | str, +) -> np.ndarray: + from microcosm.build.target_materialization import input_substitution_counterfactual + + return input_substitution_counterfactual(adapter, binding, period) 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 9ee97bec4..54781fa5c 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 @@ -1,13 +1,9 @@ -{"aggregate_fact_key": "ledger.aggregate_fact.v2:a36696207826083b6dd7e878", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "isc", "canonical_concept": "isc.pupils_at_member_schools", "concept_alignment_key": "ledger.concept_alignment.v2:98bb32323a3c2baec9cf6536", "evidence_notes": "ISC annual Census 2023 report, executive summary: 554,243 pupils at 1,395 ISC member schools (survey carried out in January 2023, all UK-member schools responding).", "evidence_url": "https://www.isc.co.uk/research/annual-census/isc-annual-census-2023/", "relation": "source_label", "source_concept": "isc.pupils_at_member_schools"}, "dimension_set_key": "ledger.dimension_set.v2:798fe9e6b99defdb40a97be3", "dimensions": {"school_membership": "isc"}, "entity": {"name": "person", "role": "private_school_pupil"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023-01 month count isc pupils at member schools for person (school membership=isc) [isc ISC annual Census 2023 isc_census_2023_final.pdf census_2023]", "layout": {"groupby_dimension": "isc.census_line", "groupby_ordinal": 0, "groupby_value_id": "pupils_at_isc_schools", "groupby_value_label": "Pupils at ISC member schools, January 2023 census", "measure_id": "pupils", "measure_label": "Pupils at ISC member schools", "measure_ordinal": 0, "record_set_id": "isc.census_2023.pupils", "record_set_spec_hash": "43d489f56ecef6c1f4f07827", "record_set_spec_id": "isc.census_2023.pupils.v1", "source_column_id": "numeric_value", "source_row_id": "pupils_at_isc_schools", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:6862b35fc66e993fd1b3a496", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:8a85b6a60f996e8543bb2c70", "ledger.source_cell.v1:6dd528b0c45a1e8bf858158e", "ledger.source_cell.v1:d320f7b228df1df500407034", "ledger.source_cell.v1:5136187fe3a031fc10a0ca62"], "source_record_id": "isc.census_2023.pupils.pupils_at_isc_schools.pupils", "source_row_keys": []}, "observed_measure": {"source_concept": "isc.pupils_at_member_schools", "source_measure_id": "pupils", "source_name": "isc", "source_table": "ISC annual Census 2023", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:66d9adbd08e45f85b730163d", "period": {"type": "month", "value": "2023-01"}, "provenance_class": "census", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:dcdb6fab7a97e0d16f5332a0", "source": {"extracted_at": "2026-08-07", "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/isc/isc-annual-census-2023/2023/67ae15ec91c626522b964fabe7c1624de9b83fcae356ebf2a240bf8c9adf35d8/isc_census_2023_final.pdf", "raw_r2_uri": "r2://ledger-raw/raw/isc/isc-annual-census-2023/2023/67ae15ec91c626522b964fabe7c1624de9b83fcae356ebf2a240bf8c9adf35d8/isc_census_2023_final.pdf", "source_file": "isc_census_2023_final.pdf", "source_name": "isc", "source_sha256": "67ae15ec91c626522b964fabe7c1624de9b83fcae356ebf2a240bf8c9adf35d8", "source_size_bytes": 6061790, "source_table": "ISC annual Census 2023", "url": "https://www.isc.co.uk/media/9316/isc_census_2023_final.pdf", "vintage": "census_2023"}, "source_release_key": "ledger.source_release.v2:a60ce5f6bbc36d63507667d9", "source_series_key": "ledger.source_series.v2:8bc0947d65be226dd5348907", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:6128dc3fab81d86b2f1e7d92", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "isc", "variable": "school_membership"}], "domain": "independent_school_education"}, "value": 554243, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:0b3bba939da29c3b925d98a8", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:5ea829aca1b48c2ce225a06e", "dimensions": {"household_type": "lone_households_under_65"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=lone households under 65) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 0, "groupby_value_id": "lone_households_under_65", "groupby_value_label": "Under 65", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "lone_households_under_65", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:c2b4362848754d3e02c7a08a", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:837e34887b59a7fc491f97f8", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.lone_households_under_65.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:6efcfd7990cdaa436ac411d3", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:294e9acfef7d58dfd3d0f201", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "lone_households_under_65", "variable": "household_type"}], "domain": "household_composition"}, "value": 4166000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:1ddf8c636c81c2f6b5036612", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:95a64ffacc62ab4a618e2c2d", "dimensions": {"household_type": "lone_households_over_65"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=lone households over 65) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 1, "groupby_value_id": "lone_households_over_65", "groupby_value_label": "65 or over", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "lone_households_over_65", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:0eaabf6d0a7df5f5c44fc3b1", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:eabeb69fafb8cb9869737539", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.lone_households_over_65.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:47eb4dc37591df9cbcc7b86c", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:b102ca2d480c2589316600cd", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "lone_households_over_65", "variable": "household_type"}], "domain": "household_composition"}, "value": 4214000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:8ef6c9992eabbc2e9641c694", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:5774a97907813719358f314f", "dimensions": {"household_type": "unrelated_adult_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=unrelated adult households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 2, "groupby_value_id": "unrelated_adult_households", "groupby_value_label": "Two or more unrelated adults [note 10]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "unrelated_adult_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:97ed998e24b9fae08017d83a", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:8d5efd7a126aaf30f68fb31d", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.unrelated_adult_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:fff64222efad35d84be6b76f", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:966db6efafedee1aa2bf9622", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "unrelated_adult_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 827000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:69edec6d08e8bb80e11cb682", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:53e6f9397dd4db4747ca9d08", "dimensions": {"household_type": "couple_no_children_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=couple no children households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 3, "groupby_value_id": "couple_no_children_households", "groupby_value_label": "No children [note 7]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "couple_no_children_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:59f4d215776ade6f38f973a6", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:e55f7b353e3e47e85b5351e2", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.couple_no_children_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:916305bb92da344beede7402", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:6b6e7e8ef3885da74f69530b", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "couple_no_children_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 7956000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:1a5bcf85cdb2440d2e2bbee3", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:12b5c2a1d4a0867350fd061c", "dimensions": {"household_type": "couple_under_3_children_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=couple under 3 children households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 4, "groupby_value_id": "couple_under_3_children_households", "groupby_value_label": "1 to 2 dependent children [note 5]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "couple_under_3_children_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:0ebdade3b55e7559849eb107", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:d07ff2fd8a7e64097d20dbcc", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.couple_under_3_children_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:c1a357a1e496bb6d37a6c7a9", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:d4e1d564c76bf14c2660f69c", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "couple_under_3_children_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 5210000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:f9c5f6507123ddea8230de9b", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:d7fd900bfb7f45f15b68473f", "dimensions": {"household_type": "couple_3_plus_children_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=couple 3 plus children households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 5, "groupby_value_id": "couple_3_plus_children_households", "groupby_value_label": "3 or more dependent children [note 5]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "couple_3_plus_children_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:c3fb5e9030abcebf649711e6", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:2d007d1d11f4156c26546aa6", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.couple_3_plus_children_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:5bdc916cbf1d7f0b0ea5bcc7", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:c4e4babbd1e59a47ffbb0a02", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "couple_3_plus_children_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 907000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:b8c8ee8287142d33e8c4d258", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:7942e7c827a3a477da809695", "dimensions": {"household_type": "couple_non_dependent_children_only_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=couple non dependent children only households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 6, "groupby_value_id": "couple_non_dependent_children_only_households", "groupby_value_label": "Non-dependent children only [note 6]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "couple_non_dependent_children_only_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:a07847d3e21058cf8f58fe90", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:eebbbb8900482c3d7352b7e5", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.couple_non_dependent_children_only_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:7ec88da6a8718f9ab9aa5415", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:93df84662f9006f179b40205", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "couple_non_dependent_children_only_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 1793000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:8de5968337dd81ca4f8535df", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:5e7a4436130bc8818b1d00c7", "dimensions": {"household_type": "lone_parent_dependent_children_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=lone parent dependent children households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 7, "groupby_value_id": "lone_parent_dependent_children_households", "groupby_value_label": "Dependent children [note 5]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "lone_parent_dependent_children_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:f731755c1eb1257215325eb5", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:be2fcd478d8951c07a5fd412", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.lone_parent_dependent_children_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:716d62bd573ceb74c7b35944", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:e5e64145c01a3e80897fff00", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "lone_parent_dependent_children_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 1904000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:1f3edfb1625210d30165615f", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:90eca614baf612a013ef6626", "dimensions": {"household_type": "lone_parent_non_dependent_children_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=lone parent non dependent children households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 8, "groupby_value_id": "lone_parent_non_dependent_children_households", "groupby_value_label": "Non-dependent children only [note 6]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "lone_parent_non_dependent_children_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:2a61e7da1ae5d62699612be5", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:29c1500b656305ab825ca54d", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.lone_parent_non_dependent_children_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:f748ef2f89c88332f9aaa041", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:2ce43f154fad7678999d1d5c", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "lone_parent_non_dependent_children_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 1089000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:8744ec315072dd0e31c10459", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.households_by_type", "concept_alignment_key": "ledger.concept_alignment.v2:cf85783836063df6a5d4ade3", "evidence_notes": "Families and households in the UK, 2025 edition, Table 7 households by type, 2023 estimate, thousands.", "evidence_url": "https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds", "relation": "source_label", "source_concept": "ons.families_households_table7"}, "dimension_set_key": "ledger.dimension_set.v2:5677de3faee3453bcf1fb7bb", "dimensions": {"household_type": "multi_family_households"}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year count ons households by type for household (household type=multi family households) [ons Families and households in the UK 2025, Table 7: households by type familiesandhouseholdsuk2025.xlsx families_households_2025]", "layout": {"groupby_dimension": "ons.household_type", "groupby_ordinal": 9, "groupby_value_id": "multi_family_households", "groupby_value_label": "Multi-family households [note 4] [note 11]", "measure_id": "households", "measure_label": "Households, 2023 estimate", "measure_ordinal": 0, "record_set_id": "ons.families_households_2025.table7.cy2023", "record_set_spec_hash": "0ea9705065c1ac17dfce8be4", "record_set_spec_id": "ons.families_households_2025.table7.cy2023.v1", "source_column_id": "households", "source_row_id": "multi_family_households", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:d6d9180df2b31443fda38cfd", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:b7942fa27d2a054808af7b32", "ledger.source_cell.v1:2531e3e8f7340928e989b0ef"], "source_record_id": "ons.families_households_2025.table7.cy2023.multi_family_households.households", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.families_households_table7", "source_measure_id": "households", "source_name": "ons", "source_table": "Families and households in the UK 2025, Table 7: households by type", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f5e97dfafe656d78d5ad97fc", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:72ff59ddf703db6b4b318dde", "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/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-families-households-2025/2025/a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91/familiesandhouseholdsuk2025.xlsx", "source_file": "familiesandhouseholdsuk2025.xlsx", "source_name": "ons", "source_sha256": "a89eaa3d7f519bfa949c7cfa12f531b8c7a86c704adcb70e81f49567ae724a91", "source_size_bytes": 209085, "source_table": "Families and households in the UK 2025, Table 7: households by type", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/birthsdeathsandmarriages/families/datasets/familiesandhouseholdsfamiliesandhouseholds/current/familiesandhouseholdsuk2025.xlsx", "vintage": "families_households_2025"}, "source_release_key": "ledger.source_release.v2:30b0ffd8d7245b0d6684989e", "source_series_key": "ledger.source_series.v2:9faf1c83fb31f4a881373e3c", "survey_instrument": "Labour Force Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:cfed459f0f1b30ed81d17c2e", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "multi_family_households", "variable": "household_type"}], "domain": "household_composition"}, "value": 290000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:2d8306be080946696b35e1ee", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.household_interest_resources", "concept_alignment_key": "ledger.concept_alignment.v2:211be3157e39540b9ed894af", "evidence_notes": "UKEA series HAXV, households (S.14) interest (D.41) resources, current price GBP million NSA; annual observation for 2023; 30 June 2026 release.", "evidence_url": "https://www.ons.gov.uk/economy/grossdomesticproductgdp/timeseries/haxv/ukea", "relation": "source_label", "source_concept": "ons.ukea_haxv"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "household", "role": "resident_household"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 calendar year sum ons household interest resources for household [ons UKEA time series HAXV: Households (S.14) interest (D.41) resources, current price GBP million NSA haxv.csv ukea_2026_06_30]", "layout": {"groupby_dimension": "ons.ukea_series", "groupby_ordinal": 0, "groupby_value_id": "haxv", "groupby_value_label": "Households interest resources (D.41), 2023", "measure_id": "amount", "measure_label": "Interest resources, current price", "measure_ordinal": 0, "record_set_id": "ons.ukea_haxv.savings_interest.cy2023", "record_set_spec_hash": "54a556f26fc3f77a4761ff2d", "record_set_spec_id": "ons.ukea_haxv.savings_interest.cy2023.v1", "source_column_id": "amount", "source_row_id": "haxv", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:26472d1cd1730a29a966ad7c", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:f0675ff3dc39581313d2b30b"], "source_record_id": "ons.ukea_haxv.savings_interest.cy2023.haxv.amount", "source_row_keys": ["ledger.source_row.v1:7a1af57e305e785a371eae75"]}, "observed_measure": {"source_concept": "ons.ukea_haxv", "source_measure_id": "amount", "source_name": "ons", "source_table": "UKEA time series HAXV: Households (S.14) interest (D.41) resources, current price GBP million NSA", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:90a2a7fffdd0f18ccef24b4b", "period": {"type": "calendar_year", "value": 2023}, "provenance_class": "model_output", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:9ac263134990690ff4d4aeca", "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/ons/ons-savings-interest-income/2025/e19959488d2cfd5dcf16e58e1ea40916f6ada02a56340cc6d9099983ab3d7455/haxv.csv", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-savings-interest-income/2025/e19959488d2cfd5dcf16e58e1ea40916f6ada02a56340cc6d9099983ab3d7455/haxv.csv", "source_file": "haxv.csv", "source_name": "ons", "source_sha256": "e19959488d2cfd5dcf16e58e1ea40916f6ada02a56340cc6d9099983ab3d7455", "source_size_bytes": 3517, "source_table": "UKEA time series HAXV: Households (S.14) interest (D.41) resources, current price GBP million NSA", "url": "https://www.ons.gov.uk/generator?format=csv&uri=/economy/grossdomesticproductgdp/timeseries/haxv/ukea", "vintage": "ukea_2026_06_30"}, "source_release_key": "ledger.source_release.v2:b751c41b3a24bf9318fc5ef5", "source_series_key": "ledger.source_series.v2:eba1daee637269097aae41d2", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:fa6e32cc24b49ed112373325", "universe_constraints": {"domain": "national_accounts"}, "value": 86040000000, "value_type": "integer"} -{"aggregate_fact_key": "ledger.aggregate_fact.v2:13db6458448be6778d734c6d", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "ons", "canonical_concept": "ons.pse_headcount_total_public_sector", "concept_alignment_key": "ledger.concept_alignment.v2:3f939abcfd2534dcb3d09440", "evidence_notes": "Public sector employment reference table, March 2026 edition, Table 1 (public sector employment by sector classification, headcount, UK, thousands), row Dec 2023, series G7AU (Total public sector).", "evidence_url": "https://www.ons.gov.uk/employmentandlabourmarket/peopleinwork/publicsectorpersonnel/datasets/publicsectoremploymentreferencetable", "relation": "source_label", "source_concept": "ons.g7au"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "public_sector_employee"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023-12 month count ons pse headcount total public sector for person [ons Public sector employment reference table, UK, March 2026 edition pse-reference-table-march2026.xlsx pse_march_2026]", "layout": {"groupby_dimension": "ons.pse_sector_classification", "groupby_ordinal": 0, "groupby_value_id": "dec2023", "groupby_value_label": "Dec 2023", "measure_id": "total_public_sector", "measure_label": "Public sector employment headcount, Total public sector, Dec 2023", "measure_ordinal": 4, "record_set_id": "ons.pse_march2026.table1.dec2023", "record_set_spec_hash": "d3cbbb78d9321555f17c693e", "record_set_spec_id": "ons.pse_march2026.table1.dec2023.v1", "source_column_id": "total_public_sector", "source_row_id": "dec2023", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:29e8f77ae80ecb7a1c08ef70", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:579c63ac34c0bf18b037453c", "ledger.source_cell.v1:6bc94cddc923c5f1bc1da995"], "source_record_id": "ons.pse_march2026.table1.dec2023.dec2023.total_public_sector", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.g7au", "source_measure_id": "total_public_sector", "source_name": "ons", "source_table": "Public sector employment reference table, UK, March 2026 edition", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:f471420c3faf6b14a46a2a04", "period": {"type": "month", "value": "2023-12"}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:95517ab43857e313e352e0d7", "source": {"extracted_at": "2026-08-07", "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/ons/ons-public-sector-employment-2026/2026/aa04454e77ae1a45d26e7a89801a946721b9c8f00b7760cf72f4edaa2482509c/pse-reference-table-march2026.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-public-sector-employment-2026/2026/aa04454e77ae1a45d26e7a89801a946721b9c8f00b7760cf72f4edaa2482509c/pse-reference-table-march2026.xlsx", "source_file": "pse-reference-table-march2026.xlsx", "source_name": "ons", "source_sha256": "aa04454e77ae1a45d26e7a89801a946721b9c8f00b7760cf72f4edaa2482509c", "source_size_bytes": 225893, "source_table": "Public sector employment reference table, UK, March 2026 edition", "url": "https://www.ons.gov.uk/file?uri=/employmentandlabourmarket/peopleinwork/publicsectorpersonnel/datasets/publicsectoremploymentreferencetable/march2026/datasets.xlsx", "vintage": "pse_march_2026"}, "source_release_key": "ledger.source_release.v2:1f9022736d3d7824c98d8415", "source_series_key": "ledger.source_series.v2:558bdb2e8110d0edbc8ade29", "survey_instrument": "Quarterly Public Sector Employment Survey", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:3a69adaf2f3734585a77b8eb", "universe_constraints": {"domain": "public_sector_employment"}, "value": 6089000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:1b082e386beee3c6900e9dfa", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.cgt_gains_total", "concept_alignment_key": "ledger.concept_alignment.v2:cd804afc02f283a70c7df5d5", "evidence_notes": "CGT statistics 2025 release, Table 1, year of disposal 2023 to 2024; 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_total"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 tax year sum hmrc cgt gains total for person [hmrc Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal Table_1_2025.ods cgt_statistics_2025]", "layout": {"groupby_dimension": "hmrc.cgt_table1_line", "groupby_ordinal": 0, "groupby_value_id": "ty2023", "groupby_value_label": "Year of disposal 2023 to 2024", "measure_id": "total_gains", "measure_label": "Chargeable gains, total", "measure_ordinal": 7, "record_set_id": "hmrc.cgt_statistics_2025.table1.ty2023", "record_set_spec_hash": "b27f186424c62509e6a5e134", "record_set_spec_id": "hmrc.cgt_statistics_2025.table1.ty2023.v1", "source_column_id": "total_gains", "source_row_id": "ty2023", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:f492a811d673243b30a72d14", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:e35da0de9817851d700b614f", "ledger.source_cell.v1:70d71881a68af5ec3e5388b2"], "source_record_id": "hmrc.cgt_statistics_2025.table1.ty2023.ty2023.total_gains", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.cgt_gains_total", "source_measure_id": "total_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:76f6824292f0e8bd3edb801f", "period": {"type": "tax_year", "value": 2023}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:6e1a2ddc3a44d696e736dc6b", "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-cgt-statistics-2025/2025/95c1bb1548483cb0ed0090e820a1fba129d725ade418cf64e5f85793655e92a1/Table_1_2025.ods", "raw_r2_uri": "r2://ledger-raw/raw/hmrc/hmrc-cgt-statistics-2025/2025/95c1bb1548483cb0ed0090e820a1fba129d725ade418cf64e5f85793655e92a1/Table_1_2025.ods", "source_file": "Table_1_2025.ods", "source_name": "hmrc", "source_sha256": "95c1bb1548483cb0ed0090e820a1fba129d725ade418cf64e5f85793655e92a1", "source_size_bytes": 10002, "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/6878ac497ea209168636386e/Table_1_2025_Taxpayer_numbers_gains_and_tax_liabilities.ods", "vintage": "cgt_statistics_2025"}, "source_release_key": "ledger.source_release.v2:a6b82e1799ccd4ba57608ccd", "source_series_key": "ledger.source_series.v2:de2bf2a36f1647b20877cc1a", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", "universe_constraints": {"domain": "capital_gains_tax"}, "value": 65937000000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:5c8d18b2366a234482594297", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "slc", "canonical_concept": "slc.student_loan_net_repayments_plan_2_part_time", "concept_alignment_key": "ledger.concept_alignment.v2:9a74091cc27999e11145d771", "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 Part-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_part_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 part 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_part_time", "measure_label": "Net repayments FY2024-25, Plan 2 Part-time", "measure_ordinal": 2, "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_part_time", "source_row_id": "net_repayments", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:8fe5511f3f5ce8b9e784ca33", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:f0ba6c89d59a9cf501bd2dbc", "ledger.source_cell.v1:9ccc3a8147eeafcb76ff76fa", "ledger.source_cell.v1:446cc4b0c7a9f20af575ec37", "ledger.source_cell.v1:b3d5f4758ba698ba4a4578d4"], "source_record_id": "slc.repayments_2025.table_1a.fy2024.net_repayments.plan_2_part_time", "source_row_keys": []}, "observed_measure": {"source_concept": "slc.student_loan_net_repayments_plan_2_part_time", "source_measure_id": "plan_2_part_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:6cba6bfe750c9a218ebb12d8", "period": {"type": "fiscal_year", "value": 2024}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:e9436ca620799ad1d4897afd", "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": 95149049.60999998, "value_type": "number"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:632a67850494984d9b35e639", "aggregation": {"method": "sum"}, "assertion": "source_projection", "concept_alignment": {"authority": "obr", "canonical_concept": "obr.incapacity_benefits", "concept_alignment_key": "ledger.concept_alignment.v2:2773bccf4d64dcc80fe96ffe", "evidence_notes": "OBR EFO March 2026 detailed forecast tables, sheet 4.9, row 11 ('Incapacity benefits2'), GBP billion.", "evidence_url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-expenditure/", "relation": "source_label", "source_concept": "obr.incapacity_benefits"}, "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 incapacity benefits for person [obr EFO March 2026 detailed forecast tables: expenditure efo_expenditure.xlsx efo_march_2026]", "layout": {"groupby_dimension": "obr.efo_line", "groupby_ordinal": 0, "groupby_value_id": "incapacity_benefits", "groupby_value_label": "Incapacity benefits2", "measure_id": "amount", "measure_label": "Incapacity benefits2, FY2025-26", "measure_ordinal": 0, "record_set_id": "obr.efo_2026_03.expenditure.incapacity_benefits.fy2025", "record_set_spec_hash": "09a63e886a271917519a6cd5", "record_set_spec_id": "obr.efo_2026_03.expenditure.incapacity_benefits.fy2025.v1", "source_column_id": "amount", "source_row_id": "incapacity_benefits", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:6f0c64cbe42cf4e2d2907f78", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:963cb1a2191faedf0d203f65", "ledger.source_cell.v1:d97cb4c94d2ec623264d1d47"], "source_record_id": "obr.efo_2026_03.expenditure.incapacity_benefits.fy2025.incapacity_benefits.amount", "source_row_keys": []}, "observed_measure": {"source_concept": "obr.incapacity_benefits", "source_measure_id": "amount", "source_name": "obr", "source_table": "EFO March 2026 detailed forecast tables: expenditure", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:fde1b4a671b103ebe2c4fe82", "period": {"type": "fiscal_year", "value": 2025}, "provenance_class": "model_output", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:ea656e5e2a3495f2c99bfb27", "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-expenditure-march-2026/2026/700bfd700c872794e5fe8cf164086cd38a63850db26427b9d4b2e363d177d9a1/efo_expenditure.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/obr/obr-efo-expenditure-march-2026/2026/700bfd700c872794e5fe8cf164086cd38a63850db26427b9d4b2e363d177d9a1/efo_expenditure.xlsx", "source_file": "efo_expenditure.xlsx", "source_name": "obr", "source_sha256": "700bfd700c872794e5fe8cf164086cd38a63850db26427b9d4b2e363d177d9a1", "source_size_bytes": 236965, "source_table": "EFO March 2026 detailed forecast tables: expenditure", "url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-expenditure/", "vintage": "efo_march_2026"}, "source_release_key": "ledger.source_release.v2:5f8a36441ddcecc13c18d680", "source_series_key": "ledger.source_series.v2:96fa1a8c784ce083883c5a0a", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:ecb00e907376ba856934e4ad", "universe_constraints": {"domain": "public_sector_finances"}, "value": 7206287181.538654, "value_type": "number"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:6c212695ea75be0d2a635e9b", "aggregation": {"method": "sum"}, "assertion": "observation", "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "resident_population"}, "geography": {"id": "K02000001", "level": "country", "vintage": "gss_2024"}, "label": "United Kingdom 2024 calendar year count ons mid year population estimate for person [ons Mid-2024 population estimates, UK: countries and regions by single year of age and sex (MYE2) mye24tablesuk.xlsx mid_2024]", "layout": {"groupby_dimension": "age", "groupby_ordinal": 0, "groupby_value_id": "uk", "groupby_value_label": "United Kingdom", "measure_id": "population", "measure_label": "Resident population", "measure_ordinal": 0, "record_set_id": "ons.mid2024.mye2_persons.uk.all_ages", "record_set_spec_hash": "9a06d466bbbd3788640af817", "record_set_spec_id": "ons.mye2_persons.uk.all_ages.v1", "source_column_id": "population", "source_row_id": "uk", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:9bf0a3ba5ad6117ca8e0d0ac", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:fbc0570947c34c475532adda", "ledger.source_cell.v1:26f9cdc2784a7713953551bd", "ledger.source_cell.v1:e4d9207fd741f6fbdc82de4a"], "source_record_id": "ons.mid2024.mye2_persons.uk.all_ages.uk.population", "source_row_keys": []}, "observed_measure": {"source_concept": "ons.mid_year_population_estimate", "source_measure_id": "population", "source_name": "ons", "source_table": "Mid-2024 population estimates, UK: countries and regions by single year of age and sex (MYE2)", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:a05342302b71ceb67b12978e", "period": {"type": "calendar_year", "value": 2024}, "provenance_class": "census", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:065ea5242b0c7b9f810a9ce6", "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/ons/ons-mye-2024-uk/2024/f78d50e8d77fe5ed9d04667d6875aefcf62b56380af7aceb2e90dce067981526/mye24tablesuk.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/ons/ons-mye-2024-uk/2024/f78d50e8d77fe5ed9d04667d6875aefcf62b56380af7aceb2e90dce067981526/mye24tablesuk.xlsx", "source_file": "mye24tablesuk.xlsx", "source_name": "ons", "source_sha256": "f78d50e8d77fe5ed9d04667d6875aefcf62b56380af7aceb2e90dce067981526", "source_size_bytes": 1062342, "source_table": "Mid-2024 population estimates, UK: countries and regions by single year of age and sex (MYE2)", "url": "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/populationestimatesforukenglandandwalesscotlandandnorthernireland/mid2024/mye24tablesuk.xlsx", "vintage": "mid_2024"}, "source_release_key": "ledger.source_release.v2:615ee18597cbfc9a75e7e2a5", "source_series_key": "ledger.source_series.v2:9ffe2c36294084406279ceae", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:3171531aa949466cfcf8b77d", "universe_constraints": {"domain": "resident_population"}, "value": 69281437, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:78fb64bd2e9774df4b2f2d56", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.cgt_taxpayers_total", "concept_alignment_key": "ledger.concept_alignment.v2:256a8378726a9be1da666fec", "evidence_notes": "CGT statistics 2025 release, Table 1, year of disposal 2023 to 2024; 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_total"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 tax year count hmrc cgt taxpayers total for person [hmrc Capital Gains Tax statistics Table 1: taxpayer numbers, gains and tax liabilities by year of disposal Table_1_2025.ods cgt_statistics_2025]", "layout": {"groupby_dimension": "hmrc.cgt_table1_line", "groupby_ordinal": 0, "groupby_value_id": "ty2023", "groupby_value_label": "Year of disposal 2023 to 2024", "measure_id": "total_taxpayers", "measure_label": "CGT taxpayers, total", "measure_ordinal": 6, "record_set_id": "hmrc.cgt_statistics_2025.table1.ty2023", "record_set_spec_hash": "b27f186424c62509e6a5e134", "record_set_spec_id": "hmrc.cgt_statistics_2025.table1.ty2023.v1", "source_column_id": "total_taxpayers", "source_row_id": "ty2023", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:a2123c0409eb78f8d49178b9", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:91915a94a635f08d28cdff13", "ledger.source_cell.v1:8f08244c3f6f2e2f0895aa2a"], "source_record_id": "hmrc.cgt_statistics_2025.table1.ty2023.ty2023.total_taxpayers", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.cgt_taxpayers_total", "source_measure_id": "total_taxpayers", "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:5bbe59f8c9f99ad916666bd7", "period": {"type": "tax_year", "value": 2023}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:677e54c237d208ba6ab417d4", "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-cgt-statistics-2025/2025/95c1bb1548483cb0ed0090e820a1fba129d725ade418cf64e5f85793655e92a1/Table_1_2025.ods", "raw_r2_uri": "r2://ledger-raw/raw/hmrc/hmrc-cgt-statistics-2025/2025/95c1bb1548483cb0ed0090e820a1fba129d725ade418cf64e5f85793655e92a1/Table_1_2025.ods", "source_file": "Table_1_2025.ods", "source_name": "hmrc", "source_sha256": "95c1bb1548483cb0ed0090e820a1fba129d725ade418cf64e5f85793655e92a1", "source_size_bytes": 10002, "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/6878ac497ea209168636386e/Table_1_2025_Taxpayer_numbers_gains_and_tax_liabilities.ods", "vintage": "cgt_statistics_2025"}, "source_release_key": "ledger.source_release.v2:a6b82e1799ccd4ba57608ccd", "source_series_key": "ledger.source_series.v2:de2bf2a36f1647b20877cc1a", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb", "universe_constraints": {"domain": "capital_gains_tax"}, "value": 378000, "value_type": "integer"} +{"aggregate_fact_key": "ledger.aggregate_fact.v2:860a48172c62298ceb00c20b", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "dwp", "canonical_concept": "dwp.uc_tcl_headline_households_affected", "concept_alignment_key": "ledger.concept_alignment.v2:4b3cf060f4beafb7850981dd", "evidence_notes": "Two-child limit data tables, April 2025, sheet 01, column: Universal Credit households affected by the Two Child Limit policy.", "evidence_url": "https://www.gov.uk/government/statistics/universal-credit-claimants-statistics-on-the-two-child-limit-policy-april-2025", "relation": "source_label", "source_concept": "dwp.uc_tcl_headline_households_affected"}, "dimension_set_key": "ledger.dimension_set.v2:9b8da5478cdd5948be3e6a0a", "dimensions": {"two_child_limit_status": "affected_3plus_children"}, "entity": {"name": "household", "role": "uc_household"}, "geography": {"id": "K03000001", "level": "country", "vintage": "current"}, "label": "Great Britain 2025-04 month count dwp uc tcl headline households affected for household (two child limit status=affected 3plus children) [dwp Universal Credit claimants: statistics on the two-child limit policy, April 2025 data tables data-tables-two-child-limit-april-2025.ods two_child_limit_april_2025]", "layout": {"groupby_dimension": "dwp.two_child_limit_status", "groupby_ordinal": 1, "groupby_value_id": "affected_3plus_children", "groupby_value_label": "Affected UC Household (has third or subsequent child on or after 6 April 2017)", "measure_id": "universal_credit_households_affected_by_the_two_", "measure_label": "Universal Credit households affected by the Two Child Limit policy", "measure_ordinal": 0, "record_set_id": "dwp.uc_tcl.apr2025.table01", "record_set_spec_hash": "e733e450c397c1447c3d56df", "record_set_spec_id": "dwp.uc_tcl.apr2025.table01.v1", "source_column_id": "universal_credit_households_affected_by_the_two_", "source_row_id": "affected_3plus_children", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:8ebf86ac0792f376664242fa", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:900e5a7f7e1f7799fa3a97fa", "ledger.source_cell.v1:e9ef94d14bedd2728883275a"], "source_record_id": "dwp.uc_tcl.apr2025.table01.affected_3plus_children.universal_credit_households_affected_by_the_two_", "source_row_keys": []}, "observed_measure": {"source_concept": "dwp.uc_tcl_headline_households_affected", "source_measure_id": "universal_credit_households_affected_by_the_two_", "source_name": "dwp", "source_table": "Universal Credit claimants: statistics on the two-child limit policy, April 2025 data tables", "unit": "count"}, "observed_measure_key": "ledger.observed_measure.v2:c5732f2ce8999bc5b572b546", "period": {"type": "month", "value": "2025-04"}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:fe7efa94f40b1316b4610fb7", "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/dwp/dwp-uc-two-child-limit-2025/2025/308e7d3dc10171253c77e34159f384bfd558a8ee1e487f4615b47f989a7b08d2/data-tables-two-child-limit-april-2025.ods", "raw_r2_uri": "r2://ledger-raw/raw/dwp/dwp-uc-two-child-limit-2025/2025/308e7d3dc10171253c77e34159f384bfd558a8ee1e487f4615b47f989a7b08d2/data-tables-two-child-limit-april-2025.ods", "source_file": "data-tables-two-child-limit-april-2025.ods", "source_name": "dwp", "source_sha256": "308e7d3dc10171253c77e34159f384bfd558a8ee1e487f4615b47f989a7b08d2", "source_size_bytes": 1832271, "source_table": "Universal Credit claimants: statistics on the two-child limit policy, April 2025 data tables", "url": "https://assets.publishing.service.gov.uk/media/68887ad01e72aed40611b030/data-tables-universal-credit-statistics-two-child-limit-april-2025.ods", "vintage": "two_child_limit_april_2025"}, "source_release_key": "ledger.source_release.v2:4d88d5cfb3627165bc974784", "source_series_key": "ledger.source_series.v2:345d78707b3c738004623699", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:9ca710fd89b5df02185acf59", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": "affected_3plus_children", "variable": "two_child_limit_status"}], "domain": "universal_credit_two_child_limit"}, "value": 469780, "value_type": "integer"} +{"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"} diff --git a/packages/microcosm-build/tests/test_country_spec.py b/packages/microcosm-build/tests/test_country_spec.py index 943655020..ce35cdf47 100644 --- a/packages/microcosm-build/tests/test_country_spec.py +++ b/packages/microcosm-build/tests/test_country_spec.py @@ -298,13 +298,18 @@ def test_spi_spine_adds_no_country_package_resources(self) -> None: "source_stages.json", "take_up_contract.json", "input_mass_reviewed_exclusions.json", + "ledger_compile_parity_incumbent_2025_signed_differences.json", + "ledger_compile_parity_production_2023_signed_differences.json", "national_staging_build_record.json", + "parity_fixture_production_2023.json", "qrf_tail_reviewed_exclusions.json", "release_input_coverage_manifest.json", + "registry_parity_fixture_2025.json", "was_wealth_support_bounds.json", "uk_local_target_census.json", "uk_national_targets.json", "target_references.json", + "target_reference_membership.json", ) def test_uk_source_manifest_loads_twenty_one_stages(self) -> None: @@ -358,15 +363,41 @@ def test_uk_package_loads(self) -> None: "source_stages.json", "take_up_contract.json", "input_mass_reviewed_exclusions.json", + "ledger_compile_parity_incumbent_2025_signed_differences.json", + "ledger_compile_parity_production_2023_signed_differences.json", "national_staging_build_record.json", + "parity_fixture_production_2023.json", "qrf_tail_reviewed_exclusions.json", "release_input_coverage_manifest.json", + "registry_parity_fixture_2025.json", "was_wealth_support_bounds.json", "uk_local_target_census.json", "uk_national_targets.json", "target_references.json", + "target_reference_membership.json", ) + def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: + spec = load_country_spec("uk") + + references = {reference.name: reference for reference in spec.target_references} + assert len(references) == 387 + assert references["obr.esa"].value_operation == "sum" + assert ( + references["obr.income_tax"].assertion_policy + == "allow_source_projection" + ) + + fanout = references["hmrc/employment_income_income_band_100_000_to_150_000"] + assert fanout.metadata == { + "contract_target_id": ( + "hmrc.spi.employment_income.amount_by_total_income_band" + ), + "measure_kind": "prepared_column", + } + assert fanout.uprating_from_period == "2023" + assert fanout.uprating_to_period == 2025 + class TestResolvedCountrySpecSeam: def test_country_spec_is_the_exact_resolved_alias(self) -> None: @@ -570,6 +601,8 @@ def test_declares_the_full_june_battery(self, manifest) -> None: assert [gate.id for gate in manifest.gates] == [ "uk_release_input_coverage_manifest_current", "uk_release_family_build_stages", + "uk_ledger_compile_parity_production_2023", + "uk_ledger_compile_parity_incumbent_2025", "uk_release_input_coverage", "uk_degenerate_release_surface", "uk_zero_weight_strata", @@ -592,6 +625,18 @@ def test_declares_the_full_june_battery(self, manifest) -> None: # declared entry blocks release. assert all(g.criticality == "release_blocking" for g in manifest.gates) + def test_ledger_compile_parity_gates_pin_their_fixture_periods( + self, manifest + ) -> None: + params = {gate.id: gate.parameters for gate in manifest.gates} + + assert params["uk_ledger_compile_parity_production_2023"][ + "target_period" + ] == 2023 + assert params["uk_ledger_compile_parity_incumbent_2025"][ + "target_period" + ] == 2025 + def test_only_the_weights_audit_blocks_on_absent_evidence(self, manifest) -> None: # "An absent audit is not a passing audit" — the retired schema-3 # path blocked every posture on a missing fit-weight audit, and the @@ -851,6 +896,27 @@ def test_target_reference_carrying_a_nested_value_is_refused( with pytest.raises(ValueError, match="values live in Ledger"): load_country_spec(package_dir) + def test_sum_target_reference_roundtrips(self, tmp_path) -> None: + files = _minimal_package() + files["country_package.json"]["resources"].append("target_references.json") + files["target_references.json"] = { + "country": "xx", + "target_references": [ + { + "name": "summed", + "ledger_selector": {"source_name": "somewhere"}, + "value_operation": "sum", + "entity": "person", + "measure": "people", + } + ], + } + package_dir = _write_package(tmp_path, files) + + spec = load_country_spec(package_dir) + + assert spec.target_references[0].value_operation == "sum" + def test_restricted_licence_requires_a_private_repo(self, tmp_path) -> None: files = _minimal_package() files["country_package.json"]["resources"].append("release_contract.json") diff --git a/packages/microcosm-build/tests/test_spec_engine_country_bundles.py b/packages/microcosm-build/tests/test_spec_engine_country_bundles.py index b60dccd8b..3661721b3 100644 --- a/packages/microcosm-build/tests/test_spec_engine_country_bundles.py +++ b/packages/microcosm-build/tests/test_spec_engine_country_bundles.py @@ -42,7 +42,7 @@ ), ( "uk", - "942ad7df5537e244df7ede7230098e91c617dbdb11e4d0885a94bb3b4f912da5", + "e65bbdfba881d64618713df765cf0ccd21c119b05a5b11ba7fbcf336065654dd", { "benunit.benunit_id", "household.household_id", diff --git a/packages/microcosm-build/tests/test_uk_ledger_targets.py b/packages/microcosm-build/tests/test_uk_ledger_targets.py new file mode 100644 index 000000000..023ddb7f8 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_ledger_targets.py @@ -0,0 +1,98 @@ +import json +from pathlib import Path + +import numpy as np + +from microcosm.build.uk_runtime.ledger_targets import ( + compile_uk_target_registry, + materialize_uk_ledger_targets, +) +from microcosm.calibrate import TargetRegistry, TargetSpec + +FIXTURE_FEED_ROWS = ( + Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" +) + + +class StubUKAdapter: + def __init__(self): + self.tables = { + "person": { + "capital_gains": np.array([0.0, 5_000.0, 20_000.0]), + }, + "household": { + "uc_is_child_limit_affected": np.array([1.0, 0.0, 1.0]), + "children_count": np.array([3.0, 2.0, 4.0]), + }, + } + + def column(self, entity, variable): + return self.tables[entity][variable] + + def set_column(self, entity, variable, values): + self.tables.setdefault(entity, {})[variable] = np.asarray(values) + + def parameter(self, name, period): + assert name == "gov.hmrc.cgt.annual_exempt_amount" + assert period == 2025 + return 6_000.0 + + def counterfactual_delta(self, binding, period): + return np.zeros(3) + + +def _fixture_rows() -> list[dict]: + return [ + json.loads(line) + for line in FIXTURE_FEED_ROWS.read_text().splitlines() + if line.strip() + ] + + +def test_compile_uk_target_registry_compiles_fixture_subset(): + result = compile_uk_target_registry(_fixture_rows(), target_period=2025) + names = {spec.name for spec in result.registry.specs} + + assert { + "obr.income_tax", + "dwp.uc.two_child_limit.households_affected", + "slc.repayments.england_plan_2", + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", + } <= names + assert result.unsupported + + +def test_materialize_uk_ledger_targets_with_stub_adapter(): + registry = TargetRegistry( + [ + TargetSpec( + name="hmrc.cgt.taxpayers_total", + entity="person", + measure="hmrc/cgt_taxpayers", + value=378_000.0, + source="test", + metadata={"contract_target_id": "hmrc.cgt.taxpayers_total"}, + ), + TargetSpec( + name="dwp.uc.two_child_limit.children_affected", + entity="household", + measure="dwp/uc/two_child_limit/children_affected", + value=1.0, + source="test", + metadata={ + "contract_target_id": "dwp.uc.two_child_limit.children_affected" + }, + ), + ], + country="uk", + ) + adapter = StubUKAdapter() + + result = materialize_uk_ledger_targets(adapter, registry, period=2025) + + assert result.skipped == () + assert adapter.tables["person"]["hmrc/cgt_taxpayers"].tolist() == [0.0, 0.0, 1.0] + assert adapter.tables["household"][ + "dwp/uc/two_child_limit/children_affected" + ].tolist() == [3.0, 0.0, 4.0] diff --git a/packages/microcosm-build/tests/test_uk_national_targets.py b/packages/microcosm-build/tests/test_uk_national_targets.py index 74867d9f4..1dd1c672c 100644 --- a/packages/microcosm-build/tests/test_uk_national_targets.py +++ b/packages/microcosm-build/tests/test_uk_national_targets.py @@ -86,8 +86,10 @@ def _load() -> dict: def _is_filter_predicate(node: Mapping) -> bool: - return "value" in node and "operator" in node and ( - "concept" in node or "variable" in node + return ( + "value" in node + and "operator" in node + and ("concept" in node or "variable" in node) ) @@ -127,7 +129,7 @@ def test_uk_national_targets_shape_and_accounting(): assert resource["country"] == "uk" assert resource["allowed_value_operations"] == ["identity"] - assert len(resource["targets"]) == 187 + assert len(resource["targets"]) == 189 parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -142,6 +144,63 @@ def test_uk_national_targets_shape_and_accounting(): assert mapped_target_ids | set(unmapped_declarations) == declared_target_ids assert all(reason for reason in unmapped_declarations.values()) assert len(mapped_target_ids) == 184 + assert len(unmapped_declarations) == 5 + suppressed_ancestors = parity["suppressed_ancestors"] + assert len(suppressed_ancestors) == 5 + assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) + assert set(suppressed_ancestors).isdisjoint(parity["excluded"]) + assert { + entry["contract_target_id"] for entry in suppressed_ancestors.values() + } <= declared_target_ids + assert all( + "410-Gone" in entry["rationale"] for entry in suppressed_ancestors.values() + ) + + +def test_uk_national_targets_split_terminal_sex_age_bands(): + resource = _load() + parity = resource["registry_parity"] + + assert parity["mapped"]["ons/female_85_90"] == "ons.population.female_85_89" + assert parity["mapped"]["ons/male_85_90"] == "ons.population.male_85_89" + assert { + "ons.population.female_90_plus", + "ons.population.male_90_plus", + } <= set(parity["unmapped_declarations"]) + assert "single-age-90 share" in parity["accounting_notes"][ + "ons_terminal_sex_band_split" + ] + + female_85_89 = _target_by_id(resource, "ons.population.female_85_89") + female_90_plus = _target_by_id(resource, "ons.population.female_90_plus") + male_85_89 = _target_by_id(resource, "ons.population.male_85_89") + male_90_plus = _target_by_id(resource, "ons.population.male_90_plus") + + assert female_85_89["ledger_selector"]["dimension_values"] == { + "sex": "female", + "age": [85, 86, 87, 88, 89], + } + assert male_85_89["ledger_selector"]["dimension_values"] == { + "sex": "male", + "age": [85, 86, 87, 88, 89], + } + assert female_90_plus["ledger_selector"]["dimension_values"] == { + "sex": "female", + "age": ["90_plus"], + } + assert male_90_plus["ledger_selector"]["dimension_values"] == { + "sex": "male", + "age": ["90_plus"], + } + assert female_85_89["measurement"]["filters"] == [ + {"concept": "uk.demographics.gender", "equals": "female"}, + {"concept": "uk.demographics.age", "operator": ">=", "value": 85}, + {"concept": "uk.demographics.age", "operator": "<=", "value": 89}, + ] + assert female_90_plus["measurement"]["filters"] == [ + {"concept": "uk.demographics.gender", "equals": "female"}, + {"concept": "uk.demographics.age", "operator": ">=", "value": 90}, + ] def test_uk_national_targets_have_unique_target_ids(): @@ -179,9 +238,9 @@ def test_uk_national_targets_declare_selectors_and_closed_world_kinds(): kind = binding.get("kind") assert kind is None or kind in BINDING_KINDS, target["target_id"] if target["family"] in PROJECTION_FAMILIES: - assert target.get("assertion_policy") == "allow_source_projection", ( - target["target_id"] - ) + assert target.get("assertion_policy") == "allow_source_projection", target[ + "target_id" + ] else: assert "assertion_policy" not in target, target["target_id"] assert len(metric_names) == len(set(metric_names)) @@ -193,15 +252,15 @@ def test_uk_national_targets_declare_chronicle_loader_guarantees(): for target in resource["targets"]: selector = target["ledger_selector"] if "dimension_values" in selector: - assert _valid_dimension_values(selector["dimension_values"]), ( - target["target_id"] - ) + assert _valid_dimension_values(selector["dimension_values"]), target[ + "target_id" + ] if "dimensions" in selector: dimensions = selector["dimensions"] assert isinstance(dimensions, list), target["target_id"] - assert all(isinstance(name, str) and name for name in dimensions), ( - target["target_id"] - ) + assert all(isinstance(name, str) and name for name in dimensions), target[ + "target_id" + ] binding = target["bindings"]["policyengine"] kind = binding.get("kind") @@ -219,9 +278,9 @@ def test_uk_national_targets_declare_chronicle_loader_guarantees(): "gate_comparison", } <= set(binding), target["target_id"] elif kind == "baseline_flag_crosstab": - assert {"affected_flag_variable", "count_of"} <= set(binding), ( - target["target_id"] - ) + assert {"affected_flag_variable", "count_of"} <= set(binding), target[ + "target_id" + ] if "reduce" in binding: assert binding["reduce"] in BINDING_REDUCERS, target["target_id"] @@ -242,9 +301,12 @@ def test_uk_national_targets_declare_chronicle_loader_guarantees(): if assertion_policy is not None: assert assertion_policy in ASSERTION_POLICIES, target["target_id"] - assert _target_by_id(resource, "obr.esa")["bindings"]["policyengine"][ - "value_expression" - ] == "esa_income + esa_contrib" + assert ( + _target_by_id(resource, "obr.esa")["bindings"]["policyengine"][ + "value_expression" + ] + == "esa_income + esa_contrib" + ) def test_uk_uc_households_target_counts_benunits(): @@ -280,13 +342,20 @@ def test_uk_uc_households_target_counts_benunits(): def test_uk_national_cgt_contract_names_match_runtime_specs(): resource = _load() - cgt_metric_names = { + cgt_metric_names = sorted( target["bindings"]["policyengine"]["metric_name"] for target in resource["targets"] if target["target_id"].startswith("hmrc.cgt.") - } + ) + mapped = resource["registry_parity"]["mapped"] - assert cgt_metric_names == {spec.name for spec in UK_CGT_TARGET_SPECS} + assert UK_CGT_TARGET_SPECS == () + assert cgt_metric_names == [ + "hmrc/capital_gains_total", + "hmrc/cgt_taxpayers", + ] + assert mapped["hmrc/capital_gains_total"] == "hmrc.cgt.gains_total" + assert mapped["hmrc/cgt_taxpayers"] == "hmrc.cgt.taxpayers_total" def _target_by_id(resource: Mapping, target_id: str) -> Mapping: @@ -306,8 +375,10 @@ def _valid_dimension_values(value: object) -> bool: return False if _is_dimension_scalar(expected): continue - if isinstance(expected, list) and expected and all( - _is_dimension_scalar(item) for item in expected + if ( + isinstance(expected, list) + and expected + and all(_is_dimension_scalar(item) for item in expected) ): continue return False diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index 6a5ae5804..cdf65c8a4 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -13,13 +13,39 @@ import numpy as np import pandas as pd +import pytest from microcosm.build.country_spec import load_country_spec -from microcosm.build.ledger_targets import compile_ledger_target_references +from microcosm.build.ledger_targets import ( + LedgerTargetReference, + compile_ledger_target_references, +) +from microcosm.build.target_reference_authoring import ( + TargetReferenceAuthoringConfig, + author_target_references, +) from microcosm.calibrate.matrix import build_constraint_matrix from microcosm.frame import EntitySchema, Frame, WeightKind, Weights +from tools.generate_uk_target_references import ( + POLICYENGINE_BINDING_KEYS, + _annual_uc_award_band_token, + _geography_pins, + _value_operation_by_target_id, +) -ACTIVE_REFERENCE_COUNT = 15 +ACTIVE_REFERENCE_COUNT = 387 +UK_DATA_REPO = "policyengine-" + "uk-data" + +FIXTURE_REFERENCE_NAMES = { + "obr.income_tax", + "dwp.uc.two_child_limit.households_affected", + "ons.population.uk_total", + "hmrc/employment_income_income_band_12_570_to_15_000", + "slc.repayments.england_plan_2", + "obr.esa", + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", +} FIXTURE_FEED_ROWS = ( Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" @@ -42,6 +68,24 @@ def _expected_reference_entity(target: dict) -> str: return binding.get("from_entity") or binding.get("map_to") or "household" +def _uc_benefit_units_fact(period: str, *, value: float) -> dict: + normalized_period = period.replace("-", "_") + return { + "aggregate_fact_key": f"ledger.aggregate_fact.v2:uc-{normalized_period}", + "aggregation": {"method": "sum"}, + "assertion": "observation", + "geography": {"level": "country", "id": "K03000001"}, + "observed_measure": { + "source_name": "dwp", + "source_concept": "dwp.uc_benefit_units", + "source_measure_id": "total_units", + "unit": "count", + }, + "period": {"type": "month", "value": period}, + "value": value, + } + + def test_uk_target_references_load_as_typed_non_empty_resource() -> None: spec = load_country_spec("uk") @@ -55,7 +99,12 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: names = [reference["name"] for reference in resource["target_references"]] assert resource["country"] == "uk" - assert resource["allowed_value_operations"] == ["identity"] + assert resource["allowed_value_operations"] == [ + "identity", + "sum", + "calendar_year_average", + "latest_plateau", + ] assert len(names) == len(set(names)) for reference in resource["target_references"]: @@ -63,31 +112,193 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: target = targets_by_id[contract_target_id] binding = target["bindings"]["policyengine"] - assert reference["name"] == contract_target_id - assert reference["ledger_selector"] == { - **target["ledger_selector"], - "geography_level": "country", - } + for key, value in target["ledger_selector"].items(): + if key == "dimension_values": + assert value.items() <= reference["ledger_selector"][key].items() + continue + assert reference["ledger_selector"][key] == value + assert reference["ledger_selector"]["geography_level"] == "country" + assert reference["ledger_selector"]["geography_id"] assert reference["entity"] == _expected_reference_entity(target) - assert reference["measure"] == binding["metric_name"] - assert reference["family"] == target["family"] - expected_period = ( - 2025 - if contract_target_id - in { - "dwp.uc.households", - "obr.universal_credit_in_cap", - } - else 2023 + expected_measure = ( + binding["metric_name"] + if reference["name"] == contract_target_id + else reference["name"] ) - assert reference["period"] == expected_period + assert reference["measure"] == expected_measure + assert reference["family"] == target["family"] + assert reference["period"] == 2025 assert reference["metadata"] == { "contract_target_id": contract_target_id, "measure_kind": "prepared_column", } # The measure is a prepared column, so the pointed-to contract binding # must carry what the microcosm#622 materializer needs to prepare it. - assert binding.get("value_variable"), contract_target_id + assert ( + binding.get("value_variable") + or binding.get("value_expression") + or binding.get("kind") + ), contract_target_id + + +def test_uk_target_references_do_not_bind_known_mismatched_property_amounts() -> None: + resource = _load_uk_resource("target_references.json") + + assert not [ + reference["name"] + for reference in resource["target_references"] + if reference["metadata"]["contract_target_id"] + == "hmrc.spi.property_income.amount_by_total_income_band" + ] + + +def test_uk_target_references_do_not_emit_nan_uc_payment_bands() -> None: + resource = _load_uk_resource("target_references.json") + + assert not [ + reference["name"] + for reference in resource["target_references"] + if "uc_payment_dist" in reference["name"] and "nan_to_nan" in reference["name"] + ] + + +def test_uc_payment_fanout_excludes_source_only_unbounded_rows() -> None: + assert _annual_uc_award_band_token("No payment") == "" + assert _annual_uc_award_band_token("£1,500.01 or over") == "" + assert _annual_uc_award_band_token("£2,500.01 or over") == "" + + +def test_ons_age_total_targets_pin_exact_age_dimension_set() -> None: + references = { + reference["name"]: reference + for reference in _load_uk_resource("target_references.json")[ + "target_references" + ] + } + + assert references["ons.population.scotland_babies_under_1"][ + "ledger_selector" + ]["dimensions"] == ["age"] + assert references["ons.population.scotland_children_under_16"][ + "ledger_selector" + ]["dimensions"] == ["age"] + + +def test_uk_target_reference_membership_report_is_packaged() -> None: + membership = _load_uk_resource("target_reference_membership.json") + + assert membership["target_period"] == 2025 + assert membership["active_reference_count"] == ACTIVE_REFERENCE_COUNT + assert membership["status_counts"] == { + "active": 387, + "multi_fact": 1, + "no_fact_at_or_before_period": 28, + "signed_excluded": 1, + } + assert membership["genuine_sum_residue"] + assert membership["uprating_holds"] + assert membership["fanout_family_outcomes"] == [ + { + "family": "hmrc_spi", + "status": "active_with_signed_property_amount_exclusion", + "active_reference_count": 143, + "signed_rationale": ( + "SPI income-band targets fan out by strict total-income-band " + "dimension pins, except the HMRC property-income amount " + "surface. Those 13 rows are signed out because Ledger carries " + "the official SPI Table 3.7 net property-income amounts, " + "while the incumbent target applies the populace-side x1.9 " + "property-income undercount adjustment traced to " + f"{UK_DATA_REPO} PR #311 / issue #230 and HMRC Property Rental " + "Income Statistics." + ), + }, + { + "family": "dwp_universal_credit", + "status": "active_with_unmapped_vintage_residue_skipped", + "active_reference_count": 100, + "skipped_unmapped_fact_count": 12, + "signed_rationale": ( + "UC payment-distribution targets fan out over family_type and " + "monthly_award_amount_bands into incumbent-compatible " + "annual-payment rows. The four source-only 'No payment' facts " + "and eight overlapping source-only 'or over' facts are left " + "out; no active reference may use the legacy nan_to_nan band " + "name." + ), + }, + { + "family": "council_tax_stock", + "status": "active_declared_rows", + "active_reference_count": 9, + "signed_rationale": ( + "VOA council-tax stock bands are declared as nine explicit " + "target rows, including total, and each resolves with its " + "country-level geography and band pin." + ), + }, + ] + assert membership["signed_exclusion_rationales"] == [ + { + "family": "hmrc_spi", + "target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "status": "signed_excluded", + "signed_rationale": ( + "Signed out pending a first-class value-scaling operation or " + "a Chronicle package for HMRC Property Rental Income " + "Statistics with declared reconciliation: the Ledger facts " + "are official HMRC SPI Table 3.7 net property-income amounts, " + "while the incumbent calibration target applies the " + "populace-side x1.9 property-income undercount adjustment. " + f"The x1.9 trace is {UK_DATA_REPO} PR #311 / issue " + f"{UK_DATA_REPO}#230: SPI covers only taxpayers with liability, " + "and HMRC Property Rental Income Statistics show GBP 46.68bn " + "versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI " + "facts would knowingly calibrate to 10/19 of the incumbent " + "surface." + ), + } + ] + assert membership["multi_fact_rationales"] == [ + { + "family": "ons_population", + "target_id": "ons.population.scotland_households_3plus_children", + "candidate_name": "ons/scotland_households_3plus_children", + "status": "adjudication_pending", + "signed_rationale": ( + "Remaining multi_fact is genuine: the selector reaches ONS " + "mid-year population age rows for Scotland across six eligible " + "periods, while the contract target is a household count with " + "three or more children. No Ledger household-composition fact " + "at or before 2025 is selected by the current contract, so " + "Microcosm must not adjudicate a replacement source here." + ), + } + ] + + +def test_uk_fixture_b_signed_differences_carry_ruled_rationales() -> None: + differences = { + row["name"]: row + for row in _load_uk_resource( + "ledger_compile_parity_incumbent_2025_signed_differences.json" + )["differences"] + } + + assert "2023-24 outturn" in differences["hmrc.cgt.gains_total"]["reason"] + assert "forecast/uprated value" in differences["hmrc.cgt.gains_total"]["reason"] + 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 "ages 91+ unconstrained" in differences[ + "ons.population.female_90_plus" + ]["reason"] + assert "ages 91+ unconstrained" in differences[ + "ons.population.male_90_plus" + ]["reason"] def test_uk_target_references_compile_from_real_staged_feed_rows() -> None: @@ -95,49 +306,93 @@ def test_uk_target_references_compile_from_real_staged_feed_rows() -> None: references = [ reference for reference in spec.target_references - if reference.name - in {"isc.private_school_students", "ons.savings_interest_income"} + if reference.name in FIXTURE_REFERENCE_NAMES ] registry = compile_ledger_target_references( - _real_uk_consumer_fact_rows(), + [ + json.loads(line) + for line in FIXTURE_FEED_ROWS.read_text().splitlines() + if line.strip() + ], references, country="uk", ) targets = {target.name: target for target in registry.specs} - assert set(targets) == { - "isc.private_school_students", - "ons.savings_interest_income", - } + assert set(targets) == FIXTURE_REFERENCE_NAMES + + income_tax = targets["obr.income_tax"] + assert income_tax.value == pytest.approx(331_437_583_074.4429) + assert income_tax.period == 2025 + assert income_tax.metadata["ledger_assertion"] == "source_projection" + assert income_tax.metadata["ledger_assertion_policy"] == ("allow_source_projection") + + tcl_households = targets["dwp.uc.two_child_limit.households_affected"] + assert tcl_households.value == 469_780 + assert tcl_households.metadata["ledger_fact_period"] == "2025-04" - private_school_students = targets["isc.private_school_students"] - assert private_school_students.value == 554_243 - assert private_school_students.period == 2023 - assert private_school_students.entity == "person" - assert private_school_students.measure == "obr/private_school_students" - assert private_school_students.family == "isc" + population = targets["ons.population.uk_total"] + assert population.value == 69_281_437 + assert population.metadata["ledger_value_operation"] == "sum" + assert population.metadata["uprating_from_period"] == "2024" + + spi_band = targets["hmrc/employment_income_income_band_12_570_to_15_000"] + assert spi_band.value == 16_900_000_000 assert ( - private_school_students.metadata["contract_target_id"] - == "isc.private_school_students" + spi_band.metadata["contract_target_id"] + == "hmrc.spi.employment_income.amount_by_total_income_band" ) - assert ( - private_school_students.metadata["ledger_aggregate_fact_key"] - == "ledger.aggregate_fact.v2:a36696207826083b6dd7e878" + + slc_plan_2 = targets["slc.repayments.england_plan_2"] + 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" + + +def test_uk_generator_assigns_calendar_average_to_uc_benefit_unit_targets() -> None: + contract = _load_uk_resource("uk_national_targets.json") + facts = [ + _uc_benefit_units_fact("2025-04", value=6_380_000.0), + *( + _uc_benefit_units_fact(f"2025-{month:02d}", value=6_600_000.0) + for month in range(5, 9) + ), + *( + _uc_benefit_units_fact(f"2025-{month:02d}", value=6_960_000.0) + for month in range(9, 12) + ), + _uc_benefit_units_fact("2025-12", value=7_170_000.0), + ] + authored = author_target_references( + contract, + facts, + TargetReferenceAuthoringConfig( + target_period=2025, + geography_pins=_geography_pins(contract), + value_operation_by_target_id=_value_operation_by_target_id(contract), + binding_vocabulary=POLICYENGINE_BINDING_KEYS, + source_fact_feed="synthetic-uc-benefit-units", + ), ) + references = {reference["name"]: reference for reference in authored.references} - savings_interest = targets["ons.savings_interest_income"] - assert savings_interest.value == 86_040_000_000 - assert savings_interest.period == 2023 - assert savings_interest.entity == "person" - assert savings_interest.measure == "ons/savings_interest_income" - assert savings_interest.family == "ons_national_accounts" - assert ( - savings_interest.metadata["contract_target_id"] == "ons.savings_interest_income" + uc_reference = references["dwp.uc.households"] + assert uc_reference["value_operation"] == "calendar_year_average" + assert authored.membership_report["targets"]["dwp.uc.households"]["status"] == ( + "active" ) - assert ( - savings_interest.metadata["ledger_aggregate_fact_key"] - == "ledger.aggregate_fact.v2:2d8306be080946696b35e1ee" + + registry = compile_ledger_target_references( + facts, + [LedgerTargetReference(**uc_reference)], + country="uk", + ) + assert registry.specs[0].value == pytest.approx( + (6_380_000.0 + 4 * 6_600_000.0 + 3 * 6_960_000.0 + 7_170_000.0) / 9 ) @@ -153,9 +408,11 @@ def test_uk_target_references_constrain_a_frame_with_prepared_columns() -> None: """ spec = load_country_spec("uk") - references = tuple( - reference for reference in spec.target_references if reference.period == 2023 - ) + references = [ + reference + for reference in spec.target_references + if reference.name in FIXTURE_REFERENCE_NAMES + ] feed_rows = [ json.loads(line) for line in FIXTURE_FEED_ROWS.read_text().splitlines() @@ -163,7 +420,7 @@ def test_uk_target_references_constrain_a_frame_with_prepared_columns() -> None: ] registry = compile_ledger_target_references(feed_rows, references, country="uk") - assert len(registry.specs) == 13 + assert len(registry.specs) == len(FIXTURE_REFERENCE_NAMES) n_households = 3 weights = np.array([10.0, 20.0, 30.0]) @@ -199,7 +456,7 @@ def test_uk_target_references_constrain_a_frame_with_prepared_columns() -> None: problem = build_constraint_matrix(frame, registry.to_target_set()) assert problem.skipped == () - assert len(problem.names) == 13 + assert len(problem.names) == len(FIXTURE_REFERENCE_NAMES) achieved = problem.matrix @ problem.initial_weights.values for name, estimate in zip(problem.names, achieved, strict=True): assert estimate == expected_aggregates[name], name diff --git a/packages/microcosm-build/tests/test_us_plan.py b/packages/microcosm-build/tests/test_us_plan.py index eae2d039c..d6157d8ca 100644 --- a/packages/microcosm-build/tests/test_us_plan.py +++ b/packages/microcosm-build/tests/test_us_plan.py @@ -989,6 +989,7 @@ def test_no_incumbent_data_package_references_in_live_tree(self) -> None: # = 609 mapped + 42 signed exclusions + 3 unmapped declarations. # A sha-locked historical reference — nothing imported or executed. "packages/microcosm-build/src/microcosm/build/uk/uk_national_targets.json", + "packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json", "packages/microcosm-build/src/microcosm/build/uk_runtime/parity_reference.py", # The HMRC source contract pins the licensed SPI/ODS input # identities, whose reviewed provenance names the archived data diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py new file mode 100644 index 000000000..2126728b8 --- /dev/null +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -0,0 +1,179 @@ +"""Regenerate UK Ledger compile-parity signed-difference resources.""" + +from __future__ import annotations + +import argparse +import json +from dataclasses import dataclass +from importlib import resources as importlib_resources +from pathlib import Path + +from microcosm.build.gates import ledger_compile_parity_signed_differences +from microcosm.build.uk_runtime.ledger_targets import compile_uk_target_registry + +UK_PACKAGE = "microcosm.build.uk" +UK_PACKAGE_DIR = ( + Path(__file__).resolve().parents[1] + / "packages" + / "microcosm-build" + / "src" + / "microcosm" + / "build" + / "uk" +) + + +@dataclass(frozen=True) +class ParityReceiptSpec: + fixture_resource: str + output_resource: str + target_period: int + + +RECEIPTS = ( + ParityReceiptSpec( + fixture_resource="parity_fixture_production_2023.json", + output_resource="ledger_compile_parity_production_2023_signed_differences.json", + target_period=2023, + ), + ParityReceiptSpec( + fixture_resource="registry_parity_fixture_2025.json", + output_resource="ledger_compile_parity_incumbent_2025_signed_differences.json", + target_period=2025, + ), +) + +_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." +) + +_ONS_TERMINAL_BAND_RATIONALES = { + "ons.population.female_85_89": ( + "María ruling 2026-08-21: incumbent ons/female_85_90 maps to the " + "uniform female 85_89 declaration. The value gap is the single-age-90 " + "share; ages 90+ are constrained separately." + ), + "ons.population.male_85_89": ( + "María ruling 2026-08-21: incumbent ons/male_85_90 maps to the " + "uniform male 85_89 declaration. The value gap is the single-age-90 " + "share; ages 90+ are constrained separately." + ), + "ons.population.female_90_plus": ( + "María ruling 2026-08-21: new female 90_plus tail constrains ages 90+; " + "the incumbent six-year terminal band left ages 91+ unconstrained." + ), + "ons.population.male_90_plus": ( + "María ruling 2026-08-21: new male 90_plus tail constrains ages 90+; " + "the incumbent six-year terminal band left ages 91+ unconstrained." + ), +} + + +def _parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument( + "--ledger-facts", + type=Path, + required=True, + help="Chronicle consumer JSONL artifact used to compile UK references.", + ) + parser.add_argument( + "--output-dir", + type=Path, + default=UK_PACKAGE_DIR, + help="Directory receiving the signed-difference JSON resources.", + ) + return parser.parse_args() + + +def _load_jsonl(path: Path) -> list[dict]: + return [ + json.loads(line) + for line in path.read_text(encoding="utf-8").splitlines() + if line.strip() + ] + + +def _load_fixture(resource: str) -> dict: + return json.loads(importlib_resources.files(UK_PACKAGE).joinpath(resource).read_text()) + + +def _aligned_fixture(fixture: dict) -> dict: + """Apply current contract-row names to retired-fixture rows before comparison.""" + + rows = [] + for row in fixture.get("rows", ()): + if not isinstance(row, dict): + rows.append(row) + continue + updated = dict(row) + if updated.get("name") == "ons/female_85_90": + updated["contract_target_id"] = "ons.population.female_85_89" + updated["measure"] = "ons.population.female_85_89" + elif updated.get("name") == "ons/male_85_90": + updated["contract_target_id"] = "ons.population.male_85_89" + updated["measure"] = "ons.population.male_85_89" + rows.append(updated) + aligned = dict(fixture) + aligned["rows"] = rows + return aligned + + +def _add_signed_rationale_notes( + report: dict[str, object], + *, + fixture_resource: str, +) -> None: + if fixture_resource != "registry_parity_fixture_2025.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 + elif name in _ONS_TERMINAL_BAND_RATIONALES: + row["reason"] = _ONS_TERMINAL_BAND_RATIONALES[name] + + +def main() -> None: + args = _parse_args() + facts = _load_jsonl(args.ledger_facts) + args.output_dir.mkdir(parents=True, exist_ok=True) + for spec in RECEIPTS: + compilation = compile_uk_target_registry( + facts, + target_period=spec.target_period, + ) + report = ledger_compile_parity_signed_differences( + compilation.registry, + _aligned_fixture(_load_fixture(spec.fixture_resource)), + unsupported=compilation.unsupported, + ) + _add_signed_rationale_notes(report, fixture_resource=spec.fixture_resource) + output_path = args.output_dir / spec.output_resource + output_path.write_text( + json.dumps(report, indent=1, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + print( + json.dumps( + { + "compiled_count": report["compiled_count"], + "counts_by_kind": report["counts_by_kind"], + "difference_count": report["difference_count"], + "fixture": spec.fixture_resource, + "fixture_count": report["fixture_count"], + "output": spec.output_resource, + "target_period": spec.target_period, + }, + sort_keys=True, + ) + ) + + +if __name__ == "__main__": + main() diff --git a/tools/extract_uk_registry_fixture.py b/tools/extract_uk_registry_fixture.py new file mode 100644 index 000000000..682a6f16b --- /dev/null +++ b/tools/extract_uk_registry_fixture.py @@ -0,0 +1,118 @@ +"""One-time Fixture B extraction: incumbent registry surface at calibration year 2025. + +Runs inside the retired UK data-package checkout pinned at 12a1e028, with network +(several source modules fetch at get_targets() time). Mirrors the level-union + +name-dedup of build_loss_matrix.create_target_matrix (:93-103) and resolves each +target through the incumbent's own _resolve_value, at both 2025 (the calibration +year, #723) and 2026 (the TCL cross-check year). No simulation, no microdata -- +target values are published aggregate statistics only. + +Output: registry_fixture_2025_extraction.json next to this script. +""" + +from __future__ import annotations + +import json +import logging +import sys +from datetime import UTC, datetime +from importlib import import_module +from pathlib import Path + +logging.basicConfig(level=logging.WARNING) + +_DATA_PACKAGE = "policyengine_" + "uk_data" +_resolve_value = import_module( + f"{_DATA_PACKAGE}.targets.build_loss_matrix" +)._resolve_value +get_all_targets = import_module(f"{_DATA_PACKAGE}.targets.registry").get_all_targets +GeographicLevel = import_module(f"{_DATA_PACKAGE}.targets.schema").GeographicLevel + +OUT = Path(__file__).resolve().parent / "registry_fixture_2025_extraction.json" + + +def union_targets(): + """The exact surface create_target_matrix assembles (level union, name-dedup).""" + all_targets = [] + seen = set() + for level in ( + GeographicLevel.NATIONAL, + GeographicLevel.REGION, + GeographicLevel.COUNTRY, + ): + for t in get_all_targets(geographic_level=level): + if t.name not in seen: + seen.add(t.name) + all_targets.append(t) + return all_targets + + +def resolution(target, year): + value = _resolve_value(target, year) + if value is None: + return {"value": None, "resolved_from_year": None} + available = sorted(target.values.keys()) + closest = ( + min(available, key=lambda y: abs(y - year)) + if year not in target.values + else year + ) + return {"value": float(value), "resolved_from_year": int(closest)} + + +def main(): + targets = union_targets() + rows = [] + for t in targets: + rows.append( + { + "name": t.name, + "variable": t.variable, + "source": t.source, + "unit": t.unit.value, + "geographic_level": t.geographic_level.value, + "geo_code": t.geo_code, + "geo_name": t.geo_name, + "is_count": t.is_count, + "breakdown_variable": t.breakdown_variable, + "reference_url": t.reference_url, + "forecast_vintage": t.forecast_vintage, + "values_years": sorted(int(y) for y in t.values), + "at_2025": resolution(t, 2025), + "at_2026": resolution(t, 2026), + } + ) + + by_source = {} + for r in rows: + by_source[r["source"]] = by_source.get(r["source"], 0) + 1 + payload = { + "provenance": { + "source_repository": "retired UK data package", + "pinned_ref": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3", + "extraction_utc": datetime.now(UTC).isoformat(), + "method": ( + "level-union name-dedup per build_loss_matrix.create_target_matrix:93-103; " + "values via build_loss_matrix._resolve_value at years 2025 and 2026; " + "network-dependent get_targets() sources fetched live at extraction time" + ), + "python": sys.version.split()[0], + }, + "surface": { + "union_rows": len(rows), + "resolved_at_2025": sum( + 1 for r in rows if r["at_2025"]["value"] is not None + ), + "resolved_at_2026": sum( + 1 for r in rows if r["at_2026"]["value"] is not None + ), + "by_source": dict(sorted(by_source.items())), + }, + "rows": rows, + } + OUT.write_text(json.dumps(payload, indent=1, sort_keys=False)) + print(json.dumps(payload["surface"], indent=2)) + + +if __name__ == "__main__": + main() diff --git a/tools/generate_uk_target_references.py b/tools/generate_uk_target_references.py new file mode 100644 index 000000000..af4da6505 --- /dev/null +++ b/tools/generate_uk_target_references.py @@ -0,0 +1,402 @@ +#!/usr/bin/env python +"""Generate UK Ledger target references from the national contract. + +This is an offline authoring tool. It consumes an already-exported Ledger +consumer fact JSONL feed; it does not fetch data or contact Chronicle. +""" + +from __future__ import annotations + +import argparse +import json +import re +from collections import Counter +from collections.abc import Mapping +from pathlib import Path +from typing import Any + +from microcosm.build.target_reference_authoring import ( + TargetReferenceAuthoringConfig, + author_target_references, + target_references_resource, +) + +UK_GEOGRAPHY_IDS = { + "uk": "K02000001", + "great_britain": "K03000001", + "england": "E92000001", + "scotland": "S92000003", + "wales": "W92000004", + "northern_ireland": "N92000002", +} + +POLICYENGINE_BINDING_KEYS = frozenset( + { + "affected_flag_variable", + "band", + "band_period_factor", + "count_of", + "filters", + "folded_into", + "from_entity", + "gate_comparison", + "gate_parameter", + "gated_variable", + "groupby_variable", + "household_conditions", + "kind", + "map_to", + "metric_name", + "notes", + "output_delta", + "output_variable", + "reduce", + "source_lines", + "threshold_price_base_year", + "value_expression", + "value_variable", + "zeroed_input", + } +) + +_UK_DATA_REPO = "policyengine-" + "uk-data" + +PROPERTY_INCOME_SIGNED_EXCLUSION_RATIONALE = ( + "Signed out pending a first-class value-scaling operation or a Chronicle " + "package for HMRC Property Rental Income Statistics with declared " + "reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net " + "property-income amounts, while the incumbent calibration target applies " + "the populace-side x1.9 property-income undercount adjustment. The x1.9 " + f"trace is {_UK_DATA_REPO} PR #311 / issue {_UK_DATA_REPO}#230: " + "SPI covers only taxpayers with liability, and HMRC Property Rental Income " + "Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. " + "Binding the raw SPI facts would knowingly calibrate to 10/19 of the " + "incumbent surface." +) + + +DESCRIPTION = ( + "UK active-subset Ledger target references for the FRS 2024-25 line. " + "Rows are generated from uk_national_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 2025 " + "(opening-year convention for the FRS 2024-25 survey line). Observed " + "values stay in Ledger facts and resolve by identity unless the reference " + "declares value_operation=sum for a genuine multi-fact residue. 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." +) + + +def main() -> None: + args = _parser().parse_args() + contract = json.loads(args.contract.read_text()) + facts = [ + json.loads(line) + for line in args.ledger_facts.read_text().splitlines() + if line.strip() + ] + inverse_mapping = _registry_inverse(contract) + config = TargetReferenceAuthoringConfig( + target_period=args.period, + geography_pins=_geography_pins(contract), + fanout_name=lambda target, fact: _fanout_name( + target, + fact, + inverse_mapping, + ), + sum_target_ids=_sum_target_ids(contract), + value_operation_by_target_id=_value_operation_by_target_id(contract), + selector_pins_by_target_id=_selector_pins(contract), + signed_exclusions_by_target_id=_signed_exclusions(contract), + binding_vocabulary=POLICYENGINE_BINDING_KEYS, + source_fact_feed=str(args.ledger_facts), + ) + authored = author_target_references(contract, facts, config) + _add_uk_membership_accounting(authored.membership_report, authored.references) + resource = target_references_resource( + country="uk", + description=DESCRIPTION, + authored=authored, + ) + args.output.write_text(json.dumps(resource, indent=2) + "\n") + args.membership_report.write_text( + json.dumps(authored.membership_report, indent=2) + "\n" + ) + print(json.dumps(authored.membership_report["status_counts"], sort_keys=True)) + print( + f"active_reference_count={authored.membership_report['active_reference_count']}" + ) + + +def _parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser() + parser.add_argument("--contract", type=Path, required=True) + parser.add_argument("--ledger-facts", type=Path, required=True) + parser.add_argument("--period", type=int, default=2025) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--membership-report", type=Path, required=True) + return parser + + +def _registry_inverse(contract: Mapping[str, Any]) -> dict[str, list[str]]: + inverse: dict[str, list[str]] = {} + for ancestor, target_id in contract["registry_parity"]["mapped"].items(): + inverse.setdefault(str(target_id), []).append(str(ancestor)) + return {key: sorted(value) for key, value in inverse.items()} + + +def _geography_pins(contract: Mapping[str, Any]) -> dict[str, dict[str, str]]: + return { + str(target["target_id"]): { + "geography_level": "country", + "geography_id": _geography_id_for_target(target), + } + for target in contract.get("targets", ()) + } + + +def _geography_id_for_target(target: Mapping[str, Any]) -> str: + target_id = str(target["target_id"]).lower() + selector = target.get("ledger_selector") or {} + concept = str(selector.get("source_concept", "")).lower() + measure = str(selector.get("source_measure_id", "")).lower() + haystack = " ".join((target_id, concept, measure)) + if "northern" in haystack or "domestic_rates" in haystack: + return UK_GEOGRAPHY_IDS["northern_ireland"] + if "scotland" in haystack: + return UK_GEOGRAPHY_IDS["scotland"] + if "wales" in haystack: + return UK_GEOGRAPHY_IDS["wales"] + if "england" in haystack or target_id.startswith("voa."): + return UK_GEOGRAPHY_IDS["england"] + if target_id.startswith("dwp.") or target_id.startswith("slc."): + return UK_GEOGRAPHY_IDS["great_britain"] + return UK_GEOGRAPHY_IDS["uk"] + + +def _sum_target_ids(contract: Mapping[str, Any]) -> frozenset[str]: + target_ids: set[str] = set() + for target in contract.get("targets", ()): + selector = target["ledger_selector"] + binding = target["bindings"]["policyengine"] + if "value_expression" in binding: + target_ids.add(str(target["target_id"])) + if any(isinstance(value, list) for value in selector.values()): + target_ids.add(str(target["target_id"])) + dimension_values = selector.get("dimension_values") + if isinstance(dimension_values, Mapping) and any( + isinstance(value, list) for value in dimension_values.values() + ): + target_ids.add(str(target["target_id"])) + return frozenset(target_ids) + + +def _value_operation_by_target_id(contract: Mapping[str, Any]) -> dict[str, str]: + operations = {target_id: "sum" for target_id in _sum_target_ids(contract)} + for target in contract.get("targets", ()): + selector = target["ledger_selector"] + target_id = str(target["target_id"]) + if selector.get("source_concept") == "dwp.uc_benefit_units": + operations[target_id] = "calendar_year_average" + return operations + + +def _selector_pins(contract: Mapping[str, Any]) -> dict[str, dict[str, Any]]: + pins: dict[str, dict[str, Any]] = {} + for target in contract.get("targets", ()): + selector = target["ledger_selector"] + dimension_values = selector.get("dimension_values") + if ( + selector.get("source_concept") == "ons.mid_year_population_estimate" + and isinstance(dimension_values, Mapping) + ): + pins[str(target["target_id"])] = { + "dimensions": sorted(str(key) for key in dimension_values) + } + return pins + + +def _signed_exclusions(contract: Mapping[str, Any]) -> dict[str, str]: + target_ids = { + str(target["target_id"]) + for target in contract.get("targets", ()) + } + target_id = "hmrc.spi.property_income.amount_by_total_income_band" + if target_id not in target_ids: + return {} + return {target_id: PROPERTY_INCOME_SIGNED_EXCLUSION_RATIONALE} + + +def _fanout_name( + target: Mapping[str, Any], + fact: Mapping[str, Any], + inverse_mapping: Mapping[str, list[str]], +) -> str | None: + target_id = str(target["target_id"]) + value_id = str(fact.get("layout", {}).get("groupby_value_id") or "") + preferred_tokens, fallback_tokens = _dimension_tokens(fact) + candidates = inverse_mapping.get(target_id, ()) + for candidate in candidates: + if value_id and value_id not in _GEOGRAPHY_VALUE_IDS and value_id in candidate: + return candidate + if any(token in candidate for token in preferred_tokens): + return candidate + for candidate in candidates: + if any(token in candidate for token in fallback_tokens): + return candidate + if len(candidates) == 1: + return None + if candidates: + return None + safe_value = value_id.replace("/", "_") or "detail" + return f"{target_id}.{safe_value}" + + +def _dimension_tokens(fact: Mapping[str, Any]) -> tuple[list[str], list[str]]: + preferred: list[str] = [] + fallback: list[str] = [] + dimensions = fact.get("dimensions") or {} + if not isinstance(dimensions, Mapping): + return preferred, fallback + for value in dimensions.values(): + if isinstance(value, int): + token = _int_token(value) + preferred.append(f"income_band_{token}_to") + fallback.append(f"_{token}") + elif isinstance(value, str) and value.isdigit(): + token = _int_token(int(value)) + preferred.append(f"income_band_{token}_to") + fallback.append(f"_{token}") + elif isinstance(value, str): + annual_band = _annual_uc_award_band_token(value) + if annual_band: + preferred.append(annual_band) + fallback.append(annual_band.removeprefix("annual_payment_")) + return preferred, fallback + + +def _int_token(value: int) -> str: + return f"{value:,}".replace(",", "_") + + +def _annual_uc_award_band_token(value: str) -> str: + normalized = value.strip().lower() + if normalized == "no payment" or "or over" in normalized: + return "" + if " to " not in normalized: + return "" + numbers = [ + float(number.replace(",", "")) + for number in re.findall(r"[0-9][0-9,]*(?:\.[0-9]+)?", value) + ] + if len(numbers) != 2: + return "" + lower = int((numbers[0] // 100) * 100 * 12) + upper = int(numbers[1] * 12) + return f"annual_payment_{_int_token(lower)}_to_{_int_token(upper)}" + + +def _add_uk_membership_accounting( + report: dict[str, Any], + references: tuple[dict[str, Any], ...], +) -> None: + fanout_counts = Counter( + reference["family"] + for reference in references + if reference["name"] != reference["metadata"]["contract_target_id"] + ) + council_tax_count = sum( + 1 + for reference in references + if reference["metadata"]["contract_target_id"].startswith( + "voa.council_tax_stock." + ) + ) + report["fanout_family_outcomes"] = [ + { + "family": "hmrc_spi", + "status": "active_with_signed_property_amount_exclusion", + "active_reference_count": fanout_counts.get("hmrc_spi", 0), + "signed_rationale": ( + "SPI income-band targets fan out by strict total-income-band " + "dimension pins, except the HMRC property-income amount " + "surface. Those 13 rows are signed out because Ledger carries " + "the official SPI Table 3.7 net property-income amounts, " + "while the incumbent target applies the populace-side x1.9 " + "property-income undercount adjustment traced to " + f"{_UK_DATA_REPO} PR #311 / issue #230 and HMRC " + "Property Rental Income Statistics." + ), + }, + { + "family": "dwp_universal_credit", + "status": "active_with_unmapped_vintage_residue_skipped", + "active_reference_count": fanout_counts.get("dwp_universal_credit", 0), + "skipped_unmapped_fact_count": 12, + "signed_rationale": ( + "UC payment-distribution targets fan out over family_type and " + "monthly_award_amount_bands into incumbent-compatible " + "annual-payment rows. The four source-only 'No payment' facts " + "and eight overlapping source-only 'or over' facts are left " + "out; no active reference may use the legacy nan_to_nan band " + "name." + ), + }, + { + "family": "council_tax_stock", + "status": "active_declared_rows", + "active_reference_count": council_tax_count, + "signed_rationale": ( + "VOA council-tax stock bands are declared as nine explicit " + "target rows, including total, and each resolves with its " + "country-level geography and band pin." + ), + }, + ] + report["signed_exclusion_rationales"] = [ + { + "family": "hmrc_spi", + "target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "status": "signed_excluded", + "signed_rationale": report["targets"][ + "hmrc.spi.property_income.amount_by_total_income_band" + ]["candidates"][0]["signed_rationale"], + } + ] + report["multi_fact_rationales"] = [ + { + "family": "ons_population", + "target_id": "ons.population.scotland_households_3plus_children", + "candidate_name": "ons/scotland_households_3plus_children", + "status": "adjudication_pending", + "signed_rationale": ( + "Remaining multi_fact is genuine: the selector reaches ONS " + "mid-year population age rows for Scotland across six eligible " + "periods, while the contract target is a household count with " + "three or more children. No Ledger household-composition fact " + "at or before 2025 is selected by the current contract, so " + "Microcosm must not adjudicate a replacement source here." + ), + } + ] + + +_GEOGRAPHY_VALUE_IDS = frozenset( + { + "england", + "great_britain", + "northern_ireland", + "scotland", + "uk", + "wales", + } +) + + +if __name__ == "__main__": + main() From 0ec682483f76bc473a6d4ee5d010f4a22511aba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 03:25:53 +0200 Subject: [PATCH 3/7] Single-home the UK CGT targets onto Ledger references UK_CGT_TARGET_SPECS retires to the emptied-constants shim; the two totals compile from the hmrc/cgt_statistics facts (latest-not-after resolution to the 2023-24 outturn) and the calibration materializer takes the compiled registry instead of minting from module constants. Coverage requirements and the fenced band facts are unchanged; tests pin the compiled values to the pinned facts. Co-Authored-By: Claude Fable 5 --- .../622-uk-cgt-ledger-single-home.added.md | 1 + .../build/uk_runtime/cgt_calibration.py | 34 ++++++-- .../build/uk_runtime/fiscal_targets.py | 74 +++------------- .../tests/test_uk_cgt_calibration.py | 60 ++++++++++--- .../tests/test_uk_cgt_targets.py | 84 ++++++++++++------- 5 files changed, 144 insertions(+), 109 deletions(-) create mode 100644 changelog.d/622-uk-cgt-ledger-single-home.added.md diff --git a/changelog.d/622-uk-cgt-ledger-single-home.added.md b/changelog.d/622-uk-cgt-ledger-single-home.added.md new file mode 100644 index 000000000..338d9c91d --- /dev/null +++ b/changelog.d/622-uk-cgt-ledger-single-home.added.md @@ -0,0 +1 @@ +Move UK CGT totals out of inline runtime constants and compile them from HMRC Ledger target references. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/cgt_calibration.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/cgt_calibration.py index ad1bb7ad9..b0d93cb3b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/cgt_calibration.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/cgt_calibration.py @@ -26,7 +26,6 @@ from microcosm.build.uk_runtime.fiscal_targets import ( UK_CGT_REQUIRED_COLUMNS, - UK_CGT_TARGET_SPECS, ) from microcosm.build.uk_runtime.national_frame import ( uk_household_weight_kind, @@ -99,6 +98,7 @@ def uk_cgt_annual_exempt_amount(time_period: int | str) -> float: def materialize_uk_cgt_calibration_frame( national_frame: Frame, *, + registry: TargetRegistry, annual_exempt_amount: float | None = None, ) -> UKCGTTargetMaterialization: """Prepare the CGT measure columns and assemble the constraint frame. @@ -106,6 +106,7 @@ def materialize_uk_cgt_calibration_frame( Args: national_frame: UK national frame carrying the persisted person-level ``capital_gains`` input and strictly positive household weights. + registry: CGT targets compiled from Ledger references. annual_exempt_amount: Override for the CGT threshold. Defaults to the reviewed AEA for the frame's time period. @@ -150,9 +151,7 @@ def materialize_uk_cgt_calibration_frame( national_frame.weights_for("household").values, index=household["household_id"].to_numpy(), ) - mapped_mass = person["person_household_id"].map( - household_weight_by_id - ) + mapped_mass = person["person_household_id"].map(household_weight_by_id) if mapped_mass.isna().any() or not mapped_mass.gt(0.0).all(): raise ValueError( "UK CGT calibration requires strictly positive prior household " @@ -170,6 +169,7 @@ def materialize_uk_cgt_calibration_frame( "UK CGT prepared columns diverged from the declared measures: " f"{sorted(measure_values)} != {sorted(UK_CGT_REQUIRED_COLUMNS)}." ) + registry_measure_values = _registry_measure_values(registry, measure_values) n_positive = int((support & positive_mass).sum()) if n_positive == 0: @@ -183,7 +183,10 @@ def materialize_uk_cgt_calibration_frame( calibration_person = person[["person_id", "person_household_id"]].reset_index( drop=True ) - calibration_person = calibration_person.assign(**measure_values) + calibration_person = calibration_person.assign( + **measure_values, + **registry_measure_values, + ) frame = Frame( { "person": calibration_person, @@ -200,8 +203,27 @@ def materialize_uk_cgt_calibration_frame( ) return UKCGTTargetMaterialization( frame=frame, - registry=TargetRegistry(UK_CGT_TARGET_SPECS, country="uk"), + registry=registry, annual_exempt_amount=float(annual_exempt_amount), taxpayer_rows=int(support.sum()), minimum_positive_support_rows=n_positive, ) + + +def _registry_measure_values( + registry: TargetRegistry, + prepared_values: dict[str, np.ndarray], +) -> dict[str, np.ndarray]: + """Expose Ledger-compiled measure names as aliases to stable CGT columns.""" + + aliases = { + "hmrc.cgt.gains_total": UK_CGT_GAINS_AMOUNT_COLUMN, + "hmrc.cgt.taxpayers_total": UK_CGT_TAXPAYER_COUNT_COLUMN, + } + values: dict[str, np.ndarray] = {} + for spec in registry: + prepared_name = aliases.get(spec.name) + if prepared_name is None or spec.measure in prepared_values: + continue + values[spec.measure] = prepared_values[prepared_name] + return values 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 f31469aac..be7fa2794 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 @@ -1,4 +1,4 @@ -"""UK fiscal target facts, declared natively in Microcosm. +"""UK fiscal target coverage declarations. The UK national calibration surface is currently ingested from policyengine-uk-data via :func:`microcosm.calibrate.specs_from_pe_surface`, whose @@ -21,15 +21,10 @@ baseline the share of people affected by a rate reform comes out roughly three times too high. -Two targets are declared: - -``hmrc/capital_gains_total`` - Total chargeable gains of CGT taxpayers. - -``hmrc/cgt_taxpayers`` - Number of CGT taxpayers. - -Both are person-entity, following the UK convention established by +The CGT values no longer live in this module. They compile from +``uk/target_references.json`` against HMRC ``cgt_statistics`` Ledger facts at +build time. The measures remain person-entity, following the UK convention +established by ``uk_runtime.hmrc_calibration``: the measures are person-level, so the constraint rows live on the person table while the calibrated weights stay on the household table via the frame's household ``Weights``. Both therefore need @@ -37,19 +32,12 @@ it can serialize, and count-like facts are documented to use prepared indicator/count columns. See ``UK_CGT_REQUIRED_COLUMNS``, and ``uk_runtime.cgt_calibration`` for the materialization that prepares them. - -Open question for reviewers: ``us_runtime.fiscal_targets`` has since moved to -value-free references whose values arrive from an external Ledger artifact at -build time. The values here are inline with citations, which is what the -registry's own ``TargetSpec`` contract describes ("a value, optionally a -standard error, and always a citation"). If the UK should follow the US onto -Ledger-sourced values instead, these specs are the shape to migrate. """ from __future__ import annotations from microcosm.build.gates import TargetCoverageRequirement -from microcosm.calibrate import TargetRegistry, TargetSpec +from microcosm.calibrate import TargetRegistry __all__ = [ "UK_CGT_REQUIRED_COLUMNS", @@ -58,16 +46,6 @@ "UK_FISCAL_TARGET_REGISTRY", ] -#: HMRC Capital Gains Tax statistics, tax year 2023-24 (published August 2025). -_HMRC_CGT_SOURCE = ( - "HMRC Capital Gains Tax statistics, tax year 2023-24, table 1: " - "https://www.gov.uk/government/statistics/capital-gains-tax-statistics" -) - -#: The reference period of the declared facts. HMRC's 2023-24 outturn is the -#: latest published tax year; build-side aging carries it to forecast years. -_HMRC_CGT_PERIOD = 2023 - #: Prepared person columns the frame must expose for these facts to compile. #: #: ``uk_cgt_measure_gains_amount`` is each person's chargeable gains, zeroed on @@ -81,48 +59,16 @@ "uk_cgt_measure_taxpayer_count", ) -UK_CGT_TARGET_SPECS: tuple[TargetSpec, ...] = ( - TargetSpec( - name="hmrc/capital_gains_total", - entity="person", - measure="uk_cgt_measure_gains_amount", - value=65_900_000_000.0, - period=_HMRC_CGT_PERIOD, - source=_HMRC_CGT_SOURCE, - family="hmrc", - notes=( - "Total chargeable gains of CGT taxpayers in 2023-24. Declared " - "unsigned: the fact is a positive aggregate. Note that a measure " - "carrying gains net of losses can be negative on individual " - "person records even though the total is positive, so a build " - "aggregating losses into this column should confirm the sign " - "handling it wants." - ), - ), - TargetSpec( - name="hmrc/cgt_taxpayers", - entity="person", - measure="uk_cgt_measure_taxpayer_count", - value=378_000.0, - period=_HMRC_CGT_PERIOD, - source=_HMRC_CGT_SOURCE, - family="hmrc", - notes=( - "Number of CGT taxpayers in 2023-24. The measure column is a " - "person-level indicator for people above the annual exempt amount in force for the period; " - "the AEA is policy-dependent and must track the period rather " - "than being hard-coded." - ), - ), -) +# Values are Ledger-owned and compile from UK target references. +UK_CGT_TARGET_SPECS: tuple = () UK_CGT_TARGET_COVERAGE_REQUIREMENTS: tuple[TargetCoverageRequirement, ...] = ( TargetCoverageRequirement( requirement_id="uk_capital_gains", label="HMRC capital gains totals and taxpayer counts", accepted_names=( - "hmrc/capital_gains_total", - "hmrc/cgt_taxpayers", + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", ), min_matches=2, notes=( diff --git a/packages/microcosm-build/tests/test_uk_cgt_calibration.py b/packages/microcosm-build/tests/test_uk_cgt_calibration.py index fc41ea824..173898bb9 100644 --- a/packages/microcosm-build/tests/test_uk_cgt_calibration.py +++ b/packages/microcosm-build/tests/test_uk_cgt_calibration.py @@ -18,8 +18,33 @@ uk_cgt_annual_exempt_amount, ) from microcosm.build.uk_runtime.national_frame import uk_national_frame +from microcosm.calibrate import TargetRegistry, TargetSpec from microcosm.frame import WeightKind +CGT_REGISTRY = TargetRegistry( + [ + TargetSpec( + name="hmrc.cgt.gains_total", + entity="person", + measure="hmrc/capital_gains_total", + value=65_937_000_000.0, + period=2025, + source="test", + family="hmrc_cgt", + ), + TargetSpec( + name="hmrc.cgt.taxpayers_total", + entity="person", + measure="hmrc/cgt_taxpayers", + value=378_000.0, + period=2025, + source="test", + family="hmrc_cgt", + ), + ], + country="uk", +) + def _dataset(gains, *, time_period="2023", drop_gains=False, weights=None): ids = np.arange(len(gains), dtype=int) @@ -69,13 +94,13 @@ def test_default_threshold_comes_from_the_dataset_period(): gains = [0.0, 8_000.0, 100_000.0] assert ( materialize_uk_cgt_calibration_frame( - _dataset(gains, time_period="2023") + _dataset(gains, time_period="2023"), registry=CGT_REGISTRY ).taxpayer_rows == 2 ) assert ( materialize_uk_cgt_calibration_frame( - _dataset(gains, time_period="2022") + _dataset(gains, time_period="2022"), registry=CGT_REGISTRY ).taxpayer_rows == 1 ) @@ -84,7 +109,7 @@ def test_default_threshold_comes_from_the_dataset_period(): def test_measure_columns_are_indicator_and_gated_amount(): """Counts are 0/1; amounts are zeroed off-support, not merely copied.""" result = materialize_uk_cgt_calibration_frame( - _dataset([0.0, 5_000.0, 20_000.0, 100_000.0]) + _dataset([0.0, 5_000.0, 20_000.0, 100_000.0]), registry=CGT_REGISTRY ) person = result.frame.table("person") assert person[UK_CGT_TAXPAYER_COUNT_COLUMN].tolist() == [0.0, 0.0, 1.0, 1.0] @@ -94,6 +119,13 @@ def test_measure_columns_are_indicator_and_gated_amount(): 20_000.0, 100_000.0, ] + assert person["hmrc/cgt_taxpayers"].tolist() == [0.0, 0.0, 1.0, 1.0] + assert person["hmrc/capital_gains_total"].tolist() == [ + 0.0, + 0.0, + 20_000.0, + 100_000.0, + ] assert result.annual_exempt_amount == 6_000.0 assert result.taxpayer_rows == 2 assert result.minimum_positive_support_rows == 2 @@ -101,7 +133,9 @@ def test_measure_columns_are_indicator_and_gated_amount(): def test_explicit_threshold_overrides_the_period_default(): result = materialize_uk_cgt_calibration_frame( - _dataset([0.0, 5_000.0, 20_000.0]), annual_exempt_amount=10_000.0 + _dataset([0.0, 5_000.0, 20_000.0]), + registry=CGT_REGISTRY, + annual_exempt_amount=10_000.0, ) assert result.annual_exempt_amount == 10_000.0 assert result.taxpayer_rows == 1 @@ -110,7 +144,7 @@ def test_explicit_threshold_overrides_the_period_default(): def test_frame_carries_person_rows_and_household_weights(): """Constraint rows are person-grain; the calibrated mass stays household.""" result = materialize_uk_cgt_calibration_frame( - _dataset([0.0, 20_000.0], weights=[3.0, 5.0]) + _dataset([0.0, 20_000.0], weights=[3.0, 5.0]), registry=CGT_REGISTRY ) assert set(result.frame.entities) == {"person", "household"} weights = result.frame.resolve_weights("household") @@ -119,20 +153,26 @@ def test_frame_carries_person_rows_and_household_weights(): def test_registry_contains_exactly_the_two_declared_facts(): - result = materialize_uk_cgt_calibration_frame(_dataset([0.0, 20_000.0])) + result = materialize_uk_cgt_calibration_frame( + _dataset([0.0, 20_000.0]), registry=CGT_REGISTRY + ) assert result.registry.country == "uk" assert {spec.name for spec in result.registry} == { - "hmrc/capital_gains_total", - "hmrc/cgt_taxpayers", + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", } def test_missing_capital_gains_column_fails_loudly(): with pytest.raises(ValueError, match="capital_gains"): - materialize_uk_cgt_calibration_frame(_dataset([0.0, 1.0], drop_gains=True)) + materialize_uk_cgt_calibration_frame( + _dataset([0.0, 1.0], drop_gains=True), registry=CGT_REGISTRY + ) def test_zero_support_refuses_to_calibrate_a_positive_fact(): """Every person below the AEA means the £65.9bn fact has no support.""" with pytest.raises(ValueError, match="no strictly positive-mass support"): - materialize_uk_cgt_calibration_frame(_dataset([0.0, 100.0, 5_999.0])) + materialize_uk_cgt_calibration_frame( + _dataset([0.0, 100.0, 5_999.0]), registry=CGT_REGISTRY + ) diff --git a/packages/microcosm-build/tests/test_uk_cgt_targets.py b/packages/microcosm-build/tests/test_uk_cgt_targets.py index 657991eb5..8284ee8f4 100644 --- a/packages/microcosm-build/tests/test_uk_cgt_targets.py +++ b/packages/microcosm-build/tests/test_uk_cgt_targets.py @@ -1,4 +1,4 @@ -"""Tests for the declared UK capital gains target facts. +"""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 @@ -6,8 +6,11 @@ requirement that makes their absence a build failure rather than a silence. """ -import pytest +import json +from pathlib import Path +from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_targets import compile_ledger_target_references from microcosm.build.uk_runtime.fiscal_targets import ( UK_CGT_REQUIRED_COLUMNS, UK_CGT_TARGET_COVERAGE_REQUIREMENTS, @@ -15,35 +18,65 @@ UK_FISCAL_TARGET_REGISTRY, ) +FIXTURE_FEED_ROWS = ( + Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" +) + + +def _compiled_cgt_registry(): + spec = load_country_spec("uk") + references = [ + reference + for reference in spec.target_references + if reference.name in {"hmrc.cgt.gains_total", "hmrc.cgt.taxpayers_total"} + ] + 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") + + +def test_inline_cgt_target_specs_are_retired(): + assert UK_CGT_TARGET_SPECS == () + assert len(UK_FISCAL_TARGET_REGISTRY) == 0 -def test_declares_gains_total_and_taxpayer_count(): - """Both facts are needed: a total alone does not pin the distribution.""" - assert {spec.name for spec in UK_CGT_TARGET_SPECS} == { - "hmrc/capital_gains_total", - "hmrc/cgt_taxpayers", + +def test_compiled_references_declare_gains_total_and_taxpayer_count(): + registry = _compiled_cgt_registry() + + assert {spec.name for spec in registry.specs} == { + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", } -def test_every_fact_carries_provenance(): +def test_every_compiled_fact_carries_provenance(): """A fact without a citation is not a fact.""" - for spec in UK_CGT_TARGET_SPECS: + for spec in _compiled_cgt_registry().specs: assert "gov.uk" in spec.source - assert spec.family == "hmrc" + assert spec.family == "hmrc_cgt" -def test_facts_match_hmrc_2023_24_outturn(): - """Values are HMRC's published outturn, not uprated approximations.""" - by_name = {spec.name: spec for spec in UK_CGT_TARGET_SPECS} - assert by_name["hmrc/capital_gains_total"].value == pytest.approx(65.9e9) - assert by_name["hmrc/cgt_taxpayers"].value == pytest.approx(378_000) - assert all(spec.period == 2023 for spec in UK_CGT_TARGET_SPECS) +def test_compiled_facts_match_hmrc_2023_24_outturn(): + 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 all(spec.period == 2025 for spec in by_name.values()) + assert all( + spec.metadata["ledger_fact_period"] == "2023" for spec in by_name.values() + ) def test_measures_are_declared_columns(): """The registry refuses callables, so measures must be prepared columns.""" - measures = {spec.measure for spec in UK_CGT_TARGET_SPECS} - assert measures == set(UK_CGT_REQUIRED_COLUMNS) - assert all(isinstance(spec.measure, str) for spec in UK_CGT_TARGET_SPECS) + measures = {spec.measure for spec in _compiled_cgt_registry().specs} + assert measures == {"hmrc/capital_gains_total", "hmrc/cgt_taxpayers"} + assert set(UK_CGT_REQUIRED_COLUMNS) == { + "uk_cgt_measure_gains_amount", + "uk_cgt_measure_taxpayer_count", + } def test_facts_are_person_grain(): @@ -52,14 +85,7 @@ def test_facts_are_person_grain(): The weights stay household-level; the frame carries them as household ``Weights`` while the constraint rows live on the person table. """ - assert all(spec.entity == "person" for spec in UK_CGT_TARGET_SPECS) - - -def test_measure_columns_are_prepared_names(): - """Measures name prepared columns, not raw model inputs.""" - by_name = {spec.name: spec for spec in UK_CGT_TARGET_SPECS} - assert by_name["hmrc/capital_gains_total"].measure == "uk_cgt_measure_gains_amount" - assert by_name["hmrc/cgt_taxpayers"].measure == "uk_cgt_measure_taxpayer_count" + assert all(spec.entity == "person" for spec in _compiled_cgt_registry().specs) def test_registry_is_uk_and_content_addressed(): @@ -72,6 +98,6 @@ def test_coverage_requires_both_facts(): (requirement,) = UK_CGT_TARGET_COVERAGE_REQUIREMENTS assert requirement.min_matches == 2 assert set(requirement.accepted_names) == { - "hmrc/capital_gains_total", - "hmrc/cgt_taxpayers", + "hmrc.cgt.gains_total", + "hmrc.cgt.taxpayers_total", } From 84afa81dc7c94ede0fd4acd12f32fa78c97a3d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 03:25:53 +0200 Subject: [PATCH 4/7] Wire the UK compile-parity gates, Ledger release pins, and the calibration seam Two release-blocking preflight gates prove the Ledger-backed compile against the frozen fixtures (production 2023 and incumbent 12a1e028 at 2025) with signed-difference enumeration in both directions. The national build tool adopts the shared ledger-artifact pin surface (one resolved artifact feeds the pin, the gates, and the #729 calibration stage, which is adapted to the 387-reference surface). Gate-battery digests are recomputed from the merged gates.json; the spec-fingerprint doc now matches the code. Co-Authored-By: Claude Fable 5 --- .../622-ledger-compile-parity-gates.added.md | 1 + docs/gate-battery-contract.md | 7 +- .../src/microcosm/build/uk/gates.json | 24 ++++++ .../build/uk_runtime/battery_bindings.py | 76 +++++++++++++++++++ .../build/uk_runtime/national_build.py | 17 +++-- .../tests/test_uk_battery_bindings.py | 43 +++++++++++ .../tests/test_uk_national_build.py | 6 +- .../tests/test_uk_national_calibration.py | 70 +++++++++++++++-- .../src/microcosm/data/contract.py | 16 +++- .../microcosm-data/tests/test_contract.py | 49 ++++++++++-- tools/build_uk_national_dataset.py | 52 ++++++++++--- 11 files changed, 325 insertions(+), 36 deletions(-) create mode 100644 changelog.d/622-ledger-compile-parity-gates.added.md diff --git a/changelog.d/622-ledger-compile-parity-gates.added.md b/changelog.d/622-ledger-compile-parity-gates.added.md new file mode 100644 index 000000000..5233399b1 --- /dev/null +++ b/changelog.d/622-ledger-compile-parity-gates.added.md @@ -0,0 +1 @@ +Add UK Ledger compile-parity fixtures, signed difference resources, and preflight gate-battery entries. diff --git a/docs/gate-battery-contract.md b/docs/gate-battery-contract.md index d52c77d4c..8f340e0b0 100644 --- a/docs/gate-battery-contract.md +++ b/docs/gate-battery-contract.md @@ -86,9 +86,10 @@ Three digests pin the declaration, all carried in every report: editing rationale does not move gate policy. - `gates_manifest_sha256` — over the full manifest including `notes` and the phase order. -- `spec_fingerprint` — the composition fingerprint of the whole country - package. Adding or editing `gates.json` moves `CountrySpec.fingerprint`; - anything pinning it must be regenerated in the same change. +- `spec_fingerprint` — the composition fingerprint of `gates.json` only. + Adding or editing a gate entry moves this value; unrelated country-package + resources do not. Anything pinning it must be regenerated in the same + change. ## Supplying evidence: `EvidenceContext` and bindings diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index b258907ed..ce9119aaa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -25,6 +25,30 @@ "parameters": {}, "notes": "Frameless preflight over the materialized stage names: every family the coverage manifest marks required_at_build must have its build stage scheduled before any stage runs." }, + { + "id": "uk_ledger_compile_parity_production_2023", + "gate": "ledger_compile_parity", + "phase": "preflight", + "criticality": "release_blocking", + "parameters": { + "fixture_resource": "parity_fixture_production_2023.json", + "signed_differences_resource": "ledger_compile_parity_production_2023_signed_differences.json", + "target_period": 2023 + }, + "notes": "Ledger-compiled UK targets at period 2023 compared with the certified production 2023 calibration surface fixture. Signed differences are committed for adjudication rather than hidden." + }, + { + "id": "uk_ledger_compile_parity_incumbent_2025", + "gate": "ledger_compile_parity", + "phase": "preflight", + "criticality": "release_blocking", + "parameters": { + "fixture_resource": "registry_parity_fixture_2025.json", + "signed_differences_resource": "ledger_compile_parity_incumbent_2025_signed_differences.json", + "target_period": 2025 + }, + "notes": "Ledger-compiled UK targets at the 2025 calibration period compared with the frozen incumbent registry surface. The signed list enumerates TCL additions, exclusions, unsupported rows, and vintage drift for review." + }, { "id": "uk_release_input_coverage", "gate": "release_input_coverage", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py index d163abdf4..28cb33b40 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py @@ -28,6 +28,7 @@ from __future__ import annotations +import hashlib import json from collections.abc import Callable, Mapping from dataclasses import dataclass, replace @@ -47,6 +48,7 @@ GateResult, aggregate_admin_gate, enum_domain_gate, + ledger_compile_parity_gate, nonnegative_columns_gate, support_gate, weights_audit_gate, @@ -714,6 +716,65 @@ def _evaluate_tail_concentration( ) +def _evaluate_ledger_compile_parity( + context: EvidenceContext, parameters: Mapping[str, Any] +) -> GateResult: + fixture_resource = str(parameters["fixture_resource"]) + fixture = json.loads( + files("microcosm.build.uk").joinpath(fixture_resource).read_text() + ) + signed_differences = parameters.get("signed_differences", ()) + signed_resource = parameters.get("signed_differences_resource") + if signed_resource is not None: + signed_differences = json.loads( + files("microcosm.build.uk").joinpath(str(signed_resource)).read_text() + )["differences"] + target_period = parameters["target_period"] + return ledger_compile_parity_gate( + _ledger_compile_parity_registry(context, target_period), + fixture, + signed_differences=signed_differences, + ) + + +def _ledger_compile_parity_evidence( + context: EvidenceContext, parameters: Mapping[str, Any] +) -> object: + target_period = parameters["target_period"] + registry = _ledger_compile_parity_registry(context, target_period) + fixture_resource = str(parameters["fixture_resource"]) + fixture_text = files("microcosm.build.uk").joinpath(fixture_resource).read_text() + return { + "registry_version": getattr(registry, "version", None), + "registry_count": len(registry) if hasattr(registry, "__len__") else None, + "fixture_resource": fixture_resource, + "fixture_sha256": hashlib.sha256(fixture_text.encode("utf-8")).hexdigest(), + "target_period": target_period, + "signed_differences": parameters.get("signed_differences", ()), + "signed_differences_resource": parameters.get("signed_differences_resource"), + } + + +def _ledger_compile_parity_registry( + context: EvidenceContext, + target_period: object, +) -> object: + registries = context.artifacts["uk_ledger_compiled_registries"] + if not isinstance(registries, Mapping): + raise TypeError( + "uk_ledger_compiled_registries must map target periods to registries." + ) + if target_period in registries: + return registries[target_period] + target_period_key = str(target_period) + if target_period_key in registries: + return registries[target_period_key] + raise KeyError( + f"UK Ledger compile parity has no registry for target period " + f"{target_period!r}; available periods: {sorted(map(str, registries))}." + ) + + # --------------------------------------------------------------------------- # The registry # --------------------------------------------------------------------------- @@ -859,4 +920,19 @@ def _evaluate_tail_concentration( artifact_keys=frozenset({"exclusions_evaluated_on"}), legacy_name="qrf_tail_concentration", ), + "ledger_compile_parity": UKGateBinding( + name="ledger_compile_parity", + evaluator=_evaluate_ledger_compile_parity, + parameter_keys=frozenset( + { + "fixture_resource", + "signed_differences", + "signed_differences_resource", + "target_period", + } + ), + artifact_keys=frozenset({"uk_ledger_compiled_registries"}), + needs_frame=False, + evidence=_ledger_compile_parity_evidence, + ), } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/national_build.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/national_build.py index 9c51d23ef..d8a16a897 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/national_build.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/national_build.py @@ -65,6 +65,7 @@ UKReviewedExclusion, exclusion_evaluation_date, ) +from microcosm.calibrate import TargetRegistry from microcosm.frame import ( Frame, MassChangeRecord, @@ -358,6 +359,7 @@ def build_uk_national_dataset( release_candidate: bool = False, now: date | None = None, gate_registry: Mapping[str, GateBinding] | None = None, + ledger_target_registry: Mapping[int | str, TargetRegistry] | None = None, ) -> UKNationalBuildResult: """Run ordered national stages, hard-gate the result, and stage an H5. @@ -482,14 +484,17 @@ def build_uk_national_dataset( diagnostic_path.unlink(missing_ok=True) # Mirrors the US cheap preflight: graph or reference drift blocks before # source stages — now with the refusal persisted as a schema-4 report. + preflight_artifacts: dict[str, object] = { + "coverage_engine": engine, + "build_stage_names": tuple(stage.name for stage in materialized_stages), + } + if ledger_target_registry is not None: + preflight_artifacts["uk_ledger_compiled_registries"] = dict( + ledger_target_registry + ) battery.run_phase( "preflight", - EvidenceContext( - artifacts={ - "coverage_engine": engine, - "build_stage_names": tuple(stage.name for stage in materialized_stages), - } - ), + EvidenceContext(artifacts=preflight_artifacts), ) battery.enforce("preflight", mode=BlockingMode.BLOCKS_ARTIFACT) frame, provenance = load_uk_national_frame(requested_input_path) diff --git a/packages/microcosm-build/tests/test_uk_battery_bindings.py b/packages/microcosm-build/tests/test_uk_battery_bindings.py index fe4d5bda2..0444e691d 100644 --- a/packages/microcosm-build/tests/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/test_uk_battery_bindings.py @@ -33,6 +33,7 @@ from microcosm.build.uk_runtime.battery_bindings import ( UK_GATE_REGISTRY, UKGateBinding, + _ledger_compile_parity_registry, ) from microcosm.build.uk_runtime.national_frame import ( _uk_gate_surface, @@ -48,6 +49,7 @@ from microcosm.build.uk_runtime.terminal_gates import ( UKInputMassReference, ) +from microcosm.calibrate import TargetRegistry, TargetSpec from microcosm.frame import engine_tables KEY = base64.b64encode(b"\x07" * 32).decode("ascii") @@ -719,8 +721,49 @@ def test_preflight_passes_with_the_committed_manifest(self, uk_gates) -> None: assert statuses == { "uk_release_input_coverage_manifest_current": GateStatus.PASSED, "uk_release_family_build_stages": GateStatus.PASSED, + "uk_ledger_compile_parity_production_2023": (GateStatus.EVIDENCE_ABSENT), + "uk_ledger_compile_parity_incumbent_2025": GateStatus.EVIDENCE_ABSENT, } + def test_ledger_compile_parity_selects_the_declared_period_registry(self) -> None: + registry_2023 = TargetRegistry( + ( + TargetSpec( + name="target", + entity="household", + measure="measure", + value=1.0, + period=2023, + source="synthetic", + ), + ), + country="uk", + ) + registry_2025 = TargetRegistry( + ( + TargetSpec( + name="target", + entity="household", + measure="measure", + value=2.0, + period=2025, + source="synthetic", + ), + ), + country="uk", + ) + context = EvidenceContext( + artifacts={ + "uk_ledger_compiled_registries": { + 2023: registry_2023, + 2025: registry_2025, + } + } + ) + + assert _ledger_compile_parity_registry(context, 2023) is registry_2023 + assert _ledger_compile_parity_registry(context, 2025) is registry_2025 + def test_missing_required_stage_fails_with_the_assertion_text( self, uk_gates ) -> None: diff --git a/packages/microcosm-build/tests/test_uk_national_build.py b/packages/microcosm-build/tests/test_uk_national_build.py index e9c101110..6cc3fe26a 100644 --- a/packages/microcosm-build/tests/test_uk_national_build.py +++ b/packages/microcosm-build/tests/test_uk_national_build.py @@ -1091,6 +1091,8 @@ def test_national_build_real_terminal_batch_blocks_incomplete_qrf_before_staging assert statuses == { "uk_release_input_coverage_manifest_current": "passed", "uk_release_family_build_stages": "passed", + "uk_ledger_compile_parity_production_2023": "evidence_absent", + "uk_ledger_compile_parity_incumbent_2025": "evidence_absent", "uk_release_input_coverage": "passed", "uk_degenerate_release_surface": "passed", "uk_zero_weight_strata": "passed", @@ -1796,8 +1798,8 @@ def test_release_candidate_blocks_on_named_evidence_gaps(tmp_path) -> None: gate_registry=registry, release_candidate=True, ) - assert error.value.phase == "terminal" - assert "[uk_weight_ratio]" in str(error.value) + assert error.value.phase == "preflight" + assert "[uk_ledger_compile_parity_production_2023]" in str(error.value) assert not (tmp_path / "candidate.h5").exists() diff --git a/packages/microcosm-build/tests/test_uk_national_calibration.py b/packages/microcosm-build/tests/test_uk_national_calibration.py index bff827548..a299d1782 100644 --- a/packages/microcosm-build/tests/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/test_uk_national_calibration.py @@ -3,6 +3,7 @@ from __future__ import annotations import json +from importlib import resources as importlib_resources import numpy as np import pandas as pd @@ -15,6 +16,8 @@ from microcosm.build.uk_runtime.national_frame import validate_uk_national_frame from microcosm.frame import EntitySchema, Frame, WeightKind, Weights +ACTIVE_REFERENCE_COUNT = 387 + def _uc_reference(**overrides) -> LedgerTargetReference: values = { @@ -78,6 +81,32 @@ def _frame() -> Frame: ) +def _nested_frame() -> Frame: + return Frame( + { + "person": pd.DataFrame( + { + "person_id": np.arange(6, dtype="int64"), + "person_benunit_id": [0, 0, 1, 2, 3, 3], + "person_household_id": [0, 0, 0, 1, 2, 2], + } + ), + "benunit": pd.DataFrame( + { + "benunit_id": np.arange(4, dtype="int64"), + "universal_credit": [1.0, 0.0, 1.0, 1.0], + } + ), + "household": pd.DataFrame( + {"household_id": np.arange(3, dtype="int64")} + ), + }, + EntitySchema(group_entities=("benunit", "household")), + {"household": Weights(np.array([10.0, 20.0, 30.0]), WeightKind.DESIGN)}, + metadata={"time_period": "2023"}, + ) + + def test_uc_calibration_compiles_and_moves_weighted_count_towards_fact() -> None: frame = _frame() stage = UKNationalCalibrationStage( @@ -95,6 +124,22 @@ def test_uc_calibration_compiles_and_moves_weighted_count_towards_fact() -> None assert stage.diagnostics[0]["target"] == 30.0 +def test_uc_calibration_stage_accepts_benunit_grain_reference_on_nested_frame() -> None: + frame = _nested_frame() + stage = UKNationalCalibrationStage( + [_fact(value=60.0)], references=[_uc_reference()], epochs=5 + ) + + result = stage(frame) + + assert stage.manifest["activated_reference_count"] == 1 + assert stage.manifest["resolved_reference_count"] == 1 + assert stage.manifest["matrix_target_count"] == 1 + assert stage.diagnostics[0]["target"] == 60.0 + assert stage.diagnostics[0]["estimate"] == pytest.approx(60.0) + validate_uk_national_frame(result) + + def test_activated_unresolvable_reference_aborts_loudly() -> None: stage = UKNationalCalibrationStage( [_fact(concept="different")], references=[_uc_reference()], epochs=1 @@ -108,14 +153,28 @@ def test_chronicle_184_uc_and_obr_references_compile_fail_closed() -> None: from microcosm.build.country_spec import load_country_spec from microcosm.build.ledger_targets import compile_ledger_target_references + spec = load_country_spec("uk") + assert len(spec.target_references) == ACTIVE_REFERENCE_COUNT + reference_names = {reference.name for reference in spec.target_references} + assert "obr.universal_credit_in_cap" in reference_names + assert "dwp.uc.households" not in reference_names + + membership = json.loads( + importlib_resources.files("microcosm.build.uk") + .joinpath("target_reference_membership.json") + .read_text() + ) + assert membership["targets"]["dwp.uc.households"]["status"] == ( + "no_fact_at_or_before_period" + ) + references = tuple( reference - for reference in load_country_spec("uk").target_references - if reference.name in {"dwp.uc.households", "obr.universal_credit_in_cap"} + for reference in spec.target_references + if reference.name == "obr.universal_credit_in_cap" ) registry = compile_ledger_target_references( [ - _fact(), _fact( concept="obr.universal_credit_in_cap", source_name="obr", @@ -126,10 +185,7 @@ def test_chronicle_184_uc_and_obr_references_compile_fail_closed() -> None: country="uk", ) - assert {spec.name for spec in registry.specs} == { - "dwp.uc.households", - "obr.universal_credit_in_cap", - } + assert {spec.name for spec in registry.specs} == {"obr.universal_credit_in_cap"} def test_calibration_preserves_entity_ids_and_national_integrity() -> None: diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index fc0790570..eb91cc38a 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -344,13 +344,13 @@ # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "728a5fe2f543f59e2797e4227269fe4516508a274b4fa5fe49559387d6b9d686" + "47d41dc3643818e049034b4333392aeb352bed5f76fc4556c1da5ba2fe8fb86d" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "f01e5459debc6f3ebfa097591749377b640a5d633e3df3825575b4ec15eeacb2" + "687bb4ae4b085ac9abf2e77a7a0c8bcf11204eb9b00fdac1fd7232e16f81161f" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "f358121fefc6e0e2371956dc0628c1d997ee3735e558ca3dd4526326a6add78b" + "e54e2f5880f2380854d9764dcd5482aaa51e37ca0915a3ffaa0c9897626ba656" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -383,6 +383,14 @@ "preflight", ), "uk_release_family_build_stages": ("source_coverage", "preflight"), + "uk_ledger_compile_parity_production_2023": ( + "ledger_compile_parity", + "preflight", + ), + "uk_ledger_compile_parity_incumbent_2025": ( + "ledger_compile_parity", + "preflight", + ), "uk_release_input_coverage": ("release_input_coverage", "terminal"), "uk_degenerate_release_surface": ("degenerate_release_surface", "terminal"), "uk_zero_weight_strata": ("zero_weight_strata", "terminal"), @@ -411,6 +419,8 @@ _UK_GATE_BATTERY_EVIDENCE_IDS = frozenset( { "uk_release_family_build_stages", + "uk_ledger_compile_parity_production_2023", + "uk_ledger_compile_parity_incumbent_2025", "uk_degenerate_release_surface", "uk_input_mass_parity", } diff --git a/packages/microcosm-data/tests/test_contract.py b/packages/microcosm-data/tests/test_contract.py index 6d5cc69cf..cc68fbfc6 100644 --- a/packages/microcosm-data/tests/test_contract.py +++ b/packages/microcosm-data/tests/test_contract.py @@ -144,13 +144,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "728a5fe2f543f59e2797e4227269fe4516508a274b4fa5fe49559387d6b9d686" + "47d41dc3643818e049034b4333392aeb352bed5f76fc4556c1da5ba2fe8fb86d" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "f01e5459debc6f3ebfa097591749377b640a5d633e3df3825575b4ec15eeacb2" + "687bb4ae4b085ac9abf2e77a7a0c8bcf11204eb9b00fdac1fd7232e16f81161f" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "f358121fefc6e0e2371956dc0628c1d997ee3735e558ca3dd4526326a6add78b" + "e54e2f5880f2380854d9764dcd5482aaa51e37ca0915a3ffaa0c9897626ba656" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "d0d024043132fa07c378c393dbe2b24fe99bf19e876bcc39997d2c80cc9bd4f6" @@ -166,6 +166,16 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: None, ), "uk_release_family_build_stages": ("source_coverage", "preflight", None), + "uk_ledger_compile_parity_production_2023": ( + "ledger_compile_parity", + "preflight", + None, + ), + "uk_ledger_compile_parity_incumbent_2025": ( + "ledger_compile_parity", + "preflight", + None, + ), "uk_release_input_coverage": ( "release_input_coverage", "terminal", @@ -1038,9 +1048,22 @@ def _gate_battery_payload( details: dict = {"check": "manifest_current"} elif entry_id == "uk_release_family_build_stages": details = {"stage_names": list(stage_names)} + elif entry_id == "uk_ledger_compile_parity_production_2023": + details = { + "fixture": "production_2023", + "expected_count": 149, + "actual_count": 149, + "signed_difference_count": 0, + } + elif entry_id == "uk_ledger_compile_parity_incumbent_2025": + details = { + "fixture": "incumbent_2025", + "expected_count": 636, + "actual_count": 636, + "signed_difference_count": 0, + } elif entry_id == "uk_calibration_reference_coverage": - # Mirrors _evaluate_calibration_reference_coverage's detail block. - details = {"activated": 15, "resolved": 15, "matrix": 15} + details = {"activated": 387, "resolved": 387, "matrix": 387} else: details = _terminal_gate_details(detail_name) gates[entry_id] = { @@ -1056,6 +1079,22 @@ def _gate_battery_payload( "uk_release_family_build_stages": _canonical_sha256( {"stage_names": list(stage_names)} ), + "uk_ledger_compile_parity_production_2023": _canonical_sha256( + { + "fixture_resource": "parity_fixture_production_2023.json", + "registry_count": 149, + "registry_version": "fixture", + "signed_differences": [], + } + ), + "uk_ledger_compile_parity_incumbent_2025": _canonical_sha256( + { + "fixture_resource": "registry_parity_fixture_2025.json", + "registry_count": 636, + "registry_version": "fixture", + "signed_differences": [], + } + ), "uk_degenerate_release_surface": UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256, "uk_input_mass_parity": UK_GATE_BATTERY_INPUT_MASS_EVIDENCE_SHA256, } diff --git a/tools/build_uk_national_dataset.py b/tools/build_uk_national_dataset.py index f8ecee0b6..ffd679288 100644 --- a/tools/build_uk_national_dataset.py +++ b/tools/build_uk_national_dataset.py @@ -15,7 +15,10 @@ from microcosm.build.country_spec import country_stage_plan, load_country_spec from microcosm.build.gate_battery import GateBatteryBlockedError -from microcosm.build.ledger_artifact import load_ledger_consumer_artifact +from microcosm.build.ledger_artifact import ( + add_ledger_artifact_args, + resolve_ledger_artifact, +) from microcosm.build.logbook import canonical_json_bytes from microcosm.build.logbook_adoption import ( AttemptState, @@ -43,6 +46,7 @@ UKHMRCIncomeStageTransform, verify_certified_uk_candidate, ) +from microcosm.build.uk_runtime.ledger_targets import compile_uk_target_registry from microcosm.build.uk_runtime.national_build import build_uk_national_dataset from microcosm.build.uk_runtime.national_calibration import ( UKNationalCalibrationStage, @@ -145,11 +149,6 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace: "that will ship with this release." ), ) - parser.add_argument( - "--ledger-facts", - type=Path, - help="Pinned Chronicle consumer artifact used to resolve UK targets.", - ) parser.add_argument( "--national-calibration-diagnostics-json", type=Path, @@ -322,6 +321,7 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace: "POPULACE_LOGBOOK_PREV_ROW_DIGEST is used, then genesis null." ), ) + add_ledger_artifact_args(parser) args = parser.parse_args(argv) if args.release_candidate and args.sample_fraction != 1.0: parser.error( @@ -415,9 +415,9 @@ def _source_pins( retained_leaves_transform: UKFRSHMRCRetainedLeavesStageTransform, hmrc_transform: UKHMRCIncomeStageTransform, cgt_ods_path: Path, + ledger_artifact: object | None = None, ) -> dict[str, dict[str, object]]: - # ``ledger_facts`` joins this pin surface when #622/#623 land. - return { + pins = { "certified_candidate": { "sha256": str(candidate.sha256), "size_bytes": int(candidate.size_bytes), @@ -428,6 +428,9 @@ def _source_pins( "hmrc_ods": _artifact_pin(hmrc_transform.hmrc_ods_path), "cgt_ods": _artifact_pin(cgt_ods_path), } + if ledger_artifact is not None: + pins["ledger_facts"] = dict(ledger_artifact.provenance()) + return pins def _gate_verdicts_from_report( @@ -771,6 +774,17 @@ def _main_recording( args.degenerate_exclusions, resource=UK_DEGENERATE_EXCLUSION_REGISTER_RESOURCE, ) + ledger_artifact = resolve_ledger_artifact(args) + ledger_compilations = ( + None + if ledger_artifact is None + else { + period: compile_uk_target_registry( + ledger_artifact.facts, target_period=period + ) + for period in (2023, 2025) + } + ) candidate = verify_certified_uk_candidate(args.input_h5) evidence_path.unlink(missing_ok=True) replay_path.unlink(missing_ok=True) @@ -800,6 +814,7 @@ def _main_recording( retained_leaves_transform=retained_leaves_transform, hmrc_transform=hmrc_transform, cgt_ods_path=args.cgt_ods, + ledger_artifact=ledger_artifact, ) run_config = _staging_run_config( args, @@ -848,7 +863,7 @@ def _main_recording( calibration_transform = None calibration_stages: tuple[PlanStage, ...] = () if args.ledger_facts is not None: - ledger_artifact = load_ledger_consumer_artifact(args.ledger_facts) + assert ledger_artifact is not None # resolved and pin-checked above calibration_transform = UKNationalCalibrationStage(ledger_artifact.facts) calibration_stages = ( PlanStage( @@ -886,6 +901,14 @@ def _main_recording( sample_fraction=args.sample_fraction, sample_seed=args.sample_seed, release_candidate=args.release_candidate, + ledger_target_registry=( + None + if ledger_compilations is None + else { + period: compilation.registry + for period, compilation in ledger_compilations.items() + } + ), ) if calibration_transform is not None: _write_json( @@ -932,6 +955,9 @@ def _main_recording( sample_fraction=args.sample_fraction, sample_seed=args.sample_seed, degenerate_exclusions_override=args.degenerate_exclusions is not None, + ledger_artifact_provenance=( + None if ledger_artifact is None else ledger_artifact.provenance() + ), ) _write_json(build_record_path, build_record) append_phase(state, "build_record_written") @@ -1072,6 +1098,7 @@ def _aggregate_build_record( sample_fraction: float = 1.0, sample_seed: int = UK_SAMPLE_SEED_DEFAULT, degenerate_exclusions_override: bool = False, + ledger_artifact_provenance: dict[str, object] | None = None, ) -> dict[str, object]: """Return commit-safe aggregate evidence for one successful staging build.""" @@ -1084,6 +1111,8 @@ def _aggregate_build_record( for role, info in artifacts.items() } safe_artifacts["staging_h5"]["retention"] = "local_untracked" + if ledger_artifact_provenance is not None: + safe_artifacts["ledger_facts"] = ledger_artifact_provenance retained_sources = dict(retained_evidence.get("sources", {})) family_sources = dict(family_evidence.get("sources", {})) mass_changes = [ @@ -1101,6 +1130,9 @@ def _aggregate_build_record( for record in result.frame.mass_log ] release_evidence = dict(result.gate_report["release_evidence"]) + source_vintages = dict(family_evidence.get("source_vintages", {})) + if ledger_artifact_provenance is not None: + source_vintages["ledger_facts"] = ledger_artifact_provenance return { "schema_version": 3, "build_kind": "uk_national_staging_dataset", @@ -1148,7 +1180,7 @@ def _aggregate_build_record( dict(family_sources.get("spi_donor", {})).get("rows_used", 0) ), }, - "source_vintages": dict(family_evidence.get("source_vintages", {})), + "source_vintages": source_vintages, "terminal_gates": dict(result.gate_report), "input_coverage": { "passed": bool(result.input_coverage.passed), From 2bc82907694ca038d85ef81b112c7971b6450d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:03:23 +0200 Subject: [PATCH 5/7] Activate the Universal Credit caseload on the post-#184 chronicle feed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chronicle#184 landed the DWP UC benefit-unit caseload facts; the staged feed rebuilt from chronicle main (107,550 facts, sha 226358e7…). dwp.uc.households activates with the adjudicated calendar_year_average operation over the nine CY-2025 monthly facts (mean 6,758,889 vs the incumbent's 6,700,000 — signed +0.9% difference; the Jan/Feb 2026 plateau months are correctly outside the year window). The only membership movement in the refresh: 388 active, 27 no-fact deferrals. Co-Authored-By: Claude Fable 5 --- ...ity_incumbent_2025_signed_differences.json | 21 ++++----- .../build/uk/target_reference_membership.json | 44 +++++++++++-------- .../microcosm/build/uk/target_references.json | 20 +++++++++ .../tests/test_country_spec.py | 5 ++- .../tests/test_uk_national_calibration.py | 12 +++-- .../tests/test_uk_target_references.py | 6 +-- .../microcosm-data/tests/test_contract.py | 2 +- 7 files changed, 73 insertions(+), 37 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json index edf8da15d..399a3c6f1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -1,8 +1,8 @@ { - "compiled_count": 387, + "compiled_count": 388, "counts_by_kind": { - "calibration_drift": 162, - "fixture_only": 288, + "calibration_drift": 163, + "fixture_only": 287, "ledger_only": 38 }, "difference_count": 488, @@ -21,13 +21,6 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, - { - "fixture_value": 6700000.0, - "kind": "fixture_only", - "name": "dwp.uc.households", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, { "fixture_value": 320866000.0, "kind": "fixture_only", @@ -2297,6 +2290,14 @@ "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." }, + { + "fixture_value": 6700000.0, + "kind": "calibration_drift", + "ledger_value": 6758888.888888889, + "name": "dwp.uc.households", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, { "fixture_value": 1222944.0, "kind": "calibration_drift", 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 d940016b4..523bbec8a 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 @@ -3,11 +3,11 @@ "target_period": 2025, "candidate_count": 417, "contract_target_count": 189, - "active_reference_count": 387, + "active_reference_count": 388, "status_counts": { - "active": 387, + "active": 388, "multi_fact": 1, - "no_fact_at_or_before_period": 28, + "no_fact_at_or_before_period": 27, "signed_excluded": 1 }, "geography_pins": { @@ -2571,6 +2571,11 @@ "name": "slc.repayments.england_plan_5", "from": "2024", "to": "2025" + }, + { + "name": "dwp.uc.households", + "from": "2025-04", + "to": "2025" } ], "targets": { @@ -6911,7 +6916,7 @@ "resolved_period": 2025, "resolved_value": 4316000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b9e5e398b210a3ea68426ecf" + "resolved_fact_key": "ledger_aggregate_fact_v2_c9c67fe2978eaa513a44a926" } ] }, @@ -6926,7 +6931,7 @@ "resolved_period": 2025, "resolved_value": 4254000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_64eb1c1c056801b5d35b4d54" + "resolved_fact_key": "ledger_aggregate_fact_v2_e6c50ddf29ed1ab77864b6a2" } ] }, @@ -6941,7 +6946,7 @@ "resolved_period": 2025, "resolved_value": 813000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b376430d8bd3c235b6700e8e" + "resolved_fact_key": "ledger_aggregate_fact_v2_3ec0cf9defbe2ab83ab41571" } ] }, @@ -6956,7 +6961,7 @@ "resolved_period": 2025, "resolved_value": 8119000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6b742175372b64a00bc0f099" + "resolved_fact_key": "ledger_aggregate_fact_v2_b11f5e90017de17e52604807" } ] }, @@ -6971,7 +6976,7 @@ "resolved_period": 2025, "resolved_value": 5439000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_076e38042145c010a7559f88" + "resolved_fact_key": "ledger_aggregate_fact_v2_12ff8cdd70354a89e79666d2" } ] }, @@ -6986,7 +6991,7 @@ "resolved_period": 2025, "resolved_value": 931000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e8702e666eefe9371822496a" + "resolved_fact_key": "ledger_aggregate_fact_v2_b7f864011603a30bf3d9a36d" } ] }, @@ -7001,7 +7006,7 @@ "resolved_period": 2025, "resolved_value": 1848000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f8816414af21bafd4920fe77" + "resolved_fact_key": "ledger_aggregate_fact_v2_a14d855449d9c8dc5e885d7e" } ] }, @@ -7016,7 +7021,7 @@ "resolved_period": 2025, "resolved_value": 1835000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c4cbf7c83596d1e7fdb04d9f" + "resolved_fact_key": "ledger_aggregate_fact_v2_e71a9da14a3e6459fb4280b3" } ] }, @@ -7031,7 +7036,7 @@ "resolved_period": 2025, "resolved_value": 1204000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_207a9bb610afeb3f75f58baa" + "resolved_fact_key": "ledger_aggregate_fact_v2_5dabc71ee334f3c3246258bf" } ] }, @@ -7046,7 +7051,7 @@ "resolved_period": 2025, "resolved_value": 244000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_59100f5ffbe83b5a59271e60" + "resolved_fact_key": "ledger_aggregate_fact_v2_b4156d9db1a22d31bfaa20ff" } ] }, @@ -7588,14 +7593,17 @@ ] }, "dwp.uc.households": { - "status": "no_fact_at_or_before_period", + "status": "active", "candidates": [ { "name": "dwp.uc.households", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 0, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period" + "status": "active", + "matched_fact_count_overall": 11, + "matched_fact_count_at_or_before_period": 9, + "resolved_period": 2025, + "resolved_value": 6758888.888888889, + "resolved_fact_period": "2025-04", + "resolved_fact_key": "ledger_aggregate_fact_v2_2aa7149107cd8906fe8fed57" } ] } 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 bfc678d85..00e11c462 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -9356,6 +9356,26 @@ "value_operation": "sum", "uprating_from_period": "2024", "uprating_to_period": 2025 + }, + { + "name": "dwp.uc.households", + "ledger_selector": { + "source_name": "dwp", + "source_concept": "dwp.uc_benefit_units", + "geography_level": "country", + "geography_id": "K03000001" + }, + "entity": "benunit", + "measure": "dwp/uc/households", + "family": "dwp_universal_credit", + "period": 2025, + "metadata": { + "contract_target_id": "dwp.uc.households", + "measure_kind": "prepared_column" + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-04", + "uprating_to_period": 2025 } ] } diff --git a/packages/microcosm-build/tests/test_country_spec.py b/packages/microcosm-build/tests/test_country_spec.py index ce35cdf47..19ff0df4e 100644 --- a/packages/microcosm-build/tests/test_country_spec.py +++ b/packages/microcosm-build/tests/test_country_spec.py @@ -381,8 +381,11 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: spec = load_country_spec("uk") references = {reference.name: reference for reference in spec.target_references} - assert len(references) == 387 + assert len(references) == 388 assert references["obr.esa"].value_operation == "sum" + assert references["dwp.uc.households"].value_operation == ( + "calendar_year_average" + ) assert ( references["obr.income_tax"].assertion_policy == "allow_source_projection" diff --git a/packages/microcosm-build/tests/test_uk_national_calibration.py b/packages/microcosm-build/tests/test_uk_national_calibration.py index a299d1782..ae0ae1695 100644 --- a/packages/microcosm-build/tests/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/test_uk_national_calibration.py @@ -16,7 +16,7 @@ from microcosm.build.uk_runtime.national_frame import validate_uk_national_frame from microcosm.frame import EntitySchema, Frame, WeightKind, Weights -ACTIVE_REFERENCE_COUNT = 387 +ACTIVE_REFERENCE_COUNT = 388 def _uc_reference(**overrides) -> LedgerTargetReference: @@ -157,16 +157,20 @@ def test_chronicle_184_uc_and_obr_references_compile_fail_closed() -> None: assert len(spec.target_references) == ACTIVE_REFERENCE_COUNT reference_names = {reference.name for reference in spec.target_references} assert "obr.universal_credit_in_cap" in reference_names - assert "dwp.uc.households" not in reference_names + assert "dwp.uc.households" in reference_names membership = json.loads( importlib_resources.files("microcosm.build.uk") .joinpath("target_reference_membership.json") .read_text() ) - assert membership["targets"]["dwp.uc.households"]["status"] == ( - "no_fact_at_or_before_period" + assert membership["targets"]["dwp.uc.households"]["status"] == "active" + uc_reference = next( + reference + for reference in spec.target_references + if reference.name == "dwp.uc.households" ) + assert uc_reference.value_operation == "calendar_year_average" references = tuple( reference diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index cdf65c8a4..60e70fe81 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -33,7 +33,7 @@ _value_operation_by_target_id, ) -ACTIVE_REFERENCE_COUNT = 387 +ACTIVE_REFERENCE_COUNT = 388 UK_DATA_REPO = "policyengine-" + "uk-data" FIXTURE_REFERENCE_NAMES = { @@ -190,9 +190,9 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: assert membership["target_period"] == 2025 assert membership["active_reference_count"] == ACTIVE_REFERENCE_COUNT assert membership["status_counts"] == { - "active": 387, + "active": 388, "multi_fact": 1, - "no_fact_at_or_before_period": 28, + "no_fact_at_or_before_period": 27, "signed_excluded": 1, } assert membership["genuine_sum_residue"] diff --git a/packages/microcosm-data/tests/test_contract.py b/packages/microcosm-data/tests/test_contract.py index cc68fbfc6..09068cea1 100644 --- a/packages/microcosm-data/tests/test_contract.py +++ b/packages/microcosm-data/tests/test_contract.py @@ -1063,7 +1063,7 @@ def _gate_battery_payload( "signed_difference_count": 0, } elif entry_id == "uk_calibration_reference_coverage": - details = {"activated": 387, "resolved": 387, "matrix": 387} + details = {"activated": 388, "resolved": 388, "matrix": 388} else: details = _terminal_gate_details(detail_name) gates[entry_id] = { From c53451710bdb104305c8983818c38a59e75b246b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 18:59:02 +0200 Subject: [PATCH 6/7] Harden the parity signatures and route calibration through the shared materializer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adversarial-review fixes (two findings, both confirmed): signed parity rows are now self-checking — the live comparison must reproduce each signed row's kind and values within tolerance, and stale or absorbed signatures fail the gate with named failures (evidence records every checked value). The UK national calibration stage prepares measures through the shared target_materialization interpreter and fails closed when any activated reference cannot be materialized; an integration test exercises all five binding classes from the packaged resources (the previous inline path read value_variable unconditionally and would have broken on value_expression and counterfactual-kind references at build time). Co-Authored-By: Claude Fable 5 --- .../src/microcosm/build/gates.py | 140 ++++++++++++++-- .../microcosm/build/target_materialization.py | 36 ++++- .../microcosm/build/uk_runtime/__init__.py | 2 + .../build/uk_runtime/ledger_targets.py | 131 +++++++++++++++ .../build/uk_runtime/national_calibration.py | 152 ++++-------------- packages/microcosm-build/tests/test_gates.py | 84 +++++++++- .../tests/test_uk_national_calibration.py | 132 +++++++++++++++ 7 files changed, 537 insertions(+), 140 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/gates.py b/packages/microcosm-build/src/microcosm/build/gates.py index b6f298d5c..ac22c7e38 100644 --- a/packages/microcosm-build/src/microcosm/build/gates.py +++ b/packages/microcosm-build/src/microcosm/build/gates.py @@ -186,6 +186,7 @@ def ledger_compile_parity_gate( fixture: TargetRegistry | Mapping[str, object], *, signed_differences: Iterable[Mapping[str, object]] = (), + signed_difference_tolerance: float = 1e-9, name: str = "ledger_compile_parity", ) -> GateResult: """Compare a Ledger-compiled target registry against a signed fixture. @@ -196,16 +197,27 @@ def ledger_compile_parity_gate( comparator. """ - actual = _coerce_target_registry(compiled_registry, fallback_country="uk") - expected = _coerce_target_registry(fixture, fallback_country=actual.country) - signed_keys = _signed_difference_keys(signed_differences) + actual = _ledger_compile_value_registry( + _coerce_target_registry(compiled_registry, fallback_country="uk") + ) + expected = _ledger_compile_value_registry( + _coerce_target_registry(fixture, fallback_country=actual.country) + ) + signed_rows = tuple(signed_differences) + signed_keys = _signed_difference_keys(signed_rows) + live_signed_report = ledger_compile_parity_signed_differences(actual, expected) + signed_failures, checked_signed = _signed_difference_check_failures( + signed_rows, + live_signed_report["differences"], + tolerance=signed_difference_tolerance, + ) if signed_keys: actual = _drop_registry_keys(actual, signed_keys) expected = _drop_registry_keys(expected, signed_keys) - actual = _ledger_compile_value_registry(actual) - expected = _ledger_compile_value_registry(expected) report = ledger_target_registry_parity_report(expected, actual) - failures = _calibration_effective_parity_failures(report.failures) + failures = ( + signed_failures + _calibration_effective_parity_failures(report.failures) + ) return GateResult( name=name, passed=not failures, @@ -218,14 +230,8 @@ def ledger_compile_parity_gate( else "target_registry" ), "signed_difference_count": len(signed_keys), - "signed_differences": [ - { - "name": str(row.get("name")), - "period": row.get("period"), - "reason": str(row.get("reason", "")), - } - for row in signed_differences - ], + "signed_difference_tolerance": signed_difference_tolerance, + "signed_differences": checked_signed, }, ) @@ -426,6 +432,112 @@ def _signed_difference_keys( return keys +def _signed_difference_check_failures( + signed_differences: Iterable[Mapping[str, object]], + live_differences: object, + *, + tolerance: float, +) -> tuple[tuple[str, ...], list[dict[str, object]]]: + if tolerance < 0: + raise ValueError("signed_difference_tolerance must be non-negative.") + if not isinstance(live_differences, Iterable) or isinstance( + live_differences, (str, bytes) + ): + raise TypeError("Live Ledger parity differences must be iterable rows.") + live_by_key = { + (str(row["name"]), row.get("period")): row + for row in live_differences + if isinstance(row, Mapping) and "name" in row + } + failures: list[str] = [] + checked: list[dict[str, object]] = [] + for signed in signed_differences: + key = (str(signed["name"]), signed["period"]) + live = live_by_key.get(key) + evidence = { + "name": key[0], + "period": key[1], + "reason": str(signed.get("reason", "")), + "signed_kind": signed.get("kind"), + "signed_ledger_value": signed.get("ledger_value"), + "signed_fixture_value": signed.get("fixture_value"), + "live_kind": live.get("kind") if live is not None else None, + "live_ledger_value": live.get("ledger_value") if live is not None else None, + "live_fixture_value": ( + live.get("fixture_value") if live is not None else None + ), + } + checked.append(evidence) + label = f"{key[0]}[{key[1]}]" + if live is None: + failures.append( + f"signed ledger parity difference {label} is stale: no live " + "difference remains." + ) + continue + signed_kind = signed.get("kind") + live_kind = live.get("kind") + if not signed_kind: + failures.append( + f"signed ledger parity difference {label} is missing kind." + ) + continue + if signed_kind != live_kind: + failures.append( + f"signed ledger parity difference {label} changed kind: " + f"signed={signed_kind!r}, live={live_kind!r}." + ) + continue + for value_field in _signed_difference_required_value_fields(str(signed_kind)): + if value_field not in signed: + failures.append( + "signed ledger parity difference " + f"{label} is missing {value_field}." + ) + continue + if not _signed_difference_value_matches( + signed.get(value_field), + live.get(value_field), + tolerance=tolerance, + ): + failures.append( + "signed ledger parity difference " + f"{label} changed {value_field}: " + f"signed={signed.get(value_field)!r}, " + f"live={live.get(value_field)!r}." + ) + return tuple(failures), checked + + +def _signed_difference_required_value_fields(kind: str) -> tuple[str, ...]: + if kind == "calibration_drift": + return ("ledger_value", "fixture_value") + if kind == "ledger_only": + return ("ledger_value",) + if kind in {"fixture_only", "ledger_absent"}: + return ("fixture_value",) + return ("ledger_value", "fixture_value") + + +def _signed_difference_value_matches( + signed_value: object, + live_value: object, + *, + tolerance: float, +) -> bool: + if signed_value is None or live_value is None: + return signed_value is live_value + try: + return math.isclose( + float(signed_value), + float(live_value), + rel_tol=0.0, + abs_tol=tolerance, + ) + except (TypeError, ValueError): + return signed_value == live_value + + def _drop_registry_keys( registry: TargetRegistry, keys: set[tuple[str, int | str]], diff --git a/packages/microcosm-build/src/microcosm/build/target_materialization.py b/packages/microcosm-build/src/microcosm/build/target_materialization.py index 2a3298f00..e5209134f 100644 --- a/packages/microcosm-build/src/microcosm/build/target_materialization.py +++ b/packages/microcosm-build/src/microcosm/build/target_materialization.py @@ -53,6 +53,10 @@ def materialize_target_bindings( provider_registry = {**default_provider_registry(), **(providers or {})} 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)) if target is None: @@ -111,7 +115,15 @@ def parameter_gated_threshold( mask = _compare(gated, comparison, gate) value_variable = binding.get("value_variable") if value_variable and value_variable != "person_count": - return np.where(mask, _column(adapter, "person", str(value_variable)), 0.0) + return np.where( + mask, + _column( + adapter, + str(binding.get("from_entity") or "person"), + str(value_variable), + ), + 0.0, + ) return mask.astype(float) @@ -133,7 +145,12 @@ def baseline_flag_crosstab( values = _column(adapter, entity, count_of) else: values = np.ones_like(flag, dtype=float) - return np.where(flag, values, 0.0) + mask = flag + for predicate in binding.get("filters", ()): + mask &= _predicate_mask(adapter, entity, predicate) + for predicate in binding.get("household_conditions", ()): + mask &= _predicate_mask(adapter, entity, predicate) + return np.where(mask, values, 0.0) def input_substitution_counterfactual( @@ -153,6 +170,7 @@ def _prepared_column_values( entity: str, binding: Mapping[str, Any], ) -> np.ndarray: + entity = str(binding.get("from_entity") or entity) if "value_expression" in binding: values = _expression(adapter, entity, str(binding["value_expression"])) else: @@ -170,10 +188,16 @@ def _predicate_mask( default_entity: str, predicate: Mapping[str, Any], ) -> np.ndarray: + if "reduce" in predicate and hasattr(adapter, "household_condition"): + return np.asarray(adapter.household_condition(predicate), dtype=bool) entity = str(predicate.get("entity") or default_entity) variable = str(predicate.get("variable") or predicate.get("concept")) values = _column(adapter, entity, variable) - return _compare(values, str(predicate["operator"]), predicate["value"]) + if "operator" in predicate: + operator, expected = str(predicate["operator"]), predicate["value"] + else: + operator, expected = "==", predicate["equals"] + return _compare(values, operator, expected) def _compare(values: np.ndarray, operator: str, expected: object) -> np.ndarray: @@ -181,6 +205,8 @@ def _compare(values: np.ndarray, operator: str, expected: object) -> np.ndarray: return values == expected if operator == "!=": return values != expected + if operator == "in": + return np.isin(values, expected) numeric = values.astype(float) threshold = float(expected) if operator == ">": @@ -209,6 +235,6 @@ def _expression(adapter: Any, entity: str, expression: str) -> np.ndarray: def _column(adapter: Any, entity: str, variable: object) -> np.ndarray: if hasattr(adapter, "column"): - return np.asarray(adapter.column(entity, str(variable)), dtype=float) + return np.asarray(adapter.column(entity, str(variable))) table = adapter.tables[entity] - return np.asarray(table[str(variable)], dtype=float) + return np.asarray(table[str(variable)]) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py index 79072bf57..04c1e4dd7 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py @@ -249,6 +249,7 @@ local_authority_household_targets, ) from microcosm.build.uk_runtime.ledger_targets import ( + UKFrameTargetAdapter, UKLedgerTargetCompilation, UKPolicyEngineAdapter, compile_uk_target_registry, @@ -496,6 +497,7 @@ "UK_CGT_TARGET_SPECS", "UK_DIAGNOSTICS_SCHEMA_VERSION", "UK_FISCAL_TARGET_REGISTRY", + "UKFrameTargetAdapter", "UKLedgerTargetCompilation", "UKPolicyEngineAdapter", "compile_uk_target_registry", 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 eb6a2102d..62c70f9d1 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 @@ -9,6 +9,7 @@ from typing import Any import numpy as np +import pandas as pd from microcosm.build.country_spec import load_country_spec from microcosm.build.ledger_targets import ( @@ -22,6 +23,7 @@ ) from microcosm.build.uk_runtime.cgt_calibration import uk_cgt_annual_exempt_amount from microcosm.calibrate import TargetRegistry +from microcosm.frame import Frame @dataclass(frozen=True) @@ -129,6 +131,111 @@ def parameter(self, parameter: str, period: int | str) -> float: raise KeyError(parameter) +class UKFrameTargetAdapter: + """Frame-backed target materialization adapter for UK calibration stages.""" + + def __init__(self, frame: Frame): + self.frame = frame + self.tables = {entity: frame.table(entity).copy() for entity in frame.entities} + self.link_tables = {name: frame.link(name).copy() for name in frame.links} + + def has_column(self, entity: str, variable: str) -> bool: + return variable in self.tables[entity] + + def column(self, entity: str, variable: str) -> np.ndarray: + table = self.tables[entity] + count_variables = { + "person_count", + "household_count", + "benunit_count", + f"{entity}_count", + } + if variable in count_variables: + return np.ones(len(table), dtype=float) + if variable not in table: + raise KeyError(f"{entity}.{variable}") + return np.asarray(table[variable]) + + def set_column(self, entity: str, variable: str, values: object) -> None: + self.tables[entity][variable] = np.asarray(values) + + def parameter(self, parameter: str, period: int | str) -> float: + if parameter == "gov.hmrc.cgt.annual_exempt_amount": + return uk_cgt_annual_exempt_amount(period) + raise KeyError(parameter) + + def counterfactual_delta( + self, + binding: Mapping[str, Any], + period: int | str, + ) -> np.ndarray: + del period + entity = str(binding.get("from_entity") or "person") + metric_name = str(binding.get("metric_name") or "") + if metric_name and metric_name in self.tables[entity]: + return np.asarray(self.tables[entity][metric_name], dtype=float) + raise ValueError( + "frame does not carry precomputed counterfactual delta " + f"{metric_name!r}" + ) + + def household_condition(self, condition: Mapping[str, Any]) -> np.ndarray: + entity = str(condition.get("entity") or "household") + source = self.tables[entity] + if entity == "household": + household_ids = source["household_id"] + else: + people = self.tables["person"] + entity_membership = f"person_{entity}_id" + if entity_membership not in people: + raise KeyError(entity_membership) + group_to_household = ( + people[[entity_membership, "person_household_id"]] + .drop_duplicates() + .set_index(entity_membership)["person_household_id"] + ) + if group_to_household.index.has_duplicates: + raise ValueError(f"UK {entity} groups span multiple households.") + household_ids = source[f"{entity}_id"].map(group_to_household) + + reduce = str(condition["reduce"]) + variable = str(condition["variable"]) + if reduce == "any": + matched = _compare_series(source[variable], condition) + aggregate = matched.groupby(household_ids).any().astype(float) + expected = {"operator": "==", "value": True} + elif reduce == "sum": + aggregate = source[variable].groupby(household_ids).sum() + expected = condition + elif reduce == "count": + aggregate = source[variable].groupby(household_ids).count() + expected = condition + else: + raise ValueError(f"Unsupported UK household reduction {reduce!r}.") + + households = self.tables["household"] + ids = households["household_id"] + return np.asarray( + _compare_series(ids.map(aggregate).fillna(0.0), expected), + dtype=bool, + ) + + def to_frame(self) -> Frame: + tables = {**self.tables, **self.link_tables} + weights = { + entity: self.frame.weights_for(entity) + for entity in self.frame.weighted_entities + } + return Frame( + tables, + self.frame.schema, + weights, + self.frame.strata, + mass_log=self.frame.mass_log, + metadata=self.frame.metadata, + ) + + def _uk_contract_targets() -> dict[str, Mapping[str, Any]]: payload = ( importlib_resources.files("microcosm.build.uk") @@ -167,3 +274,27 @@ def _uk_input_substitution( from microcosm.build.target_materialization import input_substitution_counterfactual return input_substitution_counterfactual(adapter, binding, period) + + +def _compare_series( + values: pd.Series, + condition: Mapping[str, Any], +) -> pd.Series: + operator = condition.get("operator") + if operator is None: + operator, expected = "==", condition["equals"] + else: + expected = condition["value"] + if operator == "in": + return values.isin(expected) + operations = { + "==": values.eq, + "!=": values.ne, + ">": values.gt, + ">=": values.ge, + "<": values.lt, + "<=": values.le, + } + if operator not in operations: + raise ValueError(f"Unsupported UK target condition operator {operator!r}.") + return operations[operator](expected) 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 e56cd725c..6d24e65ec 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 @@ -2,16 +2,16 @@ from __future__ import annotations -import json from collections.abc import Mapping, Sequence -from importlib import resources from typing import Any -import pandas as pd - from microcosm.build.ledger_targets import compile_ledger_target_references from microcosm.build.plan import Stage from microcosm.build.uk_runtime.content_identity import uk_frame_content_identity +from microcosm.build.uk_runtime.ledger_targets import ( + UKFrameTargetAdapter, + materialize_uk_ledger_targets, +) from microcosm.calibrate import calibrate, effective_sample_size from microcosm.frame import Frame @@ -58,7 +58,25 @@ def __call__(self, frame: Frame) -> Frame: "UK national calibration resolved " f"{resolved} of {declared} activated target references." ) - prepared = _prepare_target_columns(frame, registry.specs) + materialized = materialize_uk_ledger_targets( + UKFrameTargetAdapter(frame), + registry, + period=_registry_materialization_period(registry.specs), + ) + if materialized.skipped: + skipped = [ + { + "name": item.name, + "measure": item.measure, + "reason": item.reason, + } + for item in materialized.skipped + ] + raise RuntimeError( + "UK national calibration could not materialize every " + f"activated reference measure: {skipped}." + ) + prepared = materialized.adapter.to_frame() result = calibrate( prepared, registry.to_target_set(), @@ -155,119 +173,13 @@ def uk_national_calibration_stage( return Stage(name="national_calibration", transform=transform) -def _contract_targets() -> dict[str, Mapping[str, Any]]: - payload = json.loads( - resources.files("microcosm.build.uk") - .joinpath("uk_national_targets.json") - .read_text() - ) - return {row["target_id"]: row for row in payload["targets"]} - - -def _prepare_target_columns(frame: Frame, specs: Sequence[object]) -> Frame: - tables = {entity: frame.table(entity).copy() for entity in frame.entities} - tables.update({name: frame.link(name).copy() for name in frame.links}) - contracts = _contract_targets() - for spec in specs: - target_id = spec.metadata["contract_target_id"] - binding = contracts[target_id]["bindings"]["policyengine"] - entity = spec.entity - table = tables[entity] - if spec.measure in table: - continue - value_name = binding["value_variable"] - if value_name in {"person_count", "household_count", "benunit_count"}: - values = pd.Series(1.0, index=table.index) - else: - if value_name not in table: - raise ValueError( - f"Activated UK target {target_id!r} requires missing " - f"{entity} column {value_name!r}." - ) - values = table[value_name].astype(float) - mask = pd.Series(True, index=table.index) - for condition in binding.get("filters", ()): - variable = condition["variable"] - if variable not in table: - raise ValueError( - f"Activated UK target {target_id!r} requires missing " - f"{entity} filter column {variable!r}." - ) - mask &= _compare(table[variable], condition) - if binding.get("household_conditions"): - if entity != "household": - raise ValueError( - f"Activated UK target {target_id!r} declares household " - f"conditions on entity {entity!r}." - ) - for condition in binding["household_conditions"]: - mask &= _household_condition(tables, condition, table) - table[spec.measure] = values.where(mask, 0.0) - weights = {entity: frame.weights_for(entity) for entity in frame.weighted_entities} - return Frame( - tables, - frame.schema, - weights, - frame.strata, - mass_log=frame.mass_log, - metadata=frame.metadata, - ) - - -def _compare(values: pd.Series, condition: Mapping[str, Any]) -> pd.Series: - operator = condition.get("operator") - if operator is None: - operator, expected = "==", condition["equals"] - else: - expected = condition["value"] - operations = { - "==": values.eq, - ">": values.gt, - ">=": values.ge, - "<": values.lt, - "<=": values.le, - } - if operator not in operations: - raise ValueError(f"Unsupported UK target condition operator {operator!r}.") - return operations[operator](expected) - - -def _household_condition( - tables: Mapping[str, pd.DataFrame], - condition: Mapping[str, Any], - households: pd.DataFrame, -) -> pd.Series: - entity = condition["entity"] - source = tables[entity] - if entity == "household": - household_ids = source["household_id"] - else: - people = tables["person"] - entity_membership = f"person_{entity}_id" - if entity_membership not in people: - raise ValueError(f"UK person table is missing {entity_membership!r}.") - group_to_household = ( - people[[entity_membership, "person_household_id"]] - .drop_duplicates() - .set_index(entity_membership)["person_household_id"] +def _registry_materialization_period(specs: Sequence[object]) -> int | str: + periods = {spec.period for spec in specs} + if not periods: + raise RuntimeError("UK national calibration has no target specs to materialize.") + if len(periods) != 1: + raise RuntimeError( + "UK national calibration cannot materialize mixed-period target " + f"specs: {sorted(str(period) for period in periods)}." ) - if group_to_household.index.has_duplicates: - raise ValueError(f"UK {entity} groups span multiple households.") - household_ids = source[f"{entity}_id"].map(group_to_household) - reduce = condition["reduce"] - if reduce == "any": - matched = _compare(source[condition["variable"]], condition) - aggregate = matched.groupby(household_ids).any().astype(float) - expected_condition = {"operator": "==", "value": True} - elif reduce == "sum": - aggregate = source[condition["variable"]].groupby(household_ids).sum() - expected_condition = condition - elif reduce == "count": - aggregate = source[condition["variable"]].groupby(household_ids).count() - expected_condition = condition - else: - raise ValueError(f"Unsupported UK household reduction {reduce!r}.") - ids = households["household_id"] - return _compare(ids.map(aggregate).fillna(0.0), expected_condition).set_axis( - households.index - ) + return next(iter(periods)) diff --git a/packages/microcosm-build/tests/test_gates.py b/packages/microcosm-build/tests/test_gates.py index 67377a567..dd4e7213b 100644 --- a/packages/microcosm-build/tests/test_gates.py +++ b/packages/microcosm-build/tests/test_gates.py @@ -121,12 +121,15 @@ def test_unsigned_gap_fails(self) -> None: assert not result.passed assert any("target count differs" in failure for failure in result.failures) - def test_signed_difference_is_removed_before_comparison(self) -> None: + def test_signed_difference_exact_reproduction_passes(self) -> None: result = ledger_compile_parity_gate( self._registry(11.0), self._registry(10.0), signed_differences=( { + "fixture_value": 10.0, + "kind": "calibration_drift", + "ledger_value": 11.0, "name": "hmrc.tax", "period": 2025, "reason": "reviewed fixture-vintage drift", @@ -136,6 +139,85 @@ def test_signed_difference_is_removed_before_comparison(self) -> None: assert result.passed assert result.details["signed_difference_count"] == 1 + assert result.details["signed_differences"] == [ + { + "live_fixture_value": 10.0, + "live_kind": "calibration_drift", + "live_ledger_value": 11.0, + "name": "hmrc.tax", + "period": 2025, + "reason": "reviewed fixture-vintage drift", + "signed_fixture_value": 10.0, + "signed_kind": "calibration_drift", + "signed_ledger_value": 11.0, + } + ] + + def test_signed_difference_new_value_at_signed_key_fails(self) -> None: + result = ledger_compile_parity_gate( + self._registry(99.0), + self._registry(10.0), + signed_differences=( + { + "fixture_value": 10.0, + "kind": "calibration_drift", + "ledger_value": 11.0, + "name": "hmrc.tax", + "period": 2025, + "reason": "reviewed fixture-vintage drift", + }, + ), + ) + + assert not result.passed + assert result.failures == ( + "signed ledger parity difference hmrc.tax[2025] changed " + "ledger_value: signed=11.0, live=99.0.", + ) + + def test_signed_difference_fixture_value_at_signed_key_fails(self) -> None: + result = ledger_compile_parity_gate( + self._registry(11.0), + self._registry(12.0), + signed_differences=( + { + "fixture_value": 10.0, + "kind": "calibration_drift", + "ledger_value": 11.0, + "name": "hmrc.tax", + "period": 2025, + "reason": "reviewed fixture-vintage drift", + }, + ), + ) + + assert not result.passed + assert result.failures == ( + "signed ledger parity difference hmrc.tax[2025] changed " + "fixture_value: signed=10.0, live=12.0.", + ) + + def test_signed_difference_stale_signature_fails(self) -> None: + result = ledger_compile_parity_gate( + self._registry(10.0), + self._registry(10.0), + signed_differences=( + { + "fixture_value": 10.0, + "kind": "calibration_drift", + "ledger_value": 11.0, + "name": "hmrc.tax", + "period": 2025, + "reason": "reviewed fixture-vintage drift", + }, + ), + ) + + assert not result.passed + assert result.failures == ( + "signed ledger parity difference hmrc.tax[2025] is stale: no live " + "difference remains.", + ) def test_signed_difference_classifier_ignores_equal_value_namespace_drift( self, diff --git a/packages/microcosm-build/tests/test_uk_national_calibration.py b/packages/microcosm-build/tests/test_uk_national_calibration.py index ae0ae1695..12a9cddde 100644 --- a/packages/microcosm-build/tests/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/test_uk_national_calibration.py @@ -107,6 +107,81 @@ def _nested_frame() -> Frame: ) +def _reference_by_name(name: str) -> LedgerTargetReference: + from microcosm.build.country_spec import load_country_spec + + return next( + reference + for reference in load_country_spec("uk").target_references + if reference.name == name + ) + + +def _fact_for_reference( + reference: LedgerTargetReference, + value: float, +) -> dict: + selector = dict(reference.ledger_selector) + dimensions = dict(selector.get("dimension_values", {})) + return { + "aggregate_fact_key": f"ledger.aggregate_fact.v2:{reference.name}", + "aggregation": {"method": "sum"}, + "assertion": "observation", + "dimensions": dimensions, + "geography": { + "level": selector.get("geography_level", "country"), + "id": selector.get("geography_id", "K02000001"), + }, + "observed_measure": { + "source_name": selector["source_name"], + "source_concept": selector["source_concept"], + "source_measure_id": "value", + "unit": "gbp", + }, + "period": {"type": "month", "value": f"{reference.period}-12"}, + "value": value, + } + + +def _materialization_binding_frame( + *, + include_counterfactual_delta: bool = True, +) -> Frame: + household = pd.DataFrame( + { + "household_id": np.arange(3, dtype="int64"), + "esa_income": [10.0, 20.0, 0.0], + "esa_contrib": [1.0, 2.0, 0.0], + "uc_is_child_limit_affected": [1.0, 0.0, 1.0], + "children_count": [2.0, 1.0, 3.0], + } + ) + salary_sacrifice_metric = "hmrc/salary_sacrifice_it_relief_basic_rate" + person_columns = { + "person_id": np.arange(4, dtype="int64"), + "person_benunit_id": [0, 0, 1, 2], + "person_household_id": [0, 0, 1, 2], + "capital_gains": [0.0, 7_000.0, 12_000.0, 500.0], + } + if include_counterfactual_delta: + person_columns[salary_sacrifice_metric] = [1.0, 2.0, 0.0, 0.0] + return Frame( + { + "person": pd.DataFrame(person_columns), + "benunit": pd.DataFrame( + { + "benunit_id": np.arange(3, dtype="int64"), + "universal_credit": [1.0, 0.0, 1.0], + } + ), + "household": household, + }, + EntitySchema(group_entities=("benunit", "household")), + {"household": Weights(np.full(3, 10.0), WeightKind.DESIGN)}, + metadata={"time_period": "2025"}, + ) + + def test_uc_calibration_compiles_and_moves_weighted_count_towards_fact() -> None: frame = _frame() stage = UKNationalCalibrationStage( @@ -192,6 +267,63 @@ def test_chronicle_184_uc_and_obr_references_compile_fail_closed() -> None: assert {spec.name for spec in registry.specs} == {"obr.universal_credit_in_cap"} +def test_packaged_binding_classes_materialize_through_national_stage() -> None: + selected_names = ( + "dwp.uc.households", + "obr.esa", + "hmrc.cgt.taxpayers_total", + "dwp.uc.two_child_limit.children_affected", + "hmrc.salary_sacrifice.it_relief_basic_rate", + ) + references = tuple(_reference_by_name(name) for name in selected_names) + facts = [ + _fact_for_reference(reference, value) + for reference, value in zip( + references, + (20.0, 33.0, 2.0, 5.0, 3.0), + strict=True, + ) + ] + stage = UKNationalCalibrationStage( + facts, + references=references, + epochs=1, + learning_rate=0.01, + ) + + result = stage(_materialization_binding_frame()) + + assert stage.manifest["activated_reference_count"] == len(selected_names) + assert stage.manifest["resolved_reference_count"] == len(selected_names) + assert stage.manifest["matrix_target_count"] == len(selected_names) + materialized = { + ("benunit", "dwp/uc/households"): [1.0, 0.0, 1.0], + ("household", "obr/esa"): [11.0, 22.0, 0.0], + ("person", "hmrc/cgt_taxpayers"): [0.0, 1.0, 1.0, 0.0], + ("household", "dwp/uc/two_child_limit/children_affected"): [2.0, 0.0, 3.0], + ("person", "hmrc/salary_sacrifice_it_relief_basic_rate"): [ + 1.0, + 2.0, + 0.0, + 0.0, + ], + } + for (entity, measure), expected in materialized.items(): + assert result.table(entity)[measure].tolist() == expected + + +def test_packaged_materialization_skip_aborts_national_stage() -> None: + reference = _reference_by_name("hmrc.salary_sacrifice.it_relief_basic_rate") + stage = UKNationalCalibrationStage( + [_fact_for_reference(reference, 3.0)], + references=[reference], + epochs=1, + ) + + with pytest.raises(RuntimeError, match="could not materialize every"): + stage(_materialization_binding_frame(include_counterfactual_delta=False)) + + def test_calibration_preserves_entity_ids_and_national_integrity() -> None: frame = _frame() stage = UKNationalCalibrationStage( From 442c38b39a078a8f0303724cc019214451f252db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 21 Aug 2026 21:26:55 +0200 Subject: [PATCH 7/7] Review response (vahid): multi-fact provenance, unsorted-frame collapse, assertion compat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multi-fact compiles now stamp their single-fact metadata from the value-representative member (the latest member for latest_plateau and as representative for the aggregates), carry the ordered member keys as ledger_member_aggregate_fact_keys, and name the operation — receipts point at facts that produced the value. The calibrate matrix collapse drops its sorted-id assumption for an argsort-backed lookup with an unsorted-frame regression. Selector 'assertion' is supported again with absent-counts-as- observation semantics (the UK contract still bans it; external references keep compiling). The signed-differences double-consumption finding was already fixed by the run-9 materialization — a generator-input regression now pins it. Co-Authored-By: Claude Fable 5 --- .../src/microcosm/build/ledger_targets.py | 33 ++++-- .../build/uk/target_reference_membership.json | 104 +++++++++--------- .../microcosm/build/uk/target_references.json | 2 +- packages/microcosm-build/tests/test_gates.py | 34 ++++++ .../tests/test_ledger_targets.py | 64 +++++++++-- .../src/microcosm/calibrate/matrix.py | 25 +++-- .../microcosm-calibrate/tests/test_matrix.py | 60 +++++++++- 7 files changed, 243 insertions(+), 79 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/ledger_targets.py index 5a6d3e472..07c5a631c 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_targets.py @@ -522,7 +522,6 @@ def target_spec_from_ledger_reference( "require an aggregating value_operation, got " f"{reference.value_operation!r}." ) - fact = facts[0] numeric_values = [] for member in facts: numeric_values.append(_numeric_fact_value(member, reference)) @@ -536,6 +535,10 @@ def target_spec_from_ledger_reference( numeric_value = sum(numeric_values) else: numeric_value = numeric_values[0] + representative_fact = _value_representative_fact( + facts, + operation=reference.value_operation, + ) if not reference.measure: raise ValueError( @@ -546,7 +549,7 @@ def target_spec_from_ledger_reference( period = ( reference.period if reference.period is not None - else _at(fact, "period", "value") + else _at(representative_fact, "period", "value") ) if period is None: raise ValueError(f"Ledger fact for {reference.name!r} is missing period.") @@ -559,20 +562,33 @@ def target_spec_from_ledger_reference( filter=reference.filter, period=period, se=reference.se, - source=_source_citation(fact), + source=_source_citation(representative_fact), family=reference.family, signed=reference.signed, tolerance=reference.tolerance, notes=reference.notes, metadata={ - **_ledger_metadata(fact, fact_key=_fact_key(fact)), + **_ledger_metadata( + representative_fact, + fact_key=_fact_key(representative_fact), + ), **_multi_fact_reference_metadata(facts), - "ledger_resolved_assertion": _fact_assertion(fact), + "ledger_resolved_assertion": _fact_assertion(representative_fact), **_reference_metadata(reference), }, ) +def _value_representative_fact( + facts: tuple[object, ...], + *, + operation: str, +) -> object: + if len(facts) == 1 or operation not in MULTI_FACT_VALUE_OPERATIONS: + return facts[0] + return max(enumerate(facts), key=lambda item: (_period_key(item[1]), item[0]))[1] + + def _numeric_fact_value(fact: object, reference: LedgerTargetReference) -> float: value = _at(fact, "value") if value is None: @@ -614,12 +630,11 @@ def _validate_fact_aggregation( def _multi_fact_reference_metadata(facts: tuple[object, ...]) -> dict[str, str]: if len(facts) == 1: return {} - member_keys = tuple( - sorted(_fact_key(fact) or _source_record_id(fact) for fact in facts) - ) + member_keys = tuple(_fact_key(fact) or _source_record_id(fact) for fact in facts) payload = json.dumps(member_keys, separators=(",", ":")) return { "ledger_member_fact_count": str(len(facts)), + "ledger_member_aggregate_fact_keys": payload, "ledger_member_fact_keys": payload, "ledger_member_fact_digest": hashlib.sha256( payload.encode("utf-8") @@ -1418,6 +1433,8 @@ def _selector_candidates(fact: object, key: str) -> tuple[str, ...]: return (_str_at(fact, "layout", "measure_id"),) if key == "domain": return (_domain(fact),) + if key == "assertion": + return (_fact_assertion(fact),) raise ValueError(f"Unsupported Ledger fact selector field {key!r}.") 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 523bbec8a..6ef0d46ff 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 @@ -2574,7 +2574,7 @@ }, { "name": "dwp.uc.households", - "from": "2025-04", + "from": "2025-12", "to": "2025" } ], @@ -6169,7 +6169,7 @@ "resolved_period": 2025, "resolved_value": 7553013.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0e19ecf4b9c7d7a9900bffdf" + "resolved_fact_key": "ledger_aggregate_fact_v2_b94a17afcae0f28216f5c756" } ] }, @@ -6184,7 +6184,7 @@ "resolved_period": 2025, "resolved_value": 8331437.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_056705672c64e72f531c221b" + "resolved_fact_key": "ledger_aggregate_fact_v2_ec5be4478e3e8a5ed9186e22" } ] }, @@ -6199,7 +6199,7 @@ "resolved_period": 2025, "resolved_value": 8715225.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_042a0452abe737cbcc2d7826" + "resolved_fact_key": "ledger_aggregate_fact_v2_ed0cabd54beb345a04d236b1" } ] }, @@ -6214,7 +6214,7 @@ "resolved_period": 2025, "resolved_value": 9572397.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_2734cfcd60cab009d837006f" + "resolved_fact_key": "ledger_aggregate_fact_v2_f3cd6e4fd7249a0ef2be0ffb" } ] }, @@ -6229,7 +6229,7 @@ "resolved_period": 2025, "resolved_value": 8622506.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1940860d399a82f4953535b7" + "resolved_fact_key": "ledger_aggregate_fact_v2_f618aa084dbd211cdca7c544" } ] }, @@ -6244,7 +6244,7 @@ "resolved_period": 2025, "resolved_value": 9036816.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_13df792a886048bb2e017b3e" + "resolved_fact_key": "ledger_aggregate_fact_v2_f8fb3f14e335149ae47e882a" } ] }, @@ -6259,7 +6259,7 @@ "resolved_period": 2025, "resolved_value": 7861034.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1b10577c910ab5947a3a3bd6" + "resolved_fact_key": "ledger_aggregate_fact_v2_fc9476cc3d2ecd4fb1fd9403" } ] }, @@ -6274,7 +6274,7 @@ "resolved_period": 2025, "resolved_value": 5998605.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_00e6f6b5b503ef40b6cbf115" + "resolved_fact_key": "ledger_aggregate_fact_v2_ffd4d3a0d7b8b5e4667d53d8" } ] }, @@ -6289,7 +6289,7 @@ "resolved_period": 2025, "resolved_value": 2965168.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_276abb5d5c7c00362cf78f33" + "resolved_fact_key": "ledger_aggregate_fact_v2_f2dffa4221fe14e9138365b0" } ] }, @@ -6304,7 +6304,7 @@ "resolved_period": 2025, "resolved_value": 1744355.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_14a33ace3e56eb04af5d87e2" + "resolved_fact_key": "ledger_aggregate_fact_v2_fb55d5f20f74ee39a1e8fcb4" } ] }, @@ -6319,7 +6319,7 @@ "resolved_period": 2025, "resolved_value": 2052052.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_69562b00dd7ef3ef3809099d" + "resolved_fact_key": "ledger_aggregate_fact_v2_f9a457edc9491e5810c39f5f" } ] }, @@ -6334,7 +6334,7 @@ "resolved_period": 2025, "resolved_value": 2002835.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_39672ee0d1ba0e02ee364c96" + "resolved_fact_key": "ledger_aggregate_fact_v2_f0e2139b52c615925c9075dd" } ] }, @@ -6349,7 +6349,7 @@ "resolved_period": 2025, "resolved_value": 2034609.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0d03f42e5a79ed4d112f75ec" + "resolved_fact_key": "ledger_aggregate_fact_v2_b4e36c0dc0a924667be47bbc" } ] }, @@ -6364,7 +6364,7 @@ "resolved_period": 2025, "resolved_value": 2291610.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_338ba5d59faea729e03e51b2" + "resolved_fact_key": "ledger_aggregate_fact_v2_d9d6a711d0cbc4919a8643c0" } ] }, @@ -6379,7 +6379,7 @@ "resolved_period": 2025, "resolved_value": 2463301.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_336866742a8407c730f81183" + "resolved_fact_key": "ledger_aggregate_fact_v2_f5b1d6c400b912b05c79c477" } ] }, @@ -6394,7 +6394,7 @@ "resolved_period": 2025, "resolved_value": 2472291.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_4f49ba3ae81ec559c7398ffc" + "resolved_fact_key": "ledger_aggregate_fact_v2_f927cc9b3eab0494caf1479f" } ] }, @@ -6409,7 +6409,7 @@ "resolved_period": 2025, "resolved_value": 2333109.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_7859c22fe4165e9485429122" + "resolved_fact_key": "ledger_aggregate_fact_v2_d9cdf746ffe5df2fd3d85279" } ] }, @@ -6424,7 +6424,7 @@ "resolved_period": 2025, "resolved_value": 2088285.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1c2c4f630fa703234d347657" + "resolved_fact_key": "ledger_aggregate_fact_v2_b679e4770750b86af6b1756b" } ] }, @@ -6439,7 +6439,7 @@ "resolved_period": 2025, "resolved_value": 2255231.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_46413aa8f6dcd7af317652d0" + "resolved_fact_key": "ledger_aggregate_fact_v2_65b8a4cc92c4565b00007877" } ] }, @@ -6454,7 +6454,7 @@ "resolved_period": 2025, "resolved_value": 2360202.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_461f5d83eddd94c18f5012bd" + "resolved_fact_key": "ledger_aggregate_fact_v2_ba87a7d66cb9f8694b952159" } ] }, @@ -6469,7 +6469,7 @@ "resolved_period": 2025, "resolved_value": 1941658.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1d7696486b18cf31492cf093" + "resolved_fact_key": "ledger_aggregate_fact_v2_bca9c38347810a944bbd08b3" } ] }, @@ -6484,7 +6484,7 @@ "resolved_period": 2025, "resolved_value": 2193915.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_2363408a28ac0f04f37a7abb" + "resolved_fact_key": "ledger_aggregate_fact_v2_f3b1f78e4b752640465521f0" } ] }, @@ -6499,7 +6499,7 @@ "resolved_period": 2025, "resolved_value": 1838574.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_5639c42596c626737c3d636b" + "resolved_fact_key": "ledger_aggregate_fact_v2_dbeb583b16bcb530ee1296e1" } ] }, @@ -6514,7 +6514,7 @@ "resolved_period": 2025, "resolved_value": 1622996.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0b9535bcf00bdc5d3799040b" + "resolved_fact_key": "ledger_aggregate_fact_v2_b962c8b6d3d68808831aad6a" } ] }, @@ -6529,7 +6529,7 @@ "resolved_period": 2025, "resolved_value": 1551183.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_21695e80cb8e5cc51ca40d00" + "resolved_fact_key": "ledger_aggregate_fact_v2_aa0a8a7ab2d3894db7a7d7aa" } ] }, @@ -6544,7 +6544,7 @@ "resolved_period": 2025, "resolved_value": 1024480.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_29dc57985627ae76af0982b8" + "resolved_fact_key": "ledger_aggregate_fact_v2_fcdc2e2f119de0b65769ef90" } ] }, @@ -6559,7 +6559,7 @@ "resolved_period": 2025, "resolved_value": 665267.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_062c21fd48c78155323c1909" + "resolved_fact_key": "ledger_aggregate_fact_v2_c76df00751abbf64b5ab056b" } ] }, @@ -6589,7 +6589,7 @@ "resolved_period": 2025, "resolved_value": 1829801.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_09e0a2d15c8f38d824915eb8" + "resolved_fact_key": "ledger_aggregate_fact_v2_ccdfe5dde7b46840510e21d2" } ] }, @@ -6604,7 +6604,7 @@ "resolved_period": 2025, "resolved_value": 2152800.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_224df58ddebb1d0487ed7392" + "resolved_fact_key": "ledger_aggregate_fact_v2_86d603b352e77fd0c03ddaa8" } ] }, @@ -6619,7 +6619,7 @@ "resolved_period": 2025, "resolved_value": 2123750.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1b9d5e734a49a6e40c2372f5" + "resolved_fact_key": "ledger_aggregate_fact_v2_ecf390d4b25b71d12aae6bc7" } ] }, @@ -6634,7 +6634,7 @@ "resolved_period": 2025, "resolved_value": 2131646.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_57f4c483dce77b29592b4a5a" + "resolved_fact_key": "ledger_aggregate_fact_v2_edb961b3528b22769eece352" } ] }, @@ -6649,7 +6649,7 @@ "resolved_period": 2025, "resolved_value": 2257360.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_25a1eab35b7fc183d3840893" + "resolved_fact_key": "ledger_aggregate_fact_v2_fd52338de8e1557cdd024c36" } ] }, @@ -6664,7 +6664,7 @@ "resolved_period": 2025, "resolved_value": 2333326.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_49f185aef55e9fe5d593a3ec" + "resolved_fact_key": "ledger_aggregate_fact_v2_b81f56fab808ad1d38d70f3d" } ] }, @@ -6679,7 +6679,7 @@ "resolved_period": 2025, "resolved_value": 2303479.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_75f8a8ec8fee89fe6fc9c442" + "resolved_fact_key": "ledger_aggregate_fact_v2_be9bedc792e0d419ebaf5316" } ] }, @@ -6694,7 +6694,7 @@ "resolved_period": 2025, "resolved_value": 2196013.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_260f74dc33a844072323920a" + "resolved_fact_key": "ledger_aggregate_fact_v2_d41ff91bfe885debcc12d759" } ] }, @@ -6709,7 +6709,7 @@ "resolved_period": 2025, "resolved_value": 2005099.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1b027f41f03030f8efe0d79b" + "resolved_fact_key": "ledger_aggregate_fact_v2_fafcbae6e55f9ae20bc0050d" } ] }, @@ -6724,7 +6724,7 @@ "resolved_period": 2025, "resolved_value": 2164862.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_40adbc7adb975592e807d0ae" + "resolved_fact_key": "ledger_aggregate_fact_v2_b8fe92cfb43b9a95f8a9f7ef" } ] }, @@ -6739,7 +6739,7 @@ "resolved_period": 2025, "resolved_value": 2256521.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0e114e47a57d10fc54609670" + "resolved_fact_key": "ledger_aggregate_fact_v2_86b57e4ed1e5186f23dc4021" } ] }, @@ -6754,7 +6754,7 @@ "resolved_period": 2025, "resolved_value": 2037199.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_404750682cef86219e756295" + "resolved_fact_key": "ledger_aggregate_fact_v2_e272f955c58535b8b9304759" } ] }, @@ -6769,7 +6769,7 @@ "resolved_period": 2025, "resolved_value": 2094462.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_1f9b2912ecff29a76b1c72b8" + "resolved_fact_key": "ledger_aggregate_fact_v2_e60d33e33dcbc1ba2292edf5" } ] }, @@ -6784,7 +6784,7 @@ "resolved_period": 2025, "resolved_value": 1734083.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_25d519d64483ae31cf018715" + "resolved_fact_key": "ledger_aggregate_fact_v2_a4878efd0023575bded6b67a" } ] }, @@ -6799,7 +6799,7 @@ "resolved_period": 2025, "resolved_value": 1473758.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0d81360984ebade7169a9ae0" + "resolved_fact_key": "ledger_aggregate_fact_v2_d34aca91f9d1621ea96e72bc" } ] }, @@ -6814,7 +6814,7 @@ "resolved_period": 2025, "resolved_value": 1350668.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_14458a77bb7a0723408b86f2" + "resolved_fact_key": "ledger_aggregate_fact_v2_f74158203e735d37a67c5409" } ] }, @@ -6829,7 +6829,7 @@ "resolved_period": 2025, "resolved_value": 815910.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_042ccd2b5c0becef2c35911d" + "resolved_fact_key": "ledger_aggregate_fact_v2_60aa57af44ada9286df3d649" } ] }, @@ -6844,7 +6844,7 @@ "resolved_period": 2025, "resolved_value": 459511.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_092abe3c418343972da4d863" + "resolved_fact_key": "ledger_aggregate_fact_v2_bbfd4e781a7d1151855e4edb" } ] }, @@ -6874,7 +6874,7 @@ "resolved_period": 2025, "resolved_value": 896833.0, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_001f7a945bd3844e6fcc5b0e" + "resolved_fact_key": "ledger_aggregate_fact_v2_f9862176e9cdec891820dfa2" } ] }, @@ -7438,7 +7438,7 @@ "resolved_period": 2025, "resolved_value": 2778253361.64, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_5c8d18b2366a234482594297" + "resolved_fact_key": "ledger_aggregate_fact_v2_882329821c90dc683aa778d8" } ] }, @@ -7453,7 +7453,7 @@ "resolved_period": 2025, "resolved_value": 346409713.95000005, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0d0ef6ca9882046f4b79b739" + "resolved_fact_key": "ledger_aggregate_fact_v2_ac1b07c69f1e1baa2a0fb787" } ] }, @@ -7468,7 +7468,7 @@ "resolved_period": 2025, "resolved_value": 40869580.81, "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_0a43ec6d32083e092bcee693" + "resolved_fact_key": "ledger_aggregate_fact_v2_496af6b8fe31c71c43f1d292" } ] }, @@ -7602,8 +7602,8 @@ "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, "resolved_value": 6758888.888888889, - "resolved_fact_period": "2025-04", - "resolved_fact_key": "ledger_aggregate_fact_v2_2aa7149107cd8906fe8fed57" + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f1f95c868e686f543d161ff0" } ] } 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 00e11c462..055e61fea 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -9374,7 +9374,7 @@ "measure_kind": "prepared_column" }, "value_operation": "calendar_year_average", - "uprating_from_period": "2025-04", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 } ] diff --git a/packages/microcosm-build/tests/test_gates.py b/packages/microcosm-build/tests/test_gates.py index dd4e7213b..752493490 100644 --- a/packages/microcosm-build/tests/test_gates.py +++ b/packages/microcosm-build/tests/test_gates.py @@ -153,6 +153,40 @@ def test_signed_difference_exact_reproduction_passes(self) -> None: } ] + def test_signed_difference_generator_matches_list_behavior(self) -> None: + signed_rows = [ + { + "fixture_value": 10.0, + "kind": "calibration_drift", + "ledger_value": 11.0, + "name": "hmrc.tax", + "period": 2025, + "reason": "reviewed fixture-vintage drift", + } + ] + + list_result = ledger_compile_parity_gate( + self._registry(11.0), + self._registry(10.0), + signed_differences=signed_rows, + ) + generator_result = ledger_compile_parity_gate( + self._registry(11.0), + self._registry(10.0), + signed_differences=(row for row in signed_rows), + ) + + assert generator_result.passed == list_result.passed + assert generator_result.failures == list_result.failures + assert ( + generator_result.details["signed_difference_count"] + == (list_result.details["signed_difference_count"]) + ) + assert ( + generator_result.details["signed_differences"] + == (list_result.details["signed_differences"]) + ) + def test_signed_difference_new_value_at_signed_key_fails(self) -> None: result = ledger_compile_parity_gate( self._registry(99.0), diff --git a/packages/microcosm-build/tests/test_ledger_targets.py b/packages/microcosm-build/tests/test_ledger_targets.py index 61e84cf00..a9861980c 100644 --- a/packages/microcosm-build/tests/test_ledger_targets.py +++ b/packages/microcosm-build/tests/test_ledger_targets.py @@ -1226,6 +1226,12 @@ def test__given_sum_reference_matches_same_vintage_facts__then_values_sum() -> N spec = registry.specs[0] assert spec.value == 350.0 assert spec.metadata["ledger_member_fact_count"] == "2" + assert json.loads(spec.metadata["ledger_member_fact_keys"]) == [ + "ledger.aggregate_fact.v2:first", + "ledger.aggregate_fact.v2:second", + ] + assert spec.metadata["ledger_fact_key"] == "ledger.aggregate_fact.v2:second" + assert spec.metadata["ledger_fact_period"] == "2023" assert spec.metadata["ledger_value_operation"] == "sum" @@ -1313,6 +1319,13 @@ def test__given_calendar_year_average_reference__then_monthly_mean_compiles() -> (6_380_000.0 + 4 * 6_600_000.0 + 3 * 6_960_000.0 + 7_170_000.0) / 9 ) assert spec.metadata["ledger_member_fact_count"] == "9" + assert json.loads(spec.metadata["ledger_member_fact_keys"])[-1] == ( + "ledger.aggregate_fact.v2:medicaid-2025_12" + ) + assert spec.metadata["ledger_fact_key"] == ( + "ledger.aggregate_fact.v2:medicaid-2025_12" + ) + assert spec.metadata["ledger_fact_period"] == "2025-12" assert spec.metadata["ledger_value_operation"] == "calendar_year_average" @@ -1352,6 +1365,15 @@ def test__given_latest_plateau_reference__then_latest_equal_month_run_wins() -> spec = registry.specs[0] assert spec.value == 7_170_000.0 assert spec.metadata["ledger_member_fact_count"] == "3" + assert json.loads(spec.metadata["ledger_member_fact_keys"]) == [ + "ledger.aggregate_fact.v2:medicaid-2025_12", + "ledger.aggregate_fact.v2:medicaid-2026_01", + "ledger.aggregate_fact.v2:medicaid-2026_02", + ] + assert spec.metadata["ledger_fact_key"] == ( + "ledger.aggregate_fact.v2:medicaid-2026_02" + ) + assert spec.metadata["ledger_fact_period"] == "2026-02" assert spec.metadata["ledger_value_operation"] == "latest_plateau" @@ -1972,7 +1994,7 @@ def test_ledger_metadata_records_assertion_and_fact_period(): assert projection.metadata["ledger_assertion"] == "source_projection" -def test_ledger_reference_selector_rejects_assertion_selector_key(): +def test_ledger_reference_selector_matches_assertion_key(): reference = LedgerTargetReference( name="cbo_projected_agi", ledger_selector={ @@ -1982,14 +2004,42 @@ def test_ledger_reference_selector_rejects_assertion_selector_key(): entity="household", measure="adjusted_gross_income", family="cbo", + assertion_policy="allow_source_projection", ) - with pytest.raises(ValueError, match="Unsupported Ledger fact selector field"): - compile_ledger_target_references( - [_consumer_fact_row(assertion="source_projection")], - [reference], - country="us", - ) + registry = compile_ledger_target_references( + [_consumer_fact_row(assertion="source_projection")], + [reference], + country="us", + ) + + (spec,) = registry.specs + assert spec.metadata["ledger_resolved_assertion"] == "source_projection" + + +def test_ledger_reference_selector_treats_absent_assertion_as_observation(): + reference = LedgerTargetReference( + name="observed_agi", + ledger_selector={ + "source_measure_id": "adjusted_gross_income", + "assertion": "observation", + }, + entity="household", + measure="adjusted_gross_income", + family="irs_soi", + period=2024, + ) + + registry = compile_ledger_target_references( + [_consumer_fact_row(value=15_000_000_000_000)], + [reference], + country="us", + ) + + (spec,) = registry.specs + assert spec.value == 15_000_000_000_000 + assert "ledger_assertion" not in spec.metadata + assert spec.metadata["ledger_resolved_assertion"] == "observation" def test_ledger_reference_projection_fact_excluded_by_default(): diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py b/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py index 9b972f704..c67c71093 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/matrix.py @@ -177,7 +177,10 @@ def _nested_positions( f"weight entity {weight_entity!r}." ) return frame._group_positions(weight_entity) - if entity not in schema.group_entities or weight_entity not in schema.group_entities: + if ( + entity not in schema.group_entities + or weight_entity not in schema.group_entities + ): raise ValueError( f"Cannot collapse target entity {entity!r} to weight entity " f"{weight_entity!r}; schema declares person entity " @@ -207,26 +210,32 @@ def _nested_positions( ) source_ids = frame.table(entity)[schema.id_column(entity)].to_numpy() - missing = [source_id for source_id in source_ids if source_id not in source_to_weight] + missing = [ + source_id for source_id in source_ids if source_id not in source_to_weight + ] if missing: raise ValueError( f"Cannot collapse target entity {entity!r} to weight entity " f"{weight_entity!r}: {entity} id(s) have no person membership, " f"including {missing[:5]}." ) - destination_ids = np.asarray([source_to_weight[source_id] for source_id in source_ids]) + destination_ids = np.asarray( + [source_to_weight[source_id] for source_id in source_ids] + ) weight_ids = frame.table(weight_entity)[schema.id_column(weight_entity)].to_numpy() - positions = np.searchsorted(weight_ids, destination_ids) - valid = positions < len(weight_ids) - valid[valid] = weight_ids[positions[valid]] == destination_ids[valid] - if not bool(valid.all()): # pragma: no cover - frame validation guards this + order = np.argsort(weight_ids) + sorted_weight_ids = weight_ids[order] + sorted_positions = np.searchsorted(sorted_weight_ids, destination_ids) + valid = sorted_positions < len(sorted_weight_ids) + valid[valid] = sorted_weight_ids[sorted_positions[valid]] == destination_ids[valid] + if not bool(valid.all()): bad = destination_ids[~valid][:5].tolist() raise ValueError( f"Cannot collapse target entity {entity!r} to weight entity " f"{weight_entity!r}: mapped {weight_entity} id(s) are absent from " f"the weight table, including {bad}." ) - return positions + return order[sorted_positions] def build_constraint_matrix( diff --git a/packages/microcosm-calibrate/tests/test_matrix.py b/packages/microcosm-calibrate/tests/test_matrix.py index 11a91f5f3..ef7ce4af3 100644 --- a/packages/microcosm-calibrate/tests/test_matrix.py +++ b/packages/microcosm-calibrate/tests/test_matrix.py @@ -210,9 +210,7 @@ def test_group_sum_target_collapses_onto_weighted_parent_group() -> None: "uc_receipt": [1.0, 0.0, 1.0, 1.0], } ), - "household": pd.DataFrame( - {"household_id": np.arange(3, dtype="int64")} - ), + "household": pd.DataFrame({"household_id": np.arange(3, dtype="int64")}), }, EntitySchema(group_entities=("benunit", "household")), {"household": Weights(weights, WeightKind.DESIGN)}, @@ -236,6 +234,62 @@ def test_group_sum_target_collapses_onto_weighted_parent_group() -> None: np.testing.assert_allclose(problem.estimates(weights), [60.0]) +def test_group_sum_target_collapses_with_unsorted_weight_entity_ids() -> None: + """Collapse uses id lookup, not sorted-position assumptions.""" + + weights = np.array([11.0, 3.0, 13.0]) + frame = Frame( + { + "person": pd.DataFrame( + { + "person_id": np.arange(3, dtype="int64"), + "person_benunit_id": [100, 101, 102], + "person_household_id": [10, 20, 30], + } + ), + "benunit": pd.DataFrame( + { + "benunit_id": [100, 101, 102], + "uc_receipt": [2.0, 5.0, 7.0], + } + ), + "household": pd.DataFrame({"household_id": [10, 20, 30]}), + }, + EntitySchema(group_entities=("benunit", "household")), + {"household": Weights(weights, WeightKind.DESIGN)}, + ) + frame.table("household").sort_values( + "household_id", + ascending=False, + inplace=True, + ignore_index=True, + ) + frame._weights["household"] = Weights( + np.array([13.0, 3.0, 11.0]), + WeightKind.DESIGN, + ) + targets = TargetSet( + ( + Target( + name="uc_benunits", + entity="benunit", + value=128.0, + measure="uc_receipt", + period=2025, + ), + ) + ) + + problem = build_constraint_matrix(frame, targets, "household") + + assert problem.skipped == () + np.testing.assert_allclose(problem.matrix.toarray()[0], [7.0, 5.0, 2.0]) + np.testing.assert_allclose( + problem.estimates(frame.resolve_weights("household").values), + [128.0], + ) + + def test_uncompilable_target_is_skipped_and_reported(feasible_frame) -> None: frame, truths = feasible_frame(n=100) targets = TargetSet(