From 1eeb3bf8bc62be867917f7738c1a1e85d3b111a4 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 10:46:15 -0400 Subject: [PATCH 01/33] Start the chronicle dual-acceptance journal chronicle#143 consumer side: microcosm must accept both ledger-era and chronicle-era Chronicle schema ids and hash domains before Chronicle flips emit. Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept.md | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 PROGRESS-chronicle-dual-accept.md diff --git a/PROGRESS-chronicle-dual-accept.md b/PROGRESS-chronicle-dual-accept.md new file mode 100644 index 000000000..47cd999f8 --- /dev/null +++ b/PROGRESS-chronicle-dual-accept.md @@ -0,0 +1,38 @@ +# Chronicle dual-acceptance (consumer side) — chronicle#143 + +Branch `chronicle-dual-accept`. Journal for this lane. Root journals are +history, not state (see CLAUDE.md); this one is current only while the branch +is open. + +## Goal + +Microcosm must accept BOTH ledger-era and chronicle-era Chronicle identities +*before* Chronicle flips emit: + +- schema ids: `policyengine_ledger.consumer_artifact.v1` **and** + `policyengine_chronicle.consumer_artifact.v2`; `ledger.consumer_fact.v1` + **and** `chronicle.consumer_fact.v2` +- hash domains: `ledger..v2` **and** `chronicle..v3` (same canonical + payload, new domain string) +- env names: `CHRONICLE_*` preferred, legacy honored with a once-per-process + deprecation warning + +Frozen (microcosm#639): nothing on disk or in artifacts renames. Diagnostic +field names (`ledger_aggregate_fact_key`), H5 attrs, `populace_*` ids, fact +keys, goldens and fixtures stay at v1. + +## State + +- [ ] not started + +## Done + +(nothing yet) + +## Next + +1. Read the primary files, run the epoch-sensitivity audit. +2. Land the shared epoch module. +3. Dual-accept the two consumer-artifact loaders. +4. Env dual-read helper. +5. Tests + full verification. From 413b8daf3b00198e753865cbce118c7dda099766 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 10:55:08 -0400 Subject: [PATCH 02/33] Accept chronicle-era Chronicle schema ids and add the CHRONICLE_* env dual-read MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chronicle (formerly Ledger) introduces chronicle-era hash domains and chronicle-named schema ids for newly emitted rows at a declared cutover; ledger-era ids stay valid history forever (PolicyEngine/chronicle#143). Microcosm is a consumer, so it must accept both eras before Chronicle flips emit. microcosm.build.chronicle_epoch is the single place that knows which identity belongs to which era. Epoch detection is structural — the namespace segment of a key's domain — rather than a lookup in a frozen list of domain strings, so a chronicle-era family whose version number the spec has not yet declared still resolves, and no validator hard-codes one epoch. Fact keys stay opaque: Microcosm never recomputes a Chronicle digest, so comparison stays exact string equality and only the 'is this a Chronicle key?' question goes dual-era. The consumer-artifact loader now tests manifest schema_version for membership in both eras instead of equality with one, validates a per-row schema id when a feed carries one (Chronicle-published rows never have), and records the observed id, its epoch, and the feed's fact-key epochs in provenance() so a release manifest witnesses which era actually resolved its targets. microcosm.build.chronicle_env is the dual-read window for the operational env names: CHRONICLE_URL/KEY/API_KEY/EXPORT_KEY preferred, POPULACE_LEDGER_* still honored with one DeprecationWarning per process per name. LEDGER_HMRC_BANDS, LEDGER_ONS_*_BANDS and LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT only look like env vars to a grep — they are data constants, so they take chronicle-era aliases instead. Nothing renames on disk: emitted ids, diagnostic field names, populace_* key namespaces, goldens and fixtures stay frozen at v1 (microcosm#639). Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/__init__.py | 26 ++ .../src/microcosm/build/chronicle_env.py | 149 +++++++++ .../src/microcosm/build/chronicle_epoch.py | 294 ++++++++++++++++++ .../src/microcosm/build/ledger_artifact.py | 106 ++++++- .../src/microcosm/build/logbook.py | 32 +- .../build/uk_runtime/firm_generation.py | 10 + .../build/us_runtime/source_coverage.py | 8 + .../us_runtime/us_trade/import_entry_facts.py | 47 ++- tools/logbook.py | 36 ++- 9 files changed, 669 insertions(+), 39 deletions(-) create mode 100644 packages/microcosm-build/src/microcosm/build/chronicle_env.py create mode 100644 packages/microcosm-build/src/microcosm/build/chronicle_epoch.py diff --git a/packages/microcosm-build/src/microcosm/build/__init__.py b/packages/microcosm-build/src/microcosm/build/__init__.py index 352f53b74..ea8dbdf72 100644 --- a/packages/microcosm-build/src/microcosm/build/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/__init__.py @@ -49,6 +49,21 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: _assert_frame_compatible(_frame_version, _REQUIRED_FRAME_SERIES) +from microcosm.build.chronicle_env import ( # noqa: E402 - after the compat gate + chronicle_env, + chronicle_env_names, +) +from microcosm.build.chronicle_epoch import ( # noqa: E402 - after the compat gate + ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, + ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS, + CHRONICLE_EPOCH, + EPOCHS, + LEDGER_EPOCH, + fact_key_epoch, + feed_fact_key_epochs, + is_chronicle_fact_key, + parse_fact_key, +) from microcosm.build.country_spec import ( # noqa: E402 - after the compat gate CountryResourceRow, CountrySpec, @@ -196,6 +211,11 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "StagingTelemetry", "TargetCoverageRequirement", "TargetFitRequirement", + "ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS", + "ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS", + "CHRONICLE_EPOCH", + "EPOCHS", + "LEDGER_EPOCH", "LedgerConsumerArtifact", "LedgerTargetMapping", "LedgerTargetSelection", @@ -204,6 +224,12 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "MonetaryTargetProfile", "PreparedMonetaryMeasure", "add_ledger_artifact_args", + "chronicle_env", + "chronicle_env_names", + "fact_key_epoch", + "feed_fact_key_epochs", + "is_chronicle_fact_key", + "parse_fact_key", "aggregate_admin_gate", "area_support_gate", "column_implication_gate", diff --git a/packages/microcosm-build/src/microcosm/build/chronicle_env.py b/packages/microcosm-build/src/microcosm/build/chronicle_env.py new file mode 100644 index 000000000..763032d4b --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/chronicle_env.py @@ -0,0 +1,149 @@ +"""Dual-read for the Chronicle (formerly Ledger) environment variables. + +PolicyEngine/chronicle#143 gives the operational stores — buckets, database +schema, role ids, and env names — a **dual-read window**: ``CHRONICLE_*`` is +preferred, the legacy name is still honored, and honoring it emits a +deprecation warning so publish flows and build scripts migrate on their own +schedule. This module is that window, in one place. + +Every variable here is read through :func:`chronicle_env`, which tries the +preferred ``CHRONICLE_*`` name first and falls back to the legacy name, +warning once per process per legacy name. Nothing is renamed on disk: the +legacy names keep working for as long as the window is open, and the legacy +name constants stay exported so error messages and tests can still name them. + +Note on scope: the identifiers ``LEDGER_HMRC_BANDS``, +``LEDGER_ONS_TURNOVER_BANDS``, ``LEDGER_ONS_EMPLOYMENT_BANDS``, and +``LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT`` look like environment variables +to a grep but are plain Python module constants (band maps and a git commit +pin). They get chronicle-named *aliases* beside their modules rather than a +dual-read, because there is no environment to read them from. +""" + +from __future__ import annotations + +import os +import threading +import warnings +from collections.abc import Mapping + +__all__ = [ + "CHRONICLE_API_KEY_ENV", + "CHRONICLE_ENV_LEGACY_NAMES", + "CHRONICLE_EXPORT_KEY_ENV", + "CHRONICLE_KEY_ENV", + "CHRONICLE_URL_ENV", + "LEGACY_API_KEY_ENV", + "LEGACY_EXPORT_KEY_ENV", + "LEGACY_KEY_ENV", + "LEGACY_URL_ENV", + "chronicle_env", + "chronicle_env_names", + "describe_chronicle_env", + "reset_chronicle_env_deprecation_warnings", +] + +#: Preferred, chronicle-era names. +CHRONICLE_URL_ENV = "CHRONICLE_URL" +CHRONICLE_KEY_ENV = "CHRONICLE_KEY" +CHRONICLE_API_KEY_ENV = "CHRONICLE_API_KEY" +CHRONICLE_EXPORT_KEY_ENV = "CHRONICLE_EXPORT_KEY" + +#: Legacy, ledger-era names. Still honored; still named in error messages so +#: an operator running the old environment recognises what is being asked for. +LEGACY_URL_ENV = "POPULACE_LEDGER_URL" +LEGACY_KEY_ENV = "POPULACE_LEDGER_KEY" +LEGACY_API_KEY_ENV = "POPULACE_LEDGER_API_KEY" +LEGACY_EXPORT_KEY_ENV = "POPULACE_LEDGER_EXPORT_KEY" + +#: Preferred name -> legacy names, most recent legacy spelling first. Adding a +#: variable to the dual-read window means adding a row here and nothing else. +CHRONICLE_ENV_LEGACY_NAMES: Mapping[str, tuple[str, ...]] = { + CHRONICLE_URL_ENV: (LEGACY_URL_ENV,), + CHRONICLE_KEY_ENV: (LEGACY_KEY_ENV,), + CHRONICLE_API_KEY_ENV: (LEGACY_API_KEY_ENV,), + CHRONICLE_EXPORT_KEY_ENV: (LEGACY_EXPORT_KEY_ENV,), +} + +_WARNED_LEGACY_NAMES: set[str] = set() +_WARNED_LOCK = threading.Lock() + + +def chronicle_env( + name: str, + default: str | None = None, + *, + environ: Mapping[str, str] | None = None, +) -> str | None: + """Read one Chronicle variable, preferring ``name`` over its legacy spelling. + + ``name`` is the preferred ``CHRONICLE_*`` name. When it is unset but a + legacy name carries a value, that value is returned and a + :class:`DeprecationWarning` is emitted **once per process per legacy + name** — repeated reads in a build loop must not turn into a warning + storm. An empty value is treated as unset, matching how the callers here + already test these variables. + """ + source = os.environ if environ is None else environ + if name not in CHRONICLE_ENV_LEGACY_NAMES: + raise KeyError( + f"{name!r} is not a Chronicle environment variable; expected one of " + f"{sorted(CHRONICLE_ENV_LEGACY_NAMES)}." + ) + value = source.get(name) + if value: + return value + for legacy_name in CHRONICLE_ENV_LEGACY_NAMES[name]: + legacy_value = source.get(legacy_name) + if legacy_value: + _warn_once(legacy_name, preferred=name) + return legacy_value + return default + + +def chronicle_env_names(name: str) -> tuple[str, ...]: + """The preferred name followed by every legacy name still honored.""" + if name not in CHRONICLE_ENV_LEGACY_NAMES: + raise KeyError( + f"{name!r} is not a Chronicle environment variable; expected one of " + f"{sorted(CHRONICLE_ENV_LEGACY_NAMES)}." + ) + return (name, *CHRONICLE_ENV_LEGACY_NAMES[name]) + + +def describe_chronicle_env(*names: str) -> str: + """Render required variables for an error message, legacy names included. + + Error text names both spellings on purpose: an operator whose environment + predates the rename must still be able to match the message against what + they have set. + """ + preferred = ", ".join(names) + legacy = ", ".join( + legacy_name + for name in names + for legacy_name in CHRONICLE_ENV_LEGACY_NAMES[name] + ) + return f"{preferred} (legacy {legacy} still honored)" + + +def reset_chronicle_env_deprecation_warnings() -> None: + """Forget which legacy names have warned. For tests only.""" + with _WARNED_LOCK: + _WARNED_LEGACY_NAMES.clear() + + +def _warn_once(legacy_name: str, *, preferred: str) -> None: + with _WARNED_LOCK: + if legacy_name in _WARNED_LEGACY_NAMES: + return + _WARNED_LEGACY_NAMES.add(legacy_name) + warnings.warn( + f"{legacy_name} is the ledger-era name for {preferred} and is " + "deprecated; PolicyEngine Ledger is now Chronicle " + "(PolicyEngine/chronicle#143). Set " + f"{preferred} instead — {legacy_name} stays honored only for the " + "dual-read window.", + DeprecationWarning, + stacklevel=3, + ) diff --git a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py new file mode 100644 index 000000000..0d9d82c67 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py @@ -0,0 +1,294 @@ +"""Epoch tolerance for Chronicle (formerly Ledger) identities. + +PolicyEngine Ledger is being renamed Chronicle. Per the migration spec on +PolicyEngine/chronicle#143 the rename of *identities* happens **by epoch, +never in place**: Chronicle introduces chronicle-era hash domains +(``chronicle.aggregate_fact.v3``, ``chronicle.semantic_fact.v3``, ...) and +chronicle-named schema ids (``policyengine_chronicle.consumer_artifact.v2``, +``chronicle.consumer_fact.v2``) for **newly emitted** rows at a declared +cutover release. Ledger-era ids (``ledger.aggregate_fact.v2``, +``policyengine_ledger.consumer_artifact.v1``, ...) stay valid *history* +forever: no golden regenerates and no witnessed row is rewritten. + +Microcosm is a consumer, so it must accept both eras **before** Chronicle +flips emit. This module is the single place that knows which identities are +which era. The rules it encodes: + +1. **Fact keys are opaque.** Microcosm never reconstructs a Chronicle key + from a payload, so it never needs to know how the domain string feeds the + hash. Comparison stays exact string equality, which is correct in both + eras; what changes is that a validator asking "is this a Chronicle fact + key?" must answer yes for either epoch. +2. **Never hard-code a single epoch in a validator.** Epoch detection here is + *structural* — the namespace segment of the key domain — not a lookup in a + frozen list of domain strings. Chronicle has declared the family-``v3`` + spellings for the two fact families named in the spec; the version numbers + the remaining families will take are not declared yet, and this module + deliberately does not guess them. +3. **Microcosm-minted keys are epoch-independent.** Keys Microcosm mints live + in Microcosm-owned namespaces (``microcosm.derived_fact.*``, + ``populace_us_trade.*``) and are frozen at v1 by microcosm#639. They carry + no Chronicle epoch, and a chronicle-era source row must mint the + byte-identical Microcosm key a ledger-era source row does — otherwise the + cutover would silently re-identify derived facts. +4. **Nothing renames on disk.** Diagnostic field names + (``ledger_aggregate_fact_key``, ``ledger_commit``), H5 attributes, + ``populace_*`` ids, goldens, and fixtures are frozen at v1. + +Only the identity strings the migration spec names explicitly are pinned as +literals here. Everything else is derived. +""" + +from __future__ import annotations + +import re +from collections.abc import Iterable, Mapping +from dataclasses import dataclass +from typing import Any + +__all__ = [ + "ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS", + "ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS", + "CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION", + "CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION", + "CHRONICLE_EPOCH", + "EPOCHS", + "FACT_KEY_FIELDS", + "FactKeyIdentity", + "LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION", + "LEDGER_CONSUMER_FACT_SCHEMA_VERSION", + "LEDGER_EPOCH", + "LEDGER_FACT_KEY_DOMAINS", + "consumer_artifact_schema_epoch", + "consumer_fact_schema_epoch", + "describe_accepted_consumer_artifact_schema_versions", + "describe_accepted_consumer_fact_schema_versions", + "fact_key_epoch", + "feed_fact_key_epochs", + "is_accepted_consumer_artifact_schema_version", + "is_accepted_consumer_fact_schema_version", + "is_chronicle_fact_key", + "parse_fact_key", + "row_fact_key_epochs", +] + +#: The ledger era: everything Chronicle emitted under its former name. +LEDGER_EPOCH = "ledger" + +#: The chronicle era: everything emitted from the declared cutover forward. +CHRONICLE_EPOCH = "chronicle" + +#: Both eras, oldest first. A validator iterates this; it never names one. +EPOCHS: tuple[str, ...] = (LEDGER_EPOCH, CHRONICLE_EPOCH) + +#: Consumer-artifact manifest ``schema_version``, per epoch. Both spellings +#: are declared in the chronicle#143 migration spec. +LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" +CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION = ( + "policyengine_chronicle.consumer_artifact.v2" +) + +#: Per-row consumer-fact ``schema_version``, per epoch. +LEDGER_CONSUMER_FACT_SCHEMA_VERSION = "ledger.consumer_fact.v1" +CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION = "chronicle.consumer_fact.v2" + +CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH: Mapping[str, str] = { + LEDGER_EPOCH: LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + CHRONICLE_EPOCH: CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, +} +CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH: Mapping[str, str] = { + LEDGER_EPOCH: LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + CHRONICLE_EPOCH: CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, +} + +#: Membership sets. Loaders test membership, never equality with one era. +ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS = frozenset( + CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH.values() +) +ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS = frozenset( + CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH.values() +) + +#: Ledger-era fact-key domains, as *observed* in the feeds and fixtures this +#: repo carries. Recorded for documentation and for the frozen-history tests; +#: epoch detection does not consult it, so a family this list has never seen +#: still resolves to its epoch. +LEDGER_FACT_KEY_DOMAINS: Mapping[str, str] = { + "aggregate_fact": "ledger.aggregate_fact.v2", + "semantic_fact": "ledger.semantic_fact.v2", + "fact": "ledger.fact.v1", + "source_cell": "ledger.source_cell.v1", + "dimension_set": "ledger.dimension_set.v2", + "concept_alignment": "ledger.concept_alignment.v2", +} + +#: Consumer-fact row fields that carry a single Chronicle key, in the order +#: :mod:`microcosm.build.ledger_targets` resolves them. +FACT_KEY_FIELDS: tuple[str, ...] = ( + "aggregate_fact_key", + "semantic_fact_key", + "fact_key", + "legacy_fact_key", + "dimension_set_key", +) + +#: Row fields carrying a *list* of Chronicle keys. +_FACT_KEY_LIST_PATHS: tuple[tuple[str, ...], ...] = (("lineage", "source_cell_keys"),) + +#: Nested single-key paths. +_FACT_KEY_NESTED_PATHS: tuple[tuple[str, ...], ...] = ( + ("concept_alignment", "concept_alignment_key"), +) + +_VERSION_PATTERN = re.compile(r"^v\d+$") + + +@dataclass(frozen=True) +class FactKeyIdentity: + """The structure of a Chronicle-shaped key, ``:``. + + ``epoch`` is ``"ledger"`` or ``"chronicle"`` for Chronicle-issued keys and + ``None`` for keys minted in some other namespace — Microcosm's own + ``microcosm.derived_fact.*`` and ``populace_us_trade.*`` derived keys, for + instance, which are deliberately outside both eras. + """ + + domain: str + namespace: str + family: str + version: str + digest: str + epoch: str | None + + +def parse_fact_key(key: object) -> FactKeyIdentity | None: + """Split ``..v:``; ``None`` if not that shape. + + Parsing is deliberately shallow. Microcosm does not recompute Chronicle + digests, so it needs only enough structure to answer "which epoch issued + this key?" — and it must answer that without a frozen list of domain + strings, so a chronicle-era family this code has never seen still resolves. + """ + if not isinstance(key, str) or not key: + return None + domain, separator, digest = key.partition(":") + if not separator or not domain or not digest: + return None + segments = domain.split(".") + if len(segments) < 3: + return None + version = segments[-1] + if not _VERSION_PATTERN.match(version): + return None + namespace = segments[0] + family = ".".join(segments[1:-1]) + if not namespace or not family: + return None + return FactKeyIdentity( + domain=domain, + namespace=namespace, + family=family, + version=version, + digest=digest, + epoch=namespace if namespace in EPOCHS else None, + ) + + +def fact_key_epoch(key: object) -> str | None: + """The epoch that issued ``key``, or ``None`` for a foreign namespace.""" + identity = parse_fact_key(key) + return None if identity is None else identity.epoch + + +def is_chronicle_fact_key(key: object) -> bool: + """True when ``key`` is a Chronicle-issued key of *either* epoch.""" + return fact_key_epoch(key) is not None + + +def row_fact_key_epochs(row: object) -> frozenset[str]: + """Every Chronicle epoch appearing in one consumer-fact row's keys. + + Empty for a row whose keys are all Microcosm-minted: those namespaces are + outside both eras by design. + """ + if not isinstance(row, Mapping): + return frozenset() + epochs: set[str] = set() + for field in FACT_KEY_FIELDS: + epoch = fact_key_epoch(row.get(field)) + if epoch is not None: + epochs.add(epoch) + for path in _FACT_KEY_NESTED_PATHS: + epoch = fact_key_epoch(_at(row, path)) + if epoch is not None: + epochs.add(epoch) + for path in _FACT_KEY_LIST_PATHS: + values = _at(row, path) + if isinstance(values, Iterable) and not isinstance(values, str | bytes): + for value in values: + epoch = fact_key_epoch(value) + if epoch is not None: + epochs.add(epoch) + return frozenset(epochs) + + +def feed_fact_key_epochs(rows: Iterable[Any]) -> tuple[str, ...]: + """Chronicle epochs observed across a whole feed, in :data:`EPOCHS` order. + + A mixed-epoch feed — ledger-era history beside chronicle-era rows — is + expected during the cutover window and is reported, not rejected. + """ + observed: set[str] = set() + for row in rows: + observed |= row_fact_key_epochs(row) + return tuple(epoch for epoch in EPOCHS if epoch in observed) + + +def is_accepted_consumer_artifact_schema_version(value: object) -> bool: + """True for the consumer-artifact manifest schema id of either epoch.""" + return value in ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS + + +def is_accepted_consumer_fact_schema_version(value: object) -> bool: + """True for the per-row consumer-fact schema id of either epoch.""" + return value in ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS + + +def consumer_artifact_schema_epoch(value: object) -> str | None: + """The epoch of a consumer-artifact schema id, or ``None`` if unknown.""" + return _epoch_of(value, CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH) + + +def consumer_fact_schema_epoch(value: object) -> str | None: + """The epoch of a per-row consumer-fact schema id, or ``None``.""" + return _epoch_of(value, CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH) + + +def describe_accepted_consumer_artifact_schema_versions() -> str: + """Both accepted artifact schema ids, oldest era first, for messages.""" + return _describe(CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH) + + +def describe_accepted_consumer_fact_schema_versions() -> str: + """Both accepted per-row fact schema ids, oldest era first, for messages.""" + return _describe(CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH) + + +def _describe(by_epoch: Mapping[str, str]) -> str: + return ", ".join(repr(by_epoch[epoch]) for epoch in EPOCHS) + + +def _epoch_of(value: object, by_epoch: Mapping[str, str]) -> str | None: + for epoch in EPOCHS: + if value == by_epoch[epoch]: + return epoch + return None + + +def _at(row: Mapping[str, Any], path: tuple[str, ...]) -> Any: + current: Any = row + for segment in path: + if not isinstance(current, Mapping): + return None + current = current.get(segment) + return current diff --git a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py index ff9991a5e..57457e65d 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -1,16 +1,25 @@ -"""Pinned loading for PolicyEngine Ledger consumer artifacts. +"""Pinned loading for PolicyEngine Chronicle consumer artifacts. -Ledger publishes consumer artifacts: a directory with ``manifest.json`` -(schema version, content hashes, embedded profile hashes), +Chronicle (formerly Ledger) publishes consumer artifacts: a directory with +``manifest.json`` (schema version, content hashes, embedded profile hashes), ``consumer_facts.jsonl``, per-profile JSON, and coverage diagnostics. A Microcosm build should consume facts through this loader so the release -manifest can record exactly which Ledger data resolved its target values +manifest can record exactly which Chronicle data resolved its target values (PolicyEngine/microcosm#160, #271) and so tampered or mismatched feeds fail before they calibrate anything. -Like the rest of Microcosm's Ledger consumption, this module is duck-typed -against the published artifact contract (stdlib only); it does not import -the Ledger implementation package. +Like the rest of Microcosm's Chronicle consumption, this module is duck-typed +against the published artifact contract (stdlib only); it does not import the +Chronicle implementation package. + +**Both eras load.** The manifest's ``schema_version`` is checked for +membership in :data:`ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS`, never for +equality with one era, so an artifact published after Chronicle's rename +cutover loads here without a code change — see +:mod:`microcosm.build.chronicle_epoch` and PolicyEngine/chronicle#143. The +observed id, its epoch, and the fact-key epochs present in the feed are all +recorded in :meth:`LedgerConsumerArtifact.provenance`, so a release manifest +witnesses which era it actually consumed rather than which era it assumed. """ from __future__ import annotations @@ -22,7 +31,19 @@ from pathlib import Path from typing import Any +from microcosm.build.chronicle_epoch import ( + ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, + LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + consumer_artifact_schema_epoch, + describe_accepted_consumer_artifact_schema_versions, + describe_accepted_consumer_fact_schema_versions, + feed_fact_key_epochs, + is_accepted_consumer_artifact_schema_version, + is_accepted_consumer_fact_schema_version, +) + __all__ = [ + "ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS", "ALLOWED_LEDGER_ASSERTIONS", "CONSUMER_ARTIFACT_SCHEMA_VERSION", "DEFAULT_LEDGER_ASSERTION", @@ -32,21 +53,28 @@ "resolve_ledger_artifact", ] -CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" +#: The era Microcosm's own minted artifacts still declare. Frozen at v1 by +#: microcosm#639; loading is governed by the accepted *set*, not by this. +CONSUMER_ARTIFACT_SCHEMA_VERSION = LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION ALLOWED_LEDGER_ASSERTIONS = frozenset(("observation", "source_projection")) DEFAULT_LEDGER_ASSERTION = "observation" @dataclass(frozen=True) class LedgerConsumerArtifact: - """A loaded, hash-verified Ledger consumer fact feed. + """A loaded, hash-verified Chronicle consumer fact feed. ``manifest`` and ``manifest_sha256`` are ``None`` when the feed was a bare ``consumer_facts.jsonl`` file rather than an artifact directory; bare feeds are still content-addressed by ``facts_sha256`` so builds can - pin them, but they carry no Ledger-side provenance. Rows are exactly as + pin them, but they carry no Chronicle-side provenance. Rows are exactly as published: an ``assertion`` field is validated when present and never fabricated when absent (missing means observation-by-default to readers). + + The class name is ledger-era and stays: renaming an exported symbol + Microcosm's tools and experiments import buys nothing the alias in + :mod:`microcosm.build` does not, and chronicle#143 migrates identities, + not vocabulary. """ path: Path @@ -60,8 +88,36 @@ def fact_row_count(self) -> int: """Number of consumer fact rows in the feed.""" return len(self.facts) + @property + def schema_version(self) -> str | None: + """The schema id this feed actually declared, verbatim.""" + if self.manifest is None: + return None + schema_version = self.manifest.get("schema_version") + return None if schema_version is None else str(schema_version) + + @property + def schema_epoch(self) -> str | None: + """``"ledger"`` or ``"chronicle"`` for the declared schema id.""" + return consumer_artifact_schema_epoch(self.schema_version) + + @property + def fact_key_epochs(self) -> tuple[str, ...]: + """Chronicle epochs observed across the feed's fact keys. + + Empty when the feed carries only Microcosm-minted keys, and both + epochs when a cutover-window feed mixes ledger-era history with + chronicle-era rows. + """ + return feed_fact_key_epochs(self.facts) + def provenance(self) -> dict[str, Any]: - """Ledger-artifact identity block for build and release manifests.""" + """Chronicle-artifact identity block for build and release manifests. + + Records the schema id as *observed*, plus the epoch it belongs to and + the epochs of the fact keys in the feed, so a manifest witnesses which + era of Chronicle actually resolved its targets. + """ payload: dict[str, Any] = { "path_name": self.path.name, "fact_row_count": self.fact_row_count, @@ -82,6 +138,8 @@ def provenance(self) -> dict[str, Any]: else: payload["schema_version"] = None payload["manifest_sha256"] = None + payload["schema_epoch"] = self.schema_epoch + payload["fact_key_epochs"] = list(self.fact_key_epochs) return payload @@ -123,11 +181,14 @@ def load_ledger_consumer_artifact( f"Ledger consumer artifact manifest must be an object: {manifest_path}" ) schema_version = manifest.get("schema_version") - if schema_version != CONSUMER_ARTIFACT_SCHEMA_VERSION: + # Membership, not equality: ledger-era and chronicle-era artifacts are + # the same contract under two names, and both must load through the + # rename cutover (chronicle#143). + if not is_accepted_consumer_artifact_schema_version(schema_version): raise ValueError( - "Unsupported Ledger consumer artifact schema_version " - f"{schema_version!r}; expected " - f"{CONSUMER_ARTIFACT_SCHEMA_VERSION!r}." + "Unsupported Chronicle consumer artifact schema_version " + f"{schema_version!r}; expected one of " + f"{describe_accepted_consumer_artifact_schema_versions()}." ) else: facts_path = artifact_path @@ -222,9 +283,22 @@ def _load_fact_rows(path: Path) -> tuple[dict[str, Any], ...]: ) from exc if not isinstance(row, dict): raise ValueError( - f"Invalid Ledger facts JSONL row {line_number}: expected " + f"Invalid Chronicle facts JSONL row {line_number}: expected " f"object, got {type(row).__name__}." ) + # Chronicle-published rows have never carried a per-row schema id; + # only Microcosm-minted feeds stamp one. Validate it when it is + # there — against both eras — and never demand it when it is not. + row_schema_version = row.get("schema_version") + if row_schema_version is not None and ( + not is_accepted_consumer_fact_schema_version(row_schema_version) + ): + raise ValueError( + f"Chronicle facts JSONL row {line_number} declares " + f"unsupported schema_version {row_schema_version!r}; " + "expected one of " + f"{describe_accepted_consumer_fact_schema_versions()}." + ) assertion = row.get("assertion", DEFAULT_LEDGER_ASSERTION) if assertion not in ALLOWED_LEDGER_ASSERTIONS: raise ValueError( diff --git a/packages/microcosm-build/src/microcosm/build/logbook.py b/packages/microcosm-build/src/microcosm/build/logbook.py index 5047bb77a..de7d404b4 100644 --- a/packages/microcosm-build/src/microcosm/build/logbook.py +++ b/packages/microcosm-build/src/microcosm/build/logbook.py @@ -7,12 +7,16 @@ a best-effort Supabase REST insert. Remote availability is never part of build correctness. If either -``POPULACE_LEDGER_URL`` or ``POPULACE_LEDGER_KEY`` is absent, the validated row -stays in spool-only mode without error. Network and HTTP failures are returned -as receipt data and never raised. Local validation and durable-spool failures +``CHRONICLE_URL`` or ``CHRONICLE_KEY`` is absent, the validated row stays in +spool-only mode without error. Network and HTTP failures are returned as +receipt data and never raised. Local validation and durable-spool failures remain fatal: callers must not claim an attempt was recorded if its local row was invalid or could not be persisted. +The ledger-era spellings (``POPULACE_LEDGER_URL``, ``POPULACE_LEDGER_KEY``, +``POPULACE_LEDGER_API_KEY``) are still honored for the chronicle#143 dual-read +window and warn once per process; see :mod:`microcosm.build.chronicle_env`. + The caller owns chain coordination and must provide ``prev_row_digest`` for the ledger head it extends. The row digest is @@ -28,7 +32,7 @@ The Supabase key must identify the migration's ``logbook_writer`` role, not the service role. Hosted Supabase projects should additionally provide the -project gateway key as ``POPULACE_LEDGER_API_KEY``; single-key deployments may +project gateway key as ``CHRONICLE_API_KEY``; single-key deployments may omit it. The ``logbook`` schema must also be enabled in the hosted project's PostgREST exposed-schema setting. The US stacked driver and the three UK drivers record through this seam; this module remains driver-agnostic. @@ -56,6 +60,14 @@ from urllib.parse import urlencode, urlsplit from urllib.request import HTTPRedirectHandler, Request, build_opener +from microcosm.build.chronicle_env import ( + CHRONICLE_API_KEY_ENV, + CHRONICLE_KEY_ENV, + CHRONICLE_URL_ENV, + LEGACY_API_KEY_ENV, + chronicle_env, +) + __all__ = [ "BUILD_DISPOSITIONS", "LOGBOOK_ROW_FIELDS", @@ -91,7 +103,11 @@ _DIGEST_PATTERN = re.compile(r"^[0-9a-f]{64}$") _BUILD_ID_PATTERN = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._:-]{0,254}$") LOGBOOK_RUNGS = frozenset({"f001", "f004", "f010", "f025", "f100"}) -LEDGER_API_KEY_ENV = "POPULACE_LEDGER_API_KEY" +#: Ledger-era name for the project gateway key, kept because callers and +#: operator runbooks still name it. Reads go through +#: :func:`microcosm.build.chronicle_env.chronicle_env`, which prefers +#: ``CHRONICLE_API_KEY`` and warns once when it falls back to this one. +LEDGER_API_KEY_ENV = LEGACY_API_KEY_ENV LOGBOOK_ROW_FIELDS = frozenset( { "build_id", @@ -820,11 +836,11 @@ def urlopen(request: Request, *, timeout: float) -> Any: def _remote_config() -> tuple[str, str, str] | None: - url = os.environ.get("POPULACE_LEDGER_URL") - key = os.environ.get("POPULACE_LEDGER_KEY") + url = chronicle_env(CHRONICLE_URL_ENV) + key = chronicle_env(CHRONICLE_KEY_ENV) if not url or not key: return None - api_key = os.environ.get(LEDGER_API_KEY_ENV) or key + api_key = chronicle_env(CHRONICLE_API_KEY_ENV) or key return url, key, api_key diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py index 8e4da91cb..9867276a1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py @@ -159,6 +159,16 @@ class UKFirmLedgerTargetProfile: "greater_than_10m": "Greater_than_£10m", } +# Chronicle-era spellings of the three band maps above. These identifiers only +# look like environment variables to a grep — they are plain support-layout +# data, so they take aliases rather than the dual-read window in +# :mod:`microcosm.build.chronicle_env`. The ledger-era names stay: they are what +# the generator below imports, and the value ids they translate are published +# Chronicle ids, unaffected by the rename. +CHRONICLE_ONS_TURNOVER_BANDS = LEDGER_ONS_TURNOVER_BANDS +CHRONICLE_ONS_EMPLOYMENT_BANDS = LEDGER_ONS_EMPLOYMENT_BANDS +CHRONICLE_HMRC_BANDS = LEDGER_HMRC_BANDS + HMRC_BAND_COLUMNS: tuple[str, ...] = ( "Negative_or_Zero", "£1_to_Threshold", diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py b/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py index 76214ad50..ab0bfea06 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py @@ -18,6 +18,7 @@ from microcosm.build.gates import GateResult, source_coverage_gate __all__ = [ + "CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT", "LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT", "CoverageRole", "SourceCoverageEntry", @@ -31,6 +32,13 @@ ] LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT = "e2fc882c35f9203c788a7159e7b08b0b5e5ceb58" +#: Chronicle-era spelling of the same pin. This identifier only *looks* like an +#: environment variable to a grep — it is a git commit of the source-coverage +#: contract, so it takes an alias rather than the dual-read window in +#: :mod:`microcosm.build.chronicle_env`. The ledger-era name stays exported: it +#: is what callers import, and the ``ledger_commit`` diagnostic field it feeds +#: is frozen at v1 (microcosm#639). +CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT = LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT CoverageRole = Literal["hard_target", "validation_only", "source_gap"] diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py b/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py index fd953f178..2e84e05d6 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py @@ -1,6 +1,6 @@ -"""Ledger consumer-artifact emission for US import-entry margins. +"""Chronicle consumer-artifact emission for US import-entry margins. -Microcosm's ledger leg consumes sha-pinned consumer artifacts +Microcosm's Chronicle leg consumes sha-pinned consumer artifacts (``manifest.json`` + ``consumer_facts.jsonl``, :mod:`microcosm.build.ledger_artifact`) whose rows follow the ``ledger.consumer_fact.v1`` shape that :mod:`microcosm.build.ledger_targets` @@ -8,6 +8,15 @@ margin series to that exact contract from the Census ingest and archived CBP statistics. +The contract has a chronicle-era spelling too (``chronicle.consumer_fact.v2`` +under ``policyengine_chronicle.consumer_artifact.v2``, chronicle#143), and the +loader accepts both. What this module *emits* stays ledger-era: the rows are +byte-pinned goldens, and they are minted from official source bytes rather +than derived from a Chronicle row whose epoch they would have to inherit. +:func:`write_consumer_artifact` takes the declared id as an argument, checked +for membership in both eras, so flipping the declaration later is a caller +change rather than a code change. + Producer identity is explicit: these rows are **microcosm-minted** from official source bytes — not an export of a PolicyEngine/ledger build — and every row's ``source.extraction_method`` and the artifact manifest's @@ -39,6 +48,13 @@ import pandas as pd +from microcosm.build.chronicle_epoch import ( + ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, + LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + describe_accepted_consumer_artifact_schema_versions, + is_accepted_consumer_artifact_schema_version, +) from microcosm.build.us_runtime.us_trade.cbp_entry_stats import ( CBP_TRADE_STATS_URL, CbpEntryStats, @@ -50,6 +66,7 @@ from microcosm.build.us_runtime.us_trade.imdb_bulk import IMDB_URL_TEMPLATE __all__ = [ + "ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS", "ALL_IMPORT_ENTRY_FACT_GRAINS", "CONSUMER_ARTIFACT_SCHEMA_VERSION", "DISTRICT_ENTRY_FACT_GRAIN", @@ -138,8 +155,17 @@ class FactSourceLeg: ), ) -CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" -_FACT_SCHEMA_VERSION = "ledger.consumer_fact.v1" +#: The schema ids these microcosm-minted rows *declare*. Both stay ledger-era: +#: the emitted bytes are golden-pinned (microcosm#639) and these facts are +#: minted from Census/CBP source bytes, so there is no chronicle-era source row +#: whose epoch they could inherit. Chronicle's own cutover moves what Chronicle +#: emits, not what Microcosm mints. Acceptance is the separate, dual-era +#: question, and it lives in :mod:`microcosm.build.chronicle_epoch`. +CONSUMER_ARTIFACT_SCHEMA_VERSION = LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION +_FACT_SCHEMA_VERSION = LEDGER_CONSUMER_FACT_SCHEMA_VERSION +#: Microcosm's own key namespace: outside both Chronicle eras by construction, +#: so these keys can never collide with or impersonate Chronicle-built keys — +#: and a Chronicle-era cutover cannot silently re-identify them. _KEY_NAMESPACE = "populace_us_trade" #: Margins-feed grains (the aggregations of the HTS10 × country margins @@ -583,15 +609,26 @@ def write_consumer_artifact( *, retrieval_manifest: Iterable[Mapping[str, Any]], generator: Mapping[str, Any], + schema_version: str = CONSUMER_ARTIFACT_SCHEMA_VERSION, ) -> dict[str, Any]: """Write ``consumer_facts.jsonl`` + ``manifest.json`` and return the manifest. The directory loads through :func:`microcosm.build.ledger_artifact.load_ledger_consumer_artifact`, which re-hashes the fact file against ``manifest.facts_sha256``. + + ``schema_version`` defaults to the ledger-era id these artifacts have + always declared and is validated for membership in both eras, so the + chronicle-era cutover is a caller decision rather than an edit here. """ if not fact_rows: raise ValueError("Refusing to write an empty consumer artifact.") + if not is_accepted_consumer_artifact_schema_version(schema_version): + raise ValueError( + f"Refusing to write a consumer artifact declaring schema_version " + f"{schema_version!r}; expected one of " + f"{describe_accepted_consumer_artifact_schema_versions()}." + ) retrieval_entries = [dict(entry) for entry in retrieval_manifest] if not retrieval_entries: raise ValueError( @@ -621,7 +658,7 @@ def write_consumer_artifact( facts_path.write_bytes(payload) retrievals = retrieval_entries manifest = { - "schema_version": CONSUMER_ARTIFACT_SCHEMA_VERSION, + "schema_version": schema_version, "facts_sha256": hashlib.sha256(payload).hexdigest(), "fact_row_count": len(fact_rows), "profiles": {}, diff --git a/tools/logbook.py b/tools/logbook.py index 78aaee9d4..afea050ef 100644 --- a/tools/logbook.py +++ b/tools/logbook.py @@ -7,8 +7,11 @@ archive or a directory of them, reporting chain by chain. Remote export uses a distinct, read-only ``logbook_exporter`` JWT supplied -as ``POPULACE_LEDGER_EXPORT_KEY`` plus the hosted project's gateway key in -``POPULACE_LEDGER_API_KEY``. It never reuses the insert-only writer key. +as ``CHRONICLE_EXPORT_KEY`` plus the hosted project's gateway key in +``CHRONICLE_API_KEY``. It never reuses the insert-only writer key. The +ledger-era spellings (``POPULACE_LEDGER_EXPORT_KEY``, +``POPULACE_LEDGER_API_KEY``, ``POPULACE_LEDGER_URL``) stay honored for the +chronicle#143 dual-read window and warn once per process. The live store is row-oriented and carries every attempt across all scopes; the per-scope split is an archive convention, not a database partition. """ @@ -17,7 +20,6 @@ import argparse import json -import os import re import sys from pathlib import Path @@ -25,6 +27,15 @@ from urllib.parse import urlencode from urllib.request import Request +from microcosm.build.chronicle_env import ( + CHRONICLE_API_KEY_ENV, + CHRONICLE_EXPORT_KEY_ENV, + CHRONICLE_URL_ENV, + LEGACY_API_KEY_ENV, + LEGACY_EXPORT_KEY_ENV, + chronicle_env, + describe_chronicle_env, +) from microcosm.build.logbook import ( LOGBOOK_ROW_FIELDS, LogbookRow, @@ -46,8 +57,11 @@ #: chain is born, and country is the outermost one. DEFAULT_ARCHIVE_ROOT = ROOT / "logbook" DEFAULT_SPOOL_ROOT = ROOT / "logbook-spool" -REMOTE_EXPORT_KEY_ENV = "POPULACE_LEDGER_EXPORT_KEY" -REMOTE_API_KEY_ENV = "POPULACE_LEDGER_API_KEY" +#: Ledger-era names, still honored through the chronicle#143 dual-read window. +#: Reads go through :func:`microcosm.build.chronicle_env.chronicle_env`, which +#: prefers ``CHRONICLE_EXPORT_KEY`` / ``CHRONICLE_API_KEY``. +REMOTE_EXPORT_KEY_ENV = LEGACY_EXPORT_KEY_ENV +REMOTE_API_KEY_ENV = LEGACY_API_KEY_ENV REMOTE_PAGE_SIZE = 500 # Mirror of logbook.chain_scope() in # supabase/migrations/20260818000000_logbook_chain_scopes.sql. The legacy US @@ -243,13 +257,15 @@ def _archive_scope(archive: Path) -> str: def _remote_rows(scope: str) -> tuple[LogbookRow, ...]: - ledger_url = os.environ.get("POPULACE_LEDGER_URL") - export_key = os.environ.get(REMOTE_EXPORT_KEY_ENV) - api_key = os.environ.get(REMOTE_API_KEY_ENV) + ledger_url = chronicle_env(CHRONICLE_URL_ENV) + export_key = chronicle_env(CHRONICLE_EXPORT_KEY_ENV) + api_key = chronicle_env(CHRONICLE_API_KEY_ENV) if not ledger_url or not export_key or not api_key: raise ValueError( - "remote export requires POPULACE_LEDGER_URL, " - f"{REMOTE_EXPORT_KEY_ENV}, and {REMOTE_API_KEY_ENV}" + "remote export requires " + + describe_chronicle_env( + CHRONICLE_URL_ENV, CHRONICLE_EXPORT_KEY_ENV, CHRONICLE_API_KEY_ENV + ) ) rows: list[LogbookRow] = [] From ca98a9c7617cf8a51bd24574343139d8033bcb30 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:04:33 -0400 Subject: [PATCH 03/33] Test dual-era acceptance across the fact-consumption surface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Covers the epoch module itself, the loader under each schema id, a mixed-epoch feed straddling the cutover, mixed-epoch target compilation and a chronicle-era reference pin, and the two producer surfaces: the minted US trade artifact declares the ledger-era id but loads under either, and the congressional-district vintage translation mints byte-identical microcosm.derived_fact keys whether its source rows are ledger-era or chronicle-era — otherwise cutover day would silently re-identify every derived fact a target is pinned to. Also documents the env dual-read in logbook/README.md and adds the towncrier fragment. Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept.md | 48 ++- changelog.d/chronicle-dual-accept.added.md | 1 + logbook/README.md | 6 +- .../tests/test_chronicle_env.py | 176 +++++++++ .../tests/test_chronicle_epoch.py | 344 ++++++++++++++++++ .../tests/test_ledger_targets.py | 89 +++++ .../test_us_congressional_district_vintage.py | 160 ++++++++ .../tests/test_us_trade_facts.py | 71 ++++ 8 files changed, 884 insertions(+), 11 deletions(-) create mode 100644 changelog.d/chronicle-dual-accept.added.md create mode 100644 packages/microcosm-build/tests/test_chronicle_env.py create mode 100644 packages/microcosm-build/tests/test_chronicle_epoch.py diff --git a/PROGRESS-chronicle-dual-accept.md b/PROGRESS-chronicle-dual-accept.md index 47cd999f8..118003a21 100644 --- a/PROGRESS-chronicle-dual-accept.md +++ b/PROGRESS-chronicle-dual-accept.md @@ -18,21 +18,51 @@ Microcosm must accept BOTH ledger-era and chronicle-era Chronicle identities deprecation warning Frozen (microcosm#639): nothing on disk or in artifacts renames. Diagnostic -field names (`ledger_aggregate_fact_key`), H5 attrs, `populace_*` ids, fact -keys, goldens and fixtures stay at v1. +field names (`ledger_aggregate_fact_key`, `ledger_commit`), H5 attrs, +`populace_*` ids, fact keys, goldens and fixtures stay at v1. ## State -- [ ] not started +Implementation and tests landed; verification run recorded in `out.md`. ## Done -(nothing yet) +- `microcosm/build/chronicle_epoch.py` — the single epoch authority. Epoch + detection is **structural** (the namespace segment of a key domain), not a + lookup in a frozen domain list, because chronicle#143 declares the `v3` + spelling only for the aggregate and semantic fact families. Only identity + strings the spec names explicitly are pinned as literals. +- `microcosm/build/chronicle_env.py` — the env dual-read window, one helper, + one `DeprecationWarning` per process per legacy name. +- `ledger_artifact.py` — manifest `schema_version` is a membership test over + both eras; a per-row `schema_version` is validated when present (Chronicle + rows have never carried one) and never demanded; `provenance()` records the + observed id, `schema_epoch`, and `fact_key_epochs`. +- `us_trade/import_entry_facts.py` — emission stays ledger-era (bytes are + pinned; these rows are minted from Census/CBP bytes, so there is no source + epoch to inherit), but the declared id is now an argument checked against + both eras. +- Chronicle-era aliases for the four `LEDGER_*` module constants that only + look like env vars to a grep. +- Tests: `test_chronicle_epoch.py`, `test_chronicle_env.py`, plus mixed-epoch + cases in `test_ledger_targets.py`, epoch-independence of the minted + `microcosm.derived_fact.*` keys in + `test_us_congressional_district_vintage.py`, and dual-era emission and + acceptance in `test_us_trade_facts.py`. + +## Audit result + +An 8-surface / 42-agent adversarial audit of every site that compares, +parses, or mints a Chronicle fact key or schema id found exactly three +hard-coded epoch literals in non-test source — `ledger_artifact.py:35`/`:126` +and `import_entry_facts.py:141`/`:142` — all handled here. `ledger_targets.py` +carries keys opaquely and contains no epoch literal at all; +`congressional_district_vintage.py` mints into Microcosm-owned namespaces that +sit outside both eras; the UK runtime is clean; no golden embeds a Chronicle +domain and no H5 attribute name embeds `ledger`. Every other candidate site +was refuted on verification. ## Next -1. Read the primary files, run the epoch-sensitivity audit. -2. Land the shared epoch module. -3. Dual-accept the two consumer-artifact loaders. -4. Env dual-read helper. -5. Tests + full verification. +Nothing outstanding on this branch. Chronicle's own acceptance half lands in +the parallel lane; the emit flip is a separate, later cutover. diff --git a/changelog.d/chronicle-dual-accept.added.md b/changelog.d/chronicle-dual-accept.added.md new file mode 100644 index 000000000..472213d7e --- /dev/null +++ b/changelog.d/chronicle-dual-accept.added.md @@ -0,0 +1 @@ +Accept chronicle-era Chronicle identities everywhere Microcosm consumes them: consumer-artifact manifests declaring `policyengine_chronicle.consumer_artifact.v2` and fact rows declaring `chronicle.consumer_fact.v2` load beside their ledger-era spellings, mixed-epoch feeds compile, and the loader records the observed schema id, its epoch, and the feed's fact-key epochs in provenance. Environment variables gain a `CHRONICLE_*` dual-read window with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. diff --git a/logbook/README.md b/logbook/README.md index a148dd142..47f43e6fa 100644 --- a/logbook/README.md +++ b/logbook/README.md @@ -90,8 +90,10 @@ for `published` and `certified` rows. ## The live store -The best-effort Supabase insert (`POPULACE_LEDGER_URL` + -`POPULACE_LEDGER_KEY`, the migration's insert-only `logbook_writer` role) +The best-effort Supabase insert (`CHRONICLE_URL` + `CHRONICLE_KEY`, the +migration's insert-only `logbook_writer` role; the ledger-era +`POPULACE_LEDGER_URL` / `POPULACE_LEDGER_KEY` stay honored for the +chronicle#143 dual-read window and warn once per process) uses the same scope rule as the archives after this PR's migration is applied by the project owner. The writer key is unaffected: rows are still inserted through the same role and the scope is derived from the hashed `pipeline` diff --git a/packages/microcosm-build/tests/test_chronicle_env.py b/packages/microcosm-build/tests/test_chronicle_env.py new file mode 100644 index 000000000..76697a4b2 --- /dev/null +++ b/packages/microcosm-build/tests/test_chronicle_env.py @@ -0,0 +1,176 @@ +"""The CHRONICLE_* / POPULACE_LEDGER_* environment dual-read window. + +chronicle#143 gives the operational stores a dual-read window so publish +flows and build scripts migrate on their own schedule: ``CHRONICLE_*`` is +preferred, the ledger-era name is still honored, and honoring it warns once +per process. These tests hold both halves — the fallback keeps working, and +the warning stays a single line rather than one per read in a build loop. +""" + +from __future__ import annotations + +import warnings + +import pytest + +from microcosm.build.chronicle_env import ( + CHRONICLE_API_KEY_ENV, + CHRONICLE_ENV_LEGACY_NAMES, + CHRONICLE_EXPORT_KEY_ENV, + CHRONICLE_KEY_ENV, + CHRONICLE_URL_ENV, + LEGACY_API_KEY_ENV, + LEGACY_EXPORT_KEY_ENV, + LEGACY_KEY_ENV, + LEGACY_URL_ENV, + chronicle_env, + chronicle_env_names, + describe_chronicle_env, + reset_chronicle_env_deprecation_warnings, +) +from microcosm.build.logbook import _remote_config + +PAIRS = ( + (CHRONICLE_URL_ENV, LEGACY_URL_ENV), + (CHRONICLE_KEY_ENV, LEGACY_KEY_ENV), + (CHRONICLE_API_KEY_ENV, LEGACY_API_KEY_ENV), + (CHRONICLE_EXPORT_KEY_ENV, LEGACY_EXPORT_KEY_ENV), +) + + +@pytest.fixture(autouse=True) +def _clean_env(monkeypatch): + for preferred, legacy in PAIRS: + monkeypatch.delenv(preferred, raising=False) + monkeypatch.delenv(legacy, raising=False) + reset_chronicle_env_deprecation_warnings() + yield + reset_chronicle_env_deprecation_warnings() + + +@pytest.mark.parametrize(("preferred", "legacy"), PAIRS) +def test_preferred_name_wins_and_warns_about_nothing( + monkeypatch, preferred: str, legacy: str +) -> None: + monkeypatch.setenv(preferred, "chronicle-value") + monkeypatch.setenv(legacy, "ledger-value") + + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + assert chronicle_env(preferred) == "chronicle-value" + + +@pytest.mark.parametrize(("preferred", "legacy"), PAIRS) +def test_legacy_name_is_honored_with_a_deprecation_warning( + monkeypatch, preferred: str, legacy: str +) -> None: + monkeypatch.setenv(legacy, "ledger-value") + + with pytest.warns(DeprecationWarning) as record: + assert chronicle_env(preferred) == "ledger-value" + + message = str(record[0].message) + assert legacy in message + assert preferred in message + assert "chronicle#143" in message + + +def test_the_deprecation_warning_fires_once_per_process(monkeypatch) -> None: + """A build loop reads these repeatedly; one warning, not a storm.""" + monkeypatch.setenv(LEGACY_URL_ENV, "https://ledger.example") + + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + for _ in range(5): + assert chronicle_env(CHRONICLE_URL_ENV) == "https://ledger.example" + + assert [ + w for w in caught if issubclass(w.category, DeprecationWarning) + ].__len__() == 1 + + +def test_each_legacy_name_warns_on_its_own(monkeypatch) -> None: + monkeypatch.setenv(LEGACY_URL_ENV, "https://ledger.example") + monkeypatch.setenv(LEGACY_KEY_ENV, "writer-jwt") + + with warnings.catch_warnings(record=True) as caught: + warnings.simplefilter("always") + chronicle_env(CHRONICLE_URL_ENV) + chronicle_env(CHRONICLE_KEY_ENV) + + warned = { + legacy + for legacy in (LEGACY_URL_ENV, LEGACY_KEY_ENV) + if any(legacy in str(w.message) for w in caught) + } + assert warned == {LEGACY_URL_ENV, LEGACY_KEY_ENV} + + +def test_unset_returns_the_default_and_empty_counts_as_unset(monkeypatch) -> None: + assert chronicle_env(CHRONICLE_URL_ENV) is None + assert chronicle_env(CHRONICLE_URL_ENV, "fallback") == "fallback" + + monkeypatch.setenv(CHRONICLE_URL_ENV, "") + monkeypatch.setenv(LEGACY_URL_ENV, "https://ledger.example") + with pytest.warns(DeprecationWarning): + assert chronicle_env(CHRONICLE_URL_ENV) == "https://ledger.example" + + +def test_an_explicit_environ_mapping_bypasses_the_process_environment() -> None: + with pytest.warns(DeprecationWarning): + assert ( + chronicle_env(CHRONICLE_KEY_ENV, environ={LEGACY_KEY_ENV: "writer-jwt"}) + == "writer-jwt" + ) + + +def test_a_name_outside_the_window_is_a_programming_error() -> None: + with pytest.raises(KeyError, match="not a Chronicle environment variable"): + chronicle_env("CHRONICLE_NOT_A_REAL_VARIABLE") + with pytest.raises(KeyError, match="not a Chronicle environment variable"): + chronicle_env_names(LEGACY_URL_ENV) + + +def test_names_and_descriptions_carry_both_spellings() -> None: + assert chronicle_env_names(CHRONICLE_URL_ENV) == (CHRONICLE_URL_ENV, LEGACY_URL_ENV) + + described = describe_chronicle_env(CHRONICLE_URL_ENV, CHRONICLE_EXPORT_KEY_ENV) + # An operator whose environment predates the rename must still be able to + # match the error text against what they have set. + for name in ( + CHRONICLE_URL_ENV, + CHRONICLE_EXPORT_KEY_ENV, + LEGACY_URL_ENV, + LEGACY_EXPORT_KEY_ENV, + ): + assert name in described + + +def test_every_windowed_variable_maps_to_exactly_one_legacy_name() -> None: + assert dict(CHRONICLE_ENV_LEGACY_NAMES) == { + preferred: (legacy,) for preferred, legacy in PAIRS + } + + +def test_logbook_remote_config_reads_both_eras(monkeypatch) -> None: + assert _remote_config() is None + + monkeypatch.setenv(LEGACY_URL_ENV, "https://ledger.example") + monkeypatch.setenv(LEGACY_KEY_ENV, "writer-jwt") + with pytest.warns(DeprecationWarning): + assert _remote_config() == ( + "https://ledger.example", + "writer-jwt", + "writer-jwt", + ) + + monkeypatch.setenv(CHRONICLE_URL_ENV, "https://chronicle.example") + monkeypatch.setenv(CHRONICLE_KEY_ENV, "chronicle-jwt") + monkeypatch.setenv(CHRONICLE_API_KEY_ENV, "project-api-key") + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + assert _remote_config() == ( + "https://chronicle.example", + "chronicle-jwt", + "project-api-key", + ) diff --git a/packages/microcosm-build/tests/test_chronicle_epoch.py b/packages/microcosm-build/tests/test_chronicle_epoch.py new file mode 100644 index 000000000..915b44363 --- /dev/null +++ b/packages/microcosm-build/tests/test_chronicle_epoch.py @@ -0,0 +1,344 @@ +"""Dual-era acceptance of Chronicle (formerly Ledger) identities. + +Chronicle introduces chronicle-era hash domains and chronicle-named schema +ids for newly emitted rows at a declared cutover; ledger-era ids stay valid +history forever (PolicyEngine/chronicle#143). Microcosm consumes both, and +these tests are the contract that says so: no validator may reject a row for +being on the other side of the cutover, and no minted Microcosm identity may +move because a source row crossed it. +""" + +from __future__ import annotations + +import hashlib +import json + +import pytest + +from microcosm.build.chronicle_epoch import ( + ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, + ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS, + CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + CHRONICLE_EPOCH, + EPOCHS, + LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + LEDGER_EPOCH, + LEDGER_FACT_KEY_DOMAINS, + consumer_artifact_schema_epoch, + fact_key_epoch, + feed_fact_key_epochs, + is_accepted_consumer_artifact_schema_version, + is_accepted_consumer_fact_schema_version, + is_chronicle_fact_key, + parse_fact_key, + row_fact_key_epochs, +) +from microcosm.build.ledger_artifact import load_ledger_consumer_artifact + +#: A chronicle-era row as the migration spec describes it: identical canonical +#: payload, ``chronicle.*.v3`` domain in place of ``ledger.*.v2``. +_CHRONICLE_AGGREGATE_KEY = "chronicle.aggregate_fact.v3:abc123" +_LEDGER_AGGREGATE_KEY = "ledger.aggregate_fact.v2:abc123" + + +def _fact_row(**overrides): + row = { + "aggregate_fact_key": _LEDGER_AGGREGATE_KEY, + "semantic_fact_key": "ledger.semantic_fact.v2:abc123", + "value": 100, + "period": {"type": "tax_year", "value": 2023}, + "geography": {"level": "country", "id": "0100000US"}, + "entity": {"name": "tax_unit"}, + "aggregation": {"method": "sum"}, + "observed_measure": {"source_name": "irs_soi", "unit": "usd"}, + "source": {"source_name": "irs_soi"}, + "lineage": { + "source_record_id": "irs_soi.ty2023.t.all.agi", + "source_cell_keys": ["ledger.source_cell.v1:cell"], + }, + } + row.update(overrides) + return row + + +def _chronicle_fact_row(**overrides): + """The same row after Chronicle's cutover: every key domain re-epoched.""" + row = _fact_row( + aggregate_fact_key=_CHRONICLE_AGGREGATE_KEY, + semantic_fact_key="chronicle.semantic_fact.v3:abc123", + ) + row["lineage"] = dict(row["lineage"]) + row["lineage"]["source_cell_keys"] = ["chronicle.source_cell.v3:cell"] + row.update(overrides) + return row + + +def _write_artifact_dir(tmp_path, rows, *, schema_version, name="artifact"): + artifact_dir = tmp_path / name + artifact_dir.mkdir() + payload = "".join(json.dumps(row, sort_keys=True) + "\n" for row in rows) + (artifact_dir / "consumer_facts.jsonl").write_text(payload) + manifest = { + "schema_version": schema_version, + "fact_row_count": len(rows), + "facts_sha256": hashlib.sha256(payload.encode()).hexdigest(), + "profiles": {"us_fiscal": {"sha256": "ab" * 32, "target_count": 3}}, + } + (artifact_dir / "manifest.json").write_text( + json.dumps(manifest, indent=2, sort_keys=True) + "\n" + ) + return artifact_dir + + +def test_parse_fact_key_splits_domain_namespace_family_and_version() -> None: + identity = parse_fact_key(_LEDGER_AGGREGATE_KEY) + + assert identity is not None + assert identity.domain == "ledger.aggregate_fact.v2" + assert identity.namespace == "ledger" + assert identity.family == "aggregate_fact" + assert identity.version == "v2" + assert identity.digest == "abc123" + assert identity.epoch == LEDGER_EPOCH + + +@pytest.mark.parametrize("domain", sorted(LEDGER_FACT_KEY_DOMAINS.values())) +def test_every_observed_ledger_era_domain_resolves_to_the_ledger_epoch( + domain: str, +) -> None: + assert fact_key_epoch(f"{domain}:digest") == LEDGER_EPOCH + + +def test_chronicle_era_keys_resolve_without_a_declared_version_number() -> None: + """Epoch detection is structural, so undeclared families still resolve. + + chronicle#143 names the ``v3`` spelling for the aggregate and semantic + fact families; it does not say which version number the remaining + families take. A validator that answered "unknown" for those would + fail closed on the cutover, so detection reads the namespace segment + rather than matching a frozen list of domain strings. + """ + for key in ( + _CHRONICLE_AGGREGATE_KEY, + "chronicle.semantic_fact.v3:abc123", + "chronicle.source_cell.v7:cell", + "chronicle.some_family_nobody_has_declared_yet.v11:digest", + ): + assert fact_key_epoch(key) == CHRONICLE_EPOCH + assert is_chronicle_fact_key(key) + + +def test_microcosm_minted_namespaces_are_outside_both_epochs() -> None: + """Microcosm's own derived keys must not be mistaken for Chronicle's. + + They are frozen at v1 by microcosm#639 and carry no Chronicle epoch, so + the cutover cannot re-identify them. + """ + for key in ( + "microcosm.derived_fact.congressional_district_vintage.v1:deadbeef", + "microcosm.semantic_fact.congressional_district_state_total_proxy.v1:dead", + "populace_us_trade.aggregate_fact.v1:digest", + "populace_us_trade.semantic_fact.v1:digest", + ): + assert fact_key_epoch(key) is None + assert not is_chronicle_fact_key(key) + + +@pytest.mark.parametrize( + "key", + [ + "", + "ledger.aggregate_fact.v2", # no digest + "ledger.aggregate_fact:digest", # no version + "ledger:digest", # no family + ":digest", + "not a key at all", + None, + 42, + ], +) +def test_non_key_shapes_parse_to_none_rather_than_raising(key) -> None: + assert parse_fact_key(key) is None + assert fact_key_epoch(key) is None + + +def test_row_epochs_cover_every_key_field_including_nested_lists() -> None: + ledger_row = _fact_row() + chronicle_row = _chronicle_fact_row() + + assert row_fact_key_epochs(ledger_row) == frozenset({LEDGER_EPOCH}) + assert row_fact_key_epochs(chronicle_row) == frozenset({CHRONICLE_EPOCH}) + + # A row whose only chronicle-era key is a nested source-cell key still + # reports both eras: lineage keys are Chronicle identities too. + straddling = _fact_row() + straddling["lineage"] = dict(straddling["lineage"]) + straddling["lineage"]["source_cell_keys"] = ["chronicle.source_cell.v3:cell"] + assert row_fact_key_epochs(straddling) == frozenset({LEDGER_EPOCH, CHRONICLE_EPOCH}) + + +def test_row_epochs_read_the_concept_alignment_key() -> None: + row = _fact_row( + concept_alignment={ + "concept_alignment_key": "chronicle.concept_alignment.v3:aligned", + "relation": "source_label", + } + ) + + assert row_fact_key_epochs(row) == frozenset({LEDGER_EPOCH, CHRONICLE_EPOCH}) + + +def test_feed_epochs_report_a_mixed_feed_in_epoch_order() -> None: + assert feed_fact_key_epochs([_fact_row()]) == (LEDGER_EPOCH,) + assert feed_fact_key_epochs([_chronicle_fact_row()]) == (CHRONICLE_EPOCH,) + assert feed_fact_key_epochs([_chronicle_fact_row(), _fact_row()]) == EPOCHS + assert ( + feed_fact_key_epochs([{"aggregate_fact_key": "populace_us_trade.a.v1:x"}]) == () + ) + assert feed_fact_key_epochs([]) == () + + +def test_schema_id_membership_covers_both_eras_and_nothing_else() -> None: + assert ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS == { + LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, + } + assert ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS == { + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + } + assert is_accepted_consumer_artifact_schema_version( + CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION + ) + assert is_accepted_consumer_fact_schema_version( + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION + ) + assert not is_accepted_consumer_artifact_schema_version( + "policyengine_chronicle.other.v9" + ) + assert not is_accepted_consumer_fact_schema_version("chronicle.consumer_fact.v1") + + +@pytest.mark.parametrize( + ("schema_version", "expected_epoch"), + [ + (LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_EPOCH), + (CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, CHRONICLE_EPOCH), + ], +) +def test_artifact_loads_under_each_schema_id_and_records_the_observed_one( + tmp_path, schema_version: str, expected_epoch: str +) -> None: + rows = [ + _fact_row() if expected_epoch == LEDGER_EPOCH else _chronicle_fact_row(), + ] + artifact_dir = _write_artifact_dir(tmp_path, rows, schema_version=schema_version) + + artifact = load_ledger_consumer_artifact(artifact_dir) + + assert artifact.fact_row_count == 1 + assert artifact.schema_version == schema_version + assert artifact.schema_epoch == expected_epoch + provenance = artifact.provenance() + # The id is recorded as observed, not as assumed. + assert provenance["schema_version"] == schema_version + assert provenance["schema_epoch"] == expected_epoch + assert provenance["fact_key_epochs"] == [expected_epoch] + assert ( + consumer_artifact_schema_epoch(provenance["schema_version"]) == expected_epoch + ) + + +def test_mixed_epoch_feed_loads_and_witnesses_both_eras(tmp_path) -> None: + """The cutover window: ledger-era history beside chronicle-era rows. + + Both must calibrate, and the manifest must say the feed straddled the + cutover rather than silently reporting one era. + """ + rows = [ + _fact_row(), + _chronicle_fact_row(), + # Microcosm-minted rows carry neither epoch and must not perturb it. + _fact_row( + aggregate_fact_key="populace_us_trade.aggregate_fact.v1:digest", + semantic_fact_key="populace_us_trade.semantic_fact.v1:digest", + lineage={"source_record_id": "us_trade.month_2025_01.national"}, + ), + ] + artifact_dir = _write_artifact_dir( + tmp_path, rows, schema_version=CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION + ) + + artifact = load_ledger_consumer_artifact(artifact_dir) + + assert artifact.fact_row_count == 3 + assert artifact.fact_key_epochs == EPOCHS + assert artifact.provenance()["fact_key_epochs"] == list(EPOCHS) + + +def test_bare_feed_has_no_schema_epoch_but_still_reports_fact_key_epochs( + tmp_path, +) -> None: + facts_path = tmp_path / "consumer_facts.jsonl" + facts_path.write_text( + "".join( + json.dumps(row, sort_keys=True) + "\n" + for row in (_fact_row(), _chronicle_fact_row()) + ) + ) + + artifact = load_ledger_consumer_artifact(facts_path) + + provenance = artifact.provenance() + assert provenance["schema_version"] is None + assert provenance["schema_epoch"] is None + assert provenance["fact_key_epochs"] == list(EPOCHS) + + +def test_unknown_schema_id_is_rejected_naming_both_accepted_eras(tmp_path) -> None: + artifact_dir = _write_artifact_dir( + tmp_path, [_fact_row()], schema_version="policyengine_chronicle.other.v9" + ) + + with pytest.raises(ValueError) as excinfo: + load_ledger_consumer_artifact(artifact_dir) + + message = str(excinfo.value) + assert "schema_version" in message + assert LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION in message + assert CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION in message + + +@pytest.mark.parametrize( + "row_schema_version", + [LEDGER_CONSUMER_FACT_SCHEMA_VERSION, CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION], +) +def test_per_row_schema_id_is_accepted_in_either_era( + tmp_path, row_schema_version: str +) -> None: + facts_path = tmp_path / "consumer_facts.jsonl" + facts_path.write_text( + json.dumps(_fact_row(schema_version=row_schema_version), sort_keys=True) + "\n" + ) + + artifact = load_ledger_consumer_artifact(facts_path) + + assert artifact.facts[0]["schema_version"] == row_schema_version + + +def test_per_row_schema_id_is_optional_but_validated_when_present(tmp_path) -> None: + # Chronicle-published rows have never carried one; demanding it would + # reject every real feed. + bare = tmp_path / "bare.jsonl" + bare.write_text(json.dumps(_fact_row(), sort_keys=True) + "\n") + assert "schema_version" not in load_ledger_consumer_artifact(bare).facts[0] + + wrong = tmp_path / "wrong.jsonl" + wrong.write_text( + json.dumps(_fact_row(schema_version="ledger.consumer_fact.v99"), sort_keys=True) + + "\n" + ) + with pytest.raises(ValueError, match="unsupported schema_version"): + load_ledger_consumer_artifact(wrong) diff --git a/packages/microcosm-build/tests/test_ledger_targets.py b/packages/microcosm-build/tests/test_ledger_targets.py index cd46e2cad..60e6e7837 100644 --- a/packages/microcosm-build/tests/test_ledger_targets.py +++ b/packages/microcosm-build/tests/test_ledger_targets.py @@ -2939,3 +2939,92 @@ def test_exact_period_contract_sum_keeps_equivalent_untyped_annual_range_cells() ).specs assert spec.value == 30.0 # Both synthetic cells belong to the same academic year. + + +def test__given_mixed_epoch_fact_feed__then_both_eras_compile_to_targets() -> None: + """Ledger-era and chronicle-era rows calibrate side by side. + + During Chronicle's rename cutover a feed carries history under + ``ledger.*`` domains beside newly emitted rows under ``chronicle.*`` + (PolicyEngine/chronicle#143). Keys are opaque to this compiler, so both + must select — and each target's name and metadata must carry its own + row's key verbatim rather than being normalised onto one epoch. + """ + # Given + ledger_era = _consumer_fact_row() + chronicle_era = _consumer_fact_row( + aggregate_fact_key="chronicle.aggregate_fact.v3:def456", + semantic_fact_key="chronicle.semantic_fact.v3:def456", + lineage={ + "source_record_id": "irs_soi.ty2024.table_1_1.all.adjusted_gross_income", + "source_cell_keys": ["chronicle.source_cell.v3:cell"], + "source_row_keys": [], + }, + ) + chronicle_era.pop("legacy_fact_key", None) + mapping = LedgerTargetMapping( + measure_by_concept={ + "us:statutes/26/62#adjusted_gross_income": "adjusted_gross_income" + }, + entity_by_ledger_entity={"tax_unit": "tax_unit"}, + filter_by_domain={"all_individual_income_tax_returns": "is_tax_return"}, + ) + + # When + selection = select_ledger_targets([ledger_era, chronicle_era], mapping) + + # Then + assert not selection.unsupported + assert [spec.name for spec in selection.specs] == [ + "ledger.aggregate_fact.v2:abc123", + "chronicle.aggregate_fact.v3:def456", + ] + chronicle_spec = selection.specs[1] + assert ( + chronicle_spec.metadata["ledger_fact_key"] + == "chronicle.aggregate_fact.v3:def456" + ) + # The diagnostic field names stay ledger-era: they are frozen at v1 + # (microcosm#639) and name a slot, not an epoch. + assert ( + chronicle_spec.metadata["ledger_aggregate_fact_key"] + == "chronicle.aggregate_fact.v3:def456" + ) + assert ( + chronicle_spec.metadata["ledger_semantic_fact_key"] + == "chronicle.semantic_fact.v3:def456" + ) + + +def test__given_chronicle_era_reference_pin__then_it_resolves_against_the_feed() -> ( + None +): + """A reference pinned to a chronicle-era key resolves without a code change.""" + # Given + reference = LedgerTargetReference( + name="nation/irs/adjusted gross income/total", + ledger_fact_key="chronicle.aggregate_fact.v3:def456", + entity="tax_unit", + measure="adjusted_gross_income", + filter="is_tax_return", + period=2024, + source="IRS SOI Table 1.1", + family="irs_soi", + ) + fact = _consumer_fact_row( + aggregate_fact_key="chronicle.aggregate_fact.v3:def456", + semantic_fact_key="chronicle.semantic_fact.v3:def456", + ) + fact.pop("legacy_fact_key", None) + + # When + registry = compile_ledger_target_references([fact], [reference], country="us") + + # Then + assert [spec.name for spec in registry.specs] == [ + "nation/irs/adjusted gross income/total" + ] + assert ( + registry.specs[0].metadata["ledger_fact_key"] + == "chronicle.aggregate_fact.v3:def456" + ) diff --git a/packages/microcosm-build/tests/test_us_congressional_district_vintage.py b/packages/microcosm-build/tests/test_us_congressional_district_vintage.py index 364b2fcfa..cd51eeb07 100644 --- a/packages/microcosm-build/tests/test_us_congressional_district_vintage.py +++ b/packages/microcosm-build/tests/test_us_congressional_district_vintage.py @@ -1,5 +1,7 @@ """US congressional-district geography-vintage translation tests.""" +import json + import pytest from microcosm.build.us_runtime import ( @@ -732,3 +734,161 @@ def _ledger_fact_for_reference(reference, *, value: float) -> dict[str, object]: "url": "https://example.org/reference", }, } + + +def _re_epoch_to_chronicle(fact: dict[str, object]) -> dict[str, object]: + """The same source fact as Chronicle emits it after the rename cutover. + + Identical canonical payload; ``ledger..v2`` domains replaced by + their ``chronicle..v3`` siblings (PolicyEngine/chronicle#143). + """ + chronicle = dict(fact) + for field, domain in ( + ("aggregate_fact_key", "chronicle.aggregate_fact.v3"), + ("semantic_fact_key", "chronicle.semantic_fact.v3"), + ): + value = chronicle.get(field) + if isinstance(value, str): + chronicle[field] = f"{domain}:{value.split(':', 1)[1]}" + chronicle.pop("legacy_fact_key", None) + return chronicle + + +def test__given_chronicle_era_source_rows__then_derived_cd_keys_are_unchanged() -> None: + """The Chronicle rename must not re-identify Microcosm-derived facts. + + Translated and proxy facts are minted into Microcosm's own + ``microcosm.derived_fact.*`` / ``microcosm.semantic_fact.*`` namespaces, + which sit outside both Chronicle eras and are frozen at v1 + (microcosm#639). Their digests are computed from the source row's + *semantic* identity, never from its key, so a feed that crosses the + cutover must mint byte-identical derived keys — otherwise every target + pinned to one would silently stop resolving on cutover day. + """ + ledger_era_facts = [ + _soi_cd_fact( + "adjusted_gross_income", + 100.0, + geography_id="5001700US0601", + source_row_id="ca_01", + ), + _soi_cd_fact( + "adjusted_gross_income", + 60.0, + geography_id="5001700US0653", + source_row_id="ca_53", + ), + ] + chronicle_era_facts = [_re_epoch_to_chronicle(fact) for fact in ledger_era_facts] + crosswalk = [ + { + "source_geography_id": "5001700US0601", + "target_geography_id": "5001900US0601", + "weight": 1.0, + }, + { + "source_geography_id": "5001700US0653", + "target_geography_id": "5001900US0602", + "weight": 1.0, + }, + ] + + def _translate(facts): + return translate_congressional_district_facts_to_current_vintage( + facts, crosswalk, crosswalk_basis="block_population" + ) + + from_ledger = _translate(ledger_era_facts) + from_chronicle = _translate(chronicle_era_facts) + + def _keys(translated): + return sorted( + ( + fact["geography"]["id"], + fact["aggregate_fact_key"], + fact["semantic_fact_key"], + ) + for fact in translated + ) + + assert _keys(from_chronicle) == _keys(from_ledger) + for fact in from_chronicle: + assert fact["aggregate_fact_key"].startswith( + "microcosm.derived_fact.congressional_district_vintage.v1:" + ) + assert fact["semantic_fact_key"].startswith( + "microcosm.semantic_fact.congressional_district_vintage.v1:" + ) + # The derived row carries neither epoch: it is Microcosm's fact now. + assert "legacy_fact_key" not in fact + + +def test__given_chronicle_era_state_rows__then_proxy_cd_keys_are_unchanged() -> None: + """The state-total-proxy mint is epoch-independent for the same reason. + + Its digest covers the source record id, the proxy district, and the + value — never the source row's Chronicle key — so a chronicle-era state + fact produces the same proxy identity a ledger-era one does. + """ + ledger_era_facts = [ + _soi_cd_fact( + "adjusted_gross_income", + 10.0, + geography_id="5001700US0601", + source_row_id="ca_01", + ), + _soi_state_fact( + "adjusted_gross_income", + 100.0, + geography_id="0400000US30", + source_row_id="mt_total", + ), + ] + chronicle_era_facts = [_re_epoch_to_chronicle(fact) for fact in ledger_era_facts] + crosswalk = [ + { + "source_geography_id": "5001700US0601", + "target_geography_id": "5001900US0601", + "weight": 1.0, + }, + { + "source_geography_id": "5001700US3000", + "target_geography_id": "5001900US3001", + "weight": 2.0, + }, + { + "source_geography_id": "5001700US3000", + "target_geography_id": "5001900US3002", + "weight": 3.0, + }, + ] + + def _translate(facts): + return translate_congressional_district_facts_to_current_vintage( + facts, crosswalk, crosswalk_basis="block_population" + ) + + def _derived_identity(translated): + # Passthrough rows keep their own Chronicle keys verbatim — that is the + # opaque-carriage rule. Only the Microcosm-minted rows are compared. + return sorted( + ( + fact["geography"]["id"], + fact["aggregate_fact_key"], + fact["semantic_fact_key"], + json.dumps(fact["lineage"], sort_keys=True), + ) + for fact in translated + if str(fact.get("aggregate_fact_key", "")).startswith("microcosm.") + ) + + from_chronicle = _derived_identity(_translate(chronicle_era_facts)) + + assert from_chronicle == _derived_identity(_translate(ledger_era_facts)) + # The proxy digest reaches the compared identity through the lineage: the + # proxy fact is minted, then translated, so its source_record_id (digest + # included) is what the derived row records. + assert any( + "congressional_district_state_total_proxy_source_record_id" in lineage + for _, _, _, lineage in from_chronicle + ) diff --git a/packages/microcosm-build/tests/test_us_trade_facts.py b/packages/microcosm-build/tests/test_us_trade_facts.py index f20d443f6..08ab5b100 100644 --- a/packages/microcosm-build/tests/test_us_trade_facts.py +++ b/packages/microcosm-build/tests/test_us_trade_facts.py @@ -7,6 +7,11 @@ import pandas as pd import pytest +from microcosm.build.chronicle_epoch import ( + CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, + LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, +) from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.ledger_targets import ( LedgerTargetReference, @@ -813,3 +818,69 @@ def test_cbp_and_district_facts_compile_into_ledger_targets(tmp_path): by_name = {spec.name: spec for spec in registry.specs} assert by_name["cbp_total_entry_summaries_fytd2026"].value == 83_133_856 assert by_name["district70_customs_value_2026_01"].value == 2_000_000 + + +def test_minted_artifact_declares_the_ledger_era_id_and_loads_under_either(tmp_path): + """Emission stays ledger-era; acceptance covers both (chronicle#143). + + These rows are minted from Census/CBP source bytes, not derived from a + Chronicle row whose epoch they could inherit, and their bytes are pinned, + so the declared id must not move on Chronicle's cutover. The declaration + is nonetheless an argument rather than a literal, checked against both + eras, so flipping it later is a caller decision. + """ + rows = build_import_entry_fact_rows( + _margins(), + retrieval_manifest=_manifest_entries(), + extracted_at="2026-08-05T00:00:00+00:00", + ) + + default_manifest = write_consumer_artifact( + tmp_path / "default", + rows, + retrieval_manifest=_manifest_entries(), + generator=default_generator_block(months=("2026-01", "2026-02")), + ) + assert default_manifest["schema_version"] == LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION + # Every row's key stays in Microcosm's own frozen namespace, outside both + # Chronicle eras, so the cutover cannot re-identify them (microcosm#639). + assert all( + row["aggregate_fact_key"].startswith("populace_us_trade.aggregate_fact.v1:") + for row in rows + ) + assert all( + row["schema_version"] == LEDGER_CONSUMER_FACT_SCHEMA_VERSION for row in rows + ) + + chronicle_manifest = write_consumer_artifact( + tmp_path / "chronicle", + rows, + retrieval_manifest=_manifest_entries(), + generator=default_generator_block(months=("2026-01", "2026-02")), + schema_version=CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, + ) + assert ( + chronicle_manifest["schema_version"] + == CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION + ) + # Only the declaration moved: the fact bytes are identical either way. + assert chronicle_manifest["facts_sha256"] == default_manifest["facts_sha256"] + + for directory, expected_epoch in ( + (tmp_path / "default", "ledger"), + (tmp_path / "chronicle", "chronicle"), + ): + artifact = load_ledger_consumer_artifact(directory) + assert artifact.fact_row_count == len(rows) + assert artifact.schema_epoch == expected_epoch + # Microcosm-minted keys belong to neither era, so nothing is claimed. + assert artifact.provenance()["fact_key_epochs"] == [] + + with pytest.raises(ValueError, match="Refusing to write a consumer artifact"): + write_consumer_artifact( + tmp_path / "bogus", + rows, + retrieval_manifest=_manifest_entries(), + generator=default_generator_block(months=("2026-01",)), + schema_version="policyengine_chronicle.consumer_artifact.v9", + ) From 0aff29b5e516e01a301dabb291f9ff71ef62c8e8 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:21:10 -0400 Subject: [PATCH 04/33] Carry per-row Chronicle schema ids instead of gating on them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dual acceptance must widen what loads and narrow nothing. The loader as committed added a per-row schema_version check that rejected any id outside the two chronicle#143 names — a validation main never performed, on a field main never read. Real feeds do not honor that set. The pinned US fiscal-refresh feed consumer_facts_buildn_v9_4.jsonl, which the release path loads through this loader, declares 'arch.consumer_fact.v1' on 37,006 of its first 200,000 rows and 'ledger.consumer_fact.v1' on 399 of them; test_uk_firm_generation builds the same arch-namespace rows. The check therefore failed the build closed on its own pinned input, and PR CI could not see it: the feed is gated data outside PR CI. Verified by loading an arch-namespace row through load_ledger_consumer_artifact — ValueError before, loads after. The id is now carried and reported through fact_schema_versions, which provenance records beside the artifact schema id and the fact-key epochs, so a release manifest still witnesses exactly which producers wrote its rows. Epoch witnessing was also reading only the four key fields targets resolve a fact by. Published rows carry nine, plus two key lists: the captured UK feed fixture has observed_measure_key, source_release_key, source_series_key, universe_constraint_set_key and lineage.source_row_keys as well. Chronicle moves families independently — the spec declares v3 only for the aggregate and semantic families — so a straddling row with a ledger-era aggregate key and a chronicle-era source-release key was witnessed as pure ledger-era. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/chronicle_epoch.py | 19 +++- .../src/microcosm/build/ledger_artifact.py | 52 +++++---- .../tests/test_chronicle_epoch.py | 102 ++++++++++++++++-- 3 files changed, 143 insertions(+), 30 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py index 0d9d82c67..0eb1eed0b 100644 --- a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py +++ b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py @@ -122,18 +122,31 @@ "concept_alignment": "ledger.concept_alignment.v2", } -#: Consumer-fact row fields that carry a single Chronicle key, in the order -#: :mod:`microcosm.build.ledger_targets` resolves them. +#: Consumer-fact row fields that carry a single Chronicle key. The first four +#: are the identifiers :mod:`microcosm.build.ledger_targets` resolves a fact +#: by; the rest are the remaining single-key fields published rows carry, all +#: of them observed on the captured feed in +#: ``tests/fixtures/uk_target_reference_feed_rows.jsonl``. The list is for +#: *witnessing* epochs, so it is deliberately wider than the resolution set: a +#: row whose aggregate key is still ledger-era but whose source-release key has +#: crossed the cutover must report both epochs, not one. FACT_KEY_FIELDS: tuple[str, ...] = ( "aggregate_fact_key", "semantic_fact_key", "fact_key", "legacy_fact_key", "dimension_set_key", + "observed_measure_key", + "source_release_key", + "source_series_key", + "universe_constraint_set_key", ) #: Row fields carrying a *list* of Chronicle keys. -_FACT_KEY_LIST_PATHS: tuple[tuple[str, ...], ...] = (("lineage", "source_cell_keys"),) +_FACT_KEY_LIST_PATHS: tuple[tuple[str, ...], ...] = ( + ("lineage", "source_cell_keys"), + ("lineage", "source_row_keys"), +) #: Nested single-key paths. _FACT_KEY_NESTED_PATHS: tuple[tuple[str, ...], ...] = ( diff --git a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py index 57457e65d..6a08f219a 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -17,9 +17,16 @@ equality with one era, so an artifact published after Chronicle's rename cutover loads here without a code change — see :mod:`microcosm.build.chronicle_epoch` and PolicyEngine/chronicle#143. The -observed id, its epoch, and the fact-key epochs present in the feed are all -recorded in :meth:`LedgerConsumerArtifact.provenance`, so a release manifest -witnesses which era it actually consumed rather than which era it assumed. +observed id, its epoch, the fact-key epochs present in the feed, and the +per-row schema ids the rows themselves declare are all recorded in +:meth:`LedgerConsumerArtifact.provenance`, so a release manifest witnesses +which era it actually consumed rather than which era it assumed. + +Acceptance widened here; nothing narrowed. Only the *manifest* schema id is +gated, and only against the two ids chronicle#143 declares. Row-level ids and +fact keys are carried as published — real feeds mint rows in namespaces that +belong to neither era, and a consumer that rejected them would fail closed on +data that has always loaded. """ from __future__ import annotations @@ -36,10 +43,8 @@ LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, consumer_artifact_schema_epoch, describe_accepted_consumer_artifact_schema_versions, - describe_accepted_consumer_fact_schema_versions, feed_fact_key_epochs, is_accepted_consumer_artifact_schema_version, - is_accepted_consumer_fact_schema_version, ) __all__ = [ @@ -111,6 +116,21 @@ def fact_key_epochs(self) -> tuple[str, ...]: """ return feed_fact_key_epochs(self.facts) + @property + def fact_schema_versions(self) -> tuple[str, ...]: + """Distinct per-row ``schema_version`` values in the feed, sorted. + + Reported verbatim and never gated on — see :func:`_load_fact_rows`. + Empty when no row declares one; more than one entry when a feed mixes + producers, which the pinned US fiscal-refresh feed already does. + """ + observed = { + str(row["schema_version"]) + for row in self.facts + if isinstance(row, dict) and row.get("schema_version") is not None + } + return tuple(sorted(observed)) + def provenance(self) -> dict[str, Any]: """Chronicle-artifact identity block for build and release manifests. @@ -140,6 +160,7 @@ def provenance(self) -> dict[str, Any]: payload["manifest_sha256"] = None payload["schema_epoch"] = self.schema_epoch payload["fact_key_epochs"] = list(self.fact_key_epochs) + payload["fact_schema_versions"] = list(self.fact_schema_versions) return payload @@ -286,19 +307,14 @@ def _load_fact_rows(path: Path) -> tuple[dict[str, Any], ...]: f"Invalid Chronicle facts JSONL row {line_number}: expected " f"object, got {type(row).__name__}." ) - # Chronicle-published rows have never carried a per-row schema id; - # only Microcosm-minted feeds stamp one. Validate it when it is - # there — against both eras — and never demand it when it is not. - row_schema_version = row.get("schema_version") - if row_schema_version is not None and ( - not is_accepted_consumer_fact_schema_version(row_schema_version) - ): - raise ValueError( - f"Chronicle facts JSONL row {line_number} declares " - f"unsupported schema_version {row_schema_version!r}; " - "expected one of " - f"{describe_accepted_consumer_fact_schema_versions()}." - ) + # A per-row ``schema_version`` is carried, never gated on. Real + # feeds stamp ids from namespaces that are neither era: the pinned + # US fiscal-refresh feed (consumer_facts_buildn_v9_4.jsonl) mixes + # 'arch.consumer_fact.v1' with 'ledger.consumer_fact.v1'. Rejecting + # an unrecognized id would fail the build closed on its own pinned + # input, and rejecting is not what dual acceptance asks for. The + # observed ids are reported through + # :attr:`LedgerConsumerArtifact.fact_schema_versions` instead. assertion = row.get("assertion", DEFAULT_LEDGER_ASSERTION) if assertion not in ALLOWED_LEDGER_ASSERTIONS: raise ValueError( diff --git a/packages/microcosm-build/tests/test_chronicle_epoch.py b/packages/microcosm-build/tests/test_chronicle_epoch.py index 915b44363..fd8532d5f 100644 --- a/packages/microcosm-build/tests/test_chronicle_epoch.py +++ b/packages/microcosm-build/tests/test_chronicle_epoch.py @@ -12,6 +12,7 @@ import hashlib import json +from pathlib import Path import pytest @@ -22,6 +23,7 @@ CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, CHRONICLE_EPOCH, EPOCHS, + FACT_KEY_FIELDS, LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_CONSUMER_FACT_SCHEMA_VERSION, LEDGER_EPOCH, @@ -328,17 +330,99 @@ def test_per_row_schema_id_is_accepted_in_either_era( assert artifact.facts[0]["schema_version"] == row_schema_version -def test_per_row_schema_id_is_optional_but_validated_when_present(tmp_path) -> None: - # Chronicle-published rows have never carried one; demanding it would - # reject every real feed. +def test_per_row_schema_id_is_optional(tmp_path) -> None: + # A row that declares no schema id must not acquire one: the loader + # reports what was published, and never fabricates the field. bare = tmp_path / "bare.jsonl" bare.write_text(json.dumps(_fact_row(), sort_keys=True) + "\n") assert "schema_version" not in load_ledger_consumer_artifact(bare).facts[0] - wrong = tmp_path / "wrong.jsonl" - wrong.write_text( - json.dumps(_fact_row(schema_version="ledger.consumer_fact.v99"), sort_keys=True) - + "\n" + +def test_per_row_schema_id_outside_both_eras_still_loads(tmp_path) -> None: + """Dual acceptance widens what loads; it must not narrow it. + + Real feeds stamp rows from namespaces that are neither era. The pinned US + fiscal-refresh feed ``consumer_facts_buildn_v9_4.jsonl`` declares + ``arch.consumer_fact.v1`` on the overwhelming majority of its rows and + ``ledger.consumer_fact.v1`` on the rest, and it loads through this loader + on the release path. A consumer that gated the per-row id against the two + ids chronicle#143 names would fail the build closed on its own pinned + input — so the id is carried and reported, never gated. + """ + facts_path = tmp_path / "consumer_facts.jsonl" + rows = [ + _fact_row(schema_version="arch.consumer_fact.v1"), + _fact_row(schema_version=LEDGER_CONSUMER_FACT_SCHEMA_VERSION), + _chronicle_fact_row(schema_version=CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION), + _fact_row(schema_version="ledger.consumer_fact.v99"), + ] + facts_path.write_text( + "".join(json.dumps(row, sort_keys=True) + "\n" for row in rows) ) - with pytest.raises(ValueError, match="unsupported schema_version"): - load_ledger_consumer_artifact(wrong) + + artifact = load_ledger_consumer_artifact(facts_path) + + assert artifact.fact_row_count == len(rows) + assert artifact.fact_schema_versions == ( + "arch.consumer_fact.v1", + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + "ledger.consumer_fact.v99", + ) + # The unrecognized ids are reported verbatim in provenance, so a release + # manifest still witnesses exactly what it consumed. + assert artifact.provenance()["fact_schema_versions"] == [ + "arch.consumer_fact.v1", + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + "ledger.consumer_fact.v99", + ] + + +def test_every_published_key_field_is_witnessed_for_its_epoch() -> None: + """Epoch witnessing covers every Chronicle key a published row carries. + + The captured feed fixture carries nine single-key fields and two key + lists, not just the four identifiers targets resolve by. Chronicle's + cutover moves families independently — the spec declares ``v3`` only for + the aggregate and semantic families — so a row can straddle it: ledger-era + aggregate key, chronicle-era source-release key. Reading only the + resolution set would report that row as pure ledger-era. + """ + for field in ( + "observed_measure_key", + "source_release_key", + "source_series_key", + "universe_constraint_set_key", + ): + straddling = _fact_row(**{field: f"chronicle.{field[:-4]}.v3:straddle"}) + + assert row_fact_key_epochs(straddling) == frozenset( + {LEDGER_EPOCH, CHRONICLE_EPOCH} + ), field + + row_keys = _fact_row() + row_keys["lineage"] = dict(row_keys["lineage"]) + row_keys["lineage"]["source_row_keys"] = ["chronicle.source_row.v3:row"] + + assert row_fact_key_epochs(row_keys) == frozenset({LEDGER_EPOCH, CHRONICLE_EPOCH}) + + +def test_witnessed_key_fields_match_the_captured_feed() -> None: + """The inventory is grounded in a real feed, not in a guess. + + Every ``*_key`` field the captured UK feed rows carry is either witnessed + for its epoch or is a plain source identifier rather than a Chronicle key. + """ + fixture = Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" + rows = [json.loads(line) for line in fixture.read_text().splitlines() if line] + assert rows + + for row in rows: + for field, value in row.items(): + if not field.endswith("_key") or not isinstance(value, str): + continue + assert field in FACT_KEY_FIELDS, field + assert is_chronicle_fact_key(value), (field, value) + + assert feed_fact_key_epochs(rows) == (LEDGER_EPOCH,) From cff65d9e038e65c4f3f377b757cc8013eab1f07e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:23:41 -0400 Subject: [PATCH 05/33] Ground the observed ledger-era domain map in the feed it claims to describe The map documented six families and said it recorded what this repo's feeds carry. The captured UK feed fixture carries ten, and the pinned US feed carries eleven: observed_measure, source_release, source_series, universe_constraint_set and source_row were all missing. Nothing consults the map at runtime, which is precisely how such a list rots, so a test now pins it to the fixture. The completed map also shows why detection cannot be a lookup in it: the observed version numbers differ by family, with fact and source_cell at v1 where the rest are at v2. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/chronicle_epoch.py | 17 +++++-- .../tests/test_chronicle_epoch.py | 50 ++++++++++++++++++- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py index 0eb1eed0b..c84dd31b0 100644 --- a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py +++ b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py @@ -110,16 +110,27 @@ ) #: Ledger-era fact-key domains, as *observed* in the feeds and fixtures this -#: repo carries. Recorded for documentation and for the frozen-history tests; -#: epoch detection does not consult it, so a family this list has never seen -#: still resolves to its epoch. +#: repo carries: every family in +#: ``tests/fixtures/uk_target_reference_feed_rows.jsonl``, plus +#: ``source_row``, which only the far larger pinned US feed exercises. The +#: version numbers are the observed ones and differ by family — ``fact`` and +#: ``source_cell`` are still v1 while the rest are v2 — which is why epoch +#: detection is structural and never a lookup here. Recorded for documentation +#: and for the frozen-history tests; a family this list has never seen still +#: resolves to its epoch. LEDGER_FACT_KEY_DOMAINS: Mapping[str, str] = { "aggregate_fact": "ledger.aggregate_fact.v2", "semantic_fact": "ledger.semantic_fact.v2", + # Carried by ``legacy_fact_key``, not by a ``fact_key`` field. "fact": "ledger.fact.v1", "source_cell": "ledger.source_cell.v1", + "source_row": "ledger.source_row.v1", "dimension_set": "ledger.dimension_set.v2", "concept_alignment": "ledger.concept_alignment.v2", + "observed_measure": "ledger.observed_measure.v2", + "source_release": "ledger.source_release.v2", + "source_series": "ledger.source_series.v2", + "universe_constraint_set": "ledger.universe_constraint_set.v2", } #: Consumer-fact row fields that carry a single Chronicle key. The first four diff --git a/packages/microcosm-build/tests/test_chronicle_epoch.py b/packages/microcosm-build/tests/test_chronicle_epoch.py index fd8532d5f..f7cdca835 100644 --- a/packages/microcosm-build/tests/test_chronicle_epoch.py +++ b/packages/microcosm-build/tests/test_chronicle_epoch.py @@ -12,6 +12,7 @@ import hashlib import json +import re from pathlib import Path import pytest @@ -77,6 +78,32 @@ def _chronicle_fact_row(**overrides): return row +#: The captured Chronicle feed this repo carries. Its rows are ledger-era and +#: frozen: they are the only published Chronicle rows available in-tree. +_CAPTURED_FEED = ( + Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" +) + + +def _captured_feed_rows() -> list[dict]: + return [ + json.loads(line) + for line in _CAPTURED_FEED.read_text().splitlines() + if line.strip() + ] + + +def _keys_in(value, _pattern=re.compile(r"^[a-z][a-z0-9_]*(?:\.[a-z0-9_]+)+\.v\d+:")): + """Every Chronicle-shaped key anywhere in a row, at any depth.""" + if isinstance(value, str): + return [value] if _pattern.match(value) else [] + if isinstance(value, dict): + return [key for item in value.values() for key in _keys_in(item)] + if isinstance(value, list): + return [key for item in value for key in _keys_in(item)] + return [] + + def _write_artifact_dir(tmp_path, rows, *, schema_version, name="artifact"): artifact_dir = tmp_path / name artifact_dir.mkdir() @@ -113,6 +140,26 @@ def test_every_observed_ledger_era_domain_resolves_to_the_ledger_epoch( assert fact_key_epoch(f"{domain}:digest") == LEDGER_EPOCH +def test_observed_domain_map_covers_the_captured_feed() -> None: + """The map documents what the repo has actually seen, not a guess. + + ``LEDGER_FACT_KEY_DOMAINS`` claims to record the ledger-era families this + repo's feeds carry, and nothing consults it at runtime — which is exactly + how such a list rots. This pins it to the captured feed. The version + numbers differ by family (``fact`` and ``source_cell`` are v1 where the + rest are v2), which is the concrete reason epoch detection cannot be a + lookup in this map. + """ + observed = { + key.split(":", 1)[0] for row in _captured_feed_rows() for key in _keys_in(row) + } + + assert observed + assert observed <= set(LEDGER_FACT_KEY_DOMAINS.values()), sorted( + observed - set(LEDGER_FACT_KEY_DOMAINS.values()) + ) + + def test_chronicle_era_keys_resolve_without_a_declared_version_number() -> None: """Epoch detection is structural, so undeclared families still resolve. @@ -414,8 +461,7 @@ def test_witnessed_key_fields_match_the_captured_feed() -> None: Every ``*_key`` field the captured UK feed rows carry is either witnessed for its epoch or is a plain source identifier rather than a Chronicle key. """ - fixture = Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" - rows = [json.loads(line) for line in fixture.read_text().splitlines() if line] + rows = _captured_feed_rows() assert rows for row in rows: From c2d58a97a8a0f28a830c9aff456f859592f6fcb3 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:24:23 -0400 Subject: [PATCH 06/33] Say in the changelog that only the manifest id is gated Co-Authored-By: Claude Fable 5.1 --- changelog.d/chronicle-dual-accept.added.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/chronicle-dual-accept.added.md b/changelog.d/chronicle-dual-accept.added.md index 472213d7e..09e181db6 100644 --- a/changelog.d/chronicle-dual-accept.added.md +++ b/changelog.d/chronicle-dual-accept.added.md @@ -1 +1 @@ -Accept chronicle-era Chronicle identities everywhere Microcosm consumes them: consumer-artifact manifests declaring `policyengine_chronicle.consumer_artifact.v2` and fact rows declaring `chronicle.consumer_fact.v2` load beside their ledger-era spellings, mixed-epoch feeds compile, and the loader records the observed schema id, its epoch, and the feed's fact-key epochs in provenance. Environment variables gain a `CHRONICLE_*` dual-read window with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. +Accept chronicle-era Chronicle identities everywhere Microcosm consumes them: consumer-artifact manifests declaring `policyengine_chronicle.consumer_artifact.v2` load beside `policyengine_ledger.consumer_artifact.v1`, mixed-epoch feeds compile, and the loader records the observed manifest schema id, its epoch, the fact-key epochs present in the feed, and the per-row schema ids the rows declare in provenance. Only the manifest id is gated: per-row schema ids and fact keys are carried as published, since real feeds mint rows in namespaces belonging to neither era. Environment variables gain a `CHRONICLE_*` dual-read window with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. From 4115573c853cddccf2d7d37088a897159cbd8e3f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:25:00 -0400 Subject: [PATCH 07/33] Record the regression and the arch-namespace question in the journal Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept.md | 60 +++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/PROGRESS-chronicle-dual-accept.md b/PROGRESS-chronicle-dual-accept.md index 118003a21..ee477892f 100644 --- a/PROGRESS-chronicle-dual-accept.md +++ b/PROGRESS-chronicle-dual-accept.md @@ -21,9 +21,13 @@ Frozen (microcosm#639): nothing on disk or in artifacts renames. Diagnostic field names (`ledger_aggregate_fact_key`, `ledger_commit`), H5 attrs, `populace_*` ids, fact keys, goldens and fixtures stay at v1. +**Acceptance widens; nothing narrows.** This is the rule the lane's own first +pass broke and the second pass restored — see "The regression that mattered". + ## State -Implementation and tests landed; verification run recorded in `out.md`. +Implementation and tests landed; verification run recorded in the PR body and +in the lane's report. PR #849, open, do not merge. ## Done @@ -34,10 +38,10 @@ Implementation and tests landed; verification run recorded in `out.md`. strings the spec names explicitly are pinned as literals. - `microcosm/build/chronicle_env.py` — the env dual-read window, one helper, one `DeprecationWarning` per process per legacy name. -- `ledger_artifact.py` — manifest `schema_version` is a membership test over - both eras; a per-row `schema_version` is validated when present (Chronicle - rows have never carried one) and never demanded; `provenance()` records the - observed id, `schema_epoch`, and `fact_key_epochs`. +- `ledger_artifact.py` — the manifest `schema_version` is a membership test + over both eras; per-row schema ids and fact keys are carried as published; + `provenance()` records the observed manifest id, `schema_epoch`, + `fact_key_epochs`, and `fact_schema_versions`. - `us_trade/import_entry_facts.py` — emission stays ledger-era (bytes are pinned; these rows are minted from Census/CBP bytes, so there is no source epoch to inherit), but the declared id is now an argument checked against @@ -50,17 +54,45 @@ Implementation and tests landed; verification run recorded in `out.md`. `test_us_congressional_district_vintage.py`, and dual-era emission and acceptance in `test_us_trade_facts.py`. +## The regression that mattered + +The lane's first pass added a per-row `schema_version` check to +`_load_fact_rows` that rejected any id outside the two chronicle#143 names — +validation `main` never performed, on a field `main` never read. Real feeds do +not honor that set. The pinned US fiscal-refresh feed +`consumer_facts_buildn_v9_4.jsonl`, which the release path loads through this +loader, declares `arch.consumer_fact.v1` on 37,006 of its first 200,000 rows +and `ledger.consumer_fact.v1` on 399. The check failed the build closed on its +own pinned input, and **PR CI could not see it**: the feed is gated data +outside PR CI. Reproduced directly, fixed, and pinned by a test. + +The same pass witnessed fact-key epochs from only the four fields targets +resolve a fact by. Published rows carry eleven key-bearing paths; the pinned +feed exercises all of them. A row straddling the cutover — ledger-era +aggregate key, chronicle-era source-release key — was reported as pure +ledger-era. The inventory is now complete and pinned to the captured feed +fixture. + ## Audit result -An 8-surface / 42-agent adversarial audit of every site that compares, -parses, or mints a Chronicle fact key or schema id found exactly three -hard-coded epoch literals in non-test source — `ledger_artifact.py:35`/`:126` -and `import_entry_facts.py:141`/`:142` — all handled here. `ledger_targets.py` -carries keys opaquely and contains no epoch literal at all; -`congressional_district_vintage.py` mints into Microcosm-owned namespaces that -sit outside both eras; the UK runtime is clean; no golden embeds a Chronicle -domain and no H5 attribute name embeds `ledger`. Every other candidate site -was refuted on verification. +Every site that compares, parses, or mints a Chronicle fact key or schema id +was inventoried. After this branch, no non-test source file hard-codes a +single epoch in a validator. `ledger_targets.py` carries keys opaquely and +contains no epoch literal at all; `congressional_district_vintage.py` and +`us_trade/import_entry_facts.py` mint into Microcosm-owned namespaces from +digest payloads that contain no Chronicle key, so a source row's epoch cannot +move a minted key; the UK runtime is clean; no golden embeds a Chronicle +domain and no H5 attribute name embeds `ledger`. `require_pins` does not exist +in this repo. + +## Open question for the Chronicle side + +The pinned feeds carry an `arch.*` key namespace alongside `ledger.*` — 37,006 +rows against 399 in `consumer_facts_buildn_v9_4.jsonl`, across all eleven +families. Microcosm treats those keys opaquely, so nothing here depends on +what `arch` is, and the epoch module reports it as outside both declared eras. +Whether chronicle#143's cutover is meant to re-epoch `arch.*` rows too is a +question for the Chronicle lane; this branch does not guess. ## Next From 061544e1f20ff8d0119439f363d4de5f467bab7e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:47:26 -0400 Subject: [PATCH 08/33] Rename the CHRONICLE_* env dual-read window to LOGBOOK_* POPULACE_LEDGER_URL/_KEY/_API_KEY/_EXPORT_KEY are Logbook store credentials (microcosm#632), not Chronicle fact-store ones. Naming the preferred spellings CHRONICLE_* would recreate the exact collision microcosm#632 renamed Ledger away from. Per PR #849 review: rename chronicle_env.py to logbook_env.py, its symbols to LOGBOOK_*/logbook_env*, and every caller (logbook.py, tools/logbook.py, build/__init__.py exports, and the two module-path comments in firm_generation.py/source_coverage.py that named the old module). Legacy POPULACE_LEDGER_* names and the once-per-process DeprecationWarning behavior are unchanged; the warning text now cites microcosm#632 instead of chronicle#143. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/__init__.py | 10 +- .../src/microcosm/build/logbook.py | 29 +++--- .../{chronicle_env.py => logbook_env.py} | 91 ++++++++--------- .../build/uk_runtime/firm_generation.py | 2 +- .../build/us_runtime/source_coverage.py | 2 +- ...t_chronicle_env.py => test_logbook_env.py} | 98 +++++++++---------- tools/logbook.py | 35 +++---- 7 files changed, 136 insertions(+), 131 deletions(-) rename packages/microcosm-build/src/microcosm/build/{chronicle_env.py => logbook_env.py} (58%) rename packages/microcosm-build/tests/{test_chronicle_env.py => test_logbook_env.py} (58%) diff --git a/packages/microcosm-build/src/microcosm/build/__init__.py b/packages/microcosm-build/src/microcosm/build/__init__.py index ea8dbdf72..431f2793f 100644 --- a/packages/microcosm-build/src/microcosm/build/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/__init__.py @@ -49,9 +49,9 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: _assert_frame_compatible(_frame_version, _REQUIRED_FRAME_SERIES) -from microcosm.build.chronicle_env import ( # noqa: E402 - after the compat gate - chronicle_env, - chronicle_env_names, +from microcosm.build.logbook_env import ( # noqa: E402 - after the compat gate + logbook_env, + logbook_env_names, ) from microcosm.build.chronicle_epoch import ( # noqa: E402 - after the compat gate ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, @@ -224,8 +224,8 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "MonetaryTargetProfile", "PreparedMonetaryMeasure", "add_ledger_artifact_args", - "chronicle_env", - "chronicle_env_names", + "logbook_env", + "logbook_env_names", "fact_key_epoch", "feed_fact_key_epochs", "is_chronicle_fact_key", diff --git a/packages/microcosm-build/src/microcosm/build/logbook.py b/packages/microcosm-build/src/microcosm/build/logbook.py index de7d404b4..6cfb75d12 100644 --- a/packages/microcosm-build/src/microcosm/build/logbook.py +++ b/packages/microcosm-build/src/microcosm/build/logbook.py @@ -7,15 +7,16 @@ a best-effort Supabase REST insert. Remote availability is never part of build correctness. If either -``CHRONICLE_URL`` or ``CHRONICLE_KEY`` is absent, the validated row stays in +``LOGBOOK_URL`` or ``LOGBOOK_KEY`` is absent, the validated row stays in spool-only mode without error. Network and HTTP failures are returned as receipt data and never raised. Local validation and durable-spool failures remain fatal: callers must not claim an attempt was recorded if its local row was invalid or could not be persisted. The ledger-era spellings (``POPULACE_LEDGER_URL``, ``POPULACE_LEDGER_KEY``, -``POPULACE_LEDGER_API_KEY``) are still honored for the chronicle#143 dual-read -window and warn once per process; see :mod:`microcosm.build.chronicle_env`. +``POPULACE_LEDGER_API_KEY``) are still honored for the Logbook dual-read +window (microcosm#632) and warn once per process; see +:mod:`microcosm.build.logbook_env`. The caller owns chain coordination and must provide ``prev_row_digest`` for the ledger head it extends. The row digest is @@ -32,7 +33,7 @@ The Supabase key must identify the migration's ``logbook_writer`` role, not the service role. Hosted Supabase projects should additionally provide the -project gateway key as ``CHRONICLE_API_KEY``; single-key deployments may +project gateway key as ``LOGBOOK_API_KEY``; single-key deployments may omit it. The ``logbook`` schema must also be enabled in the hosted project's PostgREST exposed-schema setting. The US stacked driver and the three UK drivers record through this seam; this module remains driver-agnostic. @@ -60,12 +61,12 @@ from urllib.parse import urlencode, urlsplit from urllib.request import HTTPRedirectHandler, Request, build_opener -from microcosm.build.chronicle_env import ( - CHRONICLE_API_KEY_ENV, - CHRONICLE_KEY_ENV, - CHRONICLE_URL_ENV, +from microcosm.build.logbook_env import ( LEGACY_API_KEY_ENV, - chronicle_env, + LOGBOOK_API_KEY_ENV, + LOGBOOK_KEY_ENV, + LOGBOOK_URL_ENV, + logbook_env, ) __all__ = [ @@ -105,8 +106,8 @@ LOGBOOK_RUNGS = frozenset({"f001", "f004", "f010", "f025", "f100"}) #: Ledger-era name for the project gateway key, kept because callers and #: operator runbooks still name it. Reads go through -#: :func:`microcosm.build.chronicle_env.chronicle_env`, which prefers -#: ``CHRONICLE_API_KEY`` and warns once when it falls back to this one. +#: :func:`microcosm.build.logbook_env.logbook_env`, which prefers +#: ``LOGBOOK_API_KEY`` and warns once when it falls back to this one. LEDGER_API_KEY_ENV = LEGACY_API_KEY_ENV LOGBOOK_ROW_FIELDS = frozenset( { @@ -836,11 +837,11 @@ def urlopen(request: Request, *, timeout: float) -> Any: def _remote_config() -> tuple[str, str, str] | None: - url = chronicle_env(CHRONICLE_URL_ENV) - key = chronicle_env(CHRONICLE_KEY_ENV) + url = logbook_env(LOGBOOK_URL_ENV) + key = logbook_env(LOGBOOK_KEY_ENV) if not url or not key: return None - api_key = chronicle_env(CHRONICLE_API_KEY_ENV) or key + api_key = logbook_env(LOGBOOK_API_KEY_ENV) or key return url, key, api_key diff --git a/packages/microcosm-build/src/microcosm/build/chronicle_env.py b/packages/microcosm-build/src/microcosm/build/logbook_env.py similarity index 58% rename from packages/microcosm-build/src/microcosm/build/chronicle_env.py rename to packages/microcosm-build/src/microcosm/build/logbook_env.py index 763032d4b..3536972b7 100644 --- a/packages/microcosm-build/src/microcosm/build/chronicle_env.py +++ b/packages/microcosm-build/src/microcosm/build/logbook_env.py @@ -1,13 +1,15 @@ -"""Dual-read for the Chronicle (formerly Ledger) environment variables. +"""Dual-read for the Logbook (formerly Ledger) environment variables. -PolicyEngine/chronicle#143 gives the operational stores — buckets, database -schema, role ids, and env names — a **dual-read window**: ``CHRONICLE_*`` is +Logbook is the build ledger's own name (microcosm#632), chosen precisely to +stop colliding with Chronicle, the fact store this package also consumes. +This module gives the Logbook store's credentials — buckets, database +schema, role ids, and env names — a **dual-read window**: ``LOGBOOK_*`` is preferred, the legacy name is still honored, and honoring it emits a deprecation warning so publish flows and build scripts migrate on their own schedule. This module is that window, in one place. -Every variable here is read through :func:`chronicle_env`, which tries the -preferred ``CHRONICLE_*`` name first and falls back to the legacy name, +Every variable here is read through :func:`logbook_env`, which tries the +preferred ``LOGBOOK_*`` name first and falls back to the legacy name, warning once per process per legacy name. Nothing is renamed on disk: the legacy names keep working for as long as the window is open, and the legacy name constants stay exported so error messages and tests can still name them. @@ -16,8 +18,10 @@ ``LEDGER_ONS_TURNOVER_BANDS``, ``LEDGER_ONS_EMPLOYMENT_BANDS``, and ``LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT`` look like environment variables to a grep but are plain Python module constants (band maps and a git commit -pin). They get chronicle-named *aliases* beside their modules rather than a -dual-read, because there is no environment to read them from. +pin). They translate Chronicle identities and get Chronicle-named *aliases* +beside their modules rather than a dual-read, because there is no +environment to read them from and they have nothing to do with the Logbook +store this module covers. """ from __future__ import annotations @@ -28,26 +32,26 @@ from collections.abc import Mapping __all__ = [ - "CHRONICLE_API_KEY_ENV", - "CHRONICLE_ENV_LEGACY_NAMES", - "CHRONICLE_EXPORT_KEY_ENV", - "CHRONICLE_KEY_ENV", - "CHRONICLE_URL_ENV", "LEGACY_API_KEY_ENV", "LEGACY_EXPORT_KEY_ENV", "LEGACY_KEY_ENV", "LEGACY_URL_ENV", - "chronicle_env", - "chronicle_env_names", - "describe_chronicle_env", - "reset_chronicle_env_deprecation_warnings", + "LOGBOOK_API_KEY_ENV", + "LOGBOOK_ENV_LEGACY_NAMES", + "LOGBOOK_EXPORT_KEY_ENV", + "LOGBOOK_KEY_ENV", + "LOGBOOK_URL_ENV", + "describe_logbook_env", + "logbook_env", + "logbook_env_names", + "reset_logbook_env_deprecation_warnings", ] -#: Preferred, chronicle-era names. -CHRONICLE_URL_ENV = "CHRONICLE_URL" -CHRONICLE_KEY_ENV = "CHRONICLE_KEY" -CHRONICLE_API_KEY_ENV = "CHRONICLE_API_KEY" -CHRONICLE_EXPORT_KEY_ENV = "CHRONICLE_EXPORT_KEY" +#: Preferred, Logbook-named names. +LOGBOOK_URL_ENV = "LOGBOOK_URL" +LOGBOOK_KEY_ENV = "LOGBOOK_KEY" +LOGBOOK_API_KEY_ENV = "LOGBOOK_API_KEY" +LOGBOOK_EXPORT_KEY_ENV = "LOGBOOK_EXPORT_KEY" #: Legacy, ledger-era names. Still honored; still named in error messages so #: an operator running the old environment recognises what is being asked for. @@ -58,26 +62,26 @@ #: Preferred name -> legacy names, most recent legacy spelling first. Adding a #: variable to the dual-read window means adding a row here and nothing else. -CHRONICLE_ENV_LEGACY_NAMES: Mapping[str, tuple[str, ...]] = { - CHRONICLE_URL_ENV: (LEGACY_URL_ENV,), - CHRONICLE_KEY_ENV: (LEGACY_KEY_ENV,), - CHRONICLE_API_KEY_ENV: (LEGACY_API_KEY_ENV,), - CHRONICLE_EXPORT_KEY_ENV: (LEGACY_EXPORT_KEY_ENV,), +LOGBOOK_ENV_LEGACY_NAMES: Mapping[str, tuple[str, ...]] = { + LOGBOOK_URL_ENV: (LEGACY_URL_ENV,), + LOGBOOK_KEY_ENV: (LEGACY_KEY_ENV,), + LOGBOOK_API_KEY_ENV: (LEGACY_API_KEY_ENV,), + LOGBOOK_EXPORT_KEY_ENV: (LEGACY_EXPORT_KEY_ENV,), } _WARNED_LEGACY_NAMES: set[str] = set() _WARNED_LOCK = threading.Lock() -def chronicle_env( +def logbook_env( name: str, default: str | None = None, *, environ: Mapping[str, str] | None = None, ) -> str | None: - """Read one Chronicle variable, preferring ``name`` over its legacy spelling. + """Read one Logbook variable, preferring ``name`` over its legacy spelling. - ``name`` is the preferred ``CHRONICLE_*`` name. When it is unset but a + ``name`` is the preferred ``LOGBOOK_*`` name. When it is unset but a legacy name carries a value, that value is returned and a :class:`DeprecationWarning` is emitted **once per process per legacy name** — repeated reads in a build loop must not turn into a warning @@ -85,15 +89,15 @@ def chronicle_env( already test these variables. """ source = os.environ if environ is None else environ - if name not in CHRONICLE_ENV_LEGACY_NAMES: + if name not in LOGBOOK_ENV_LEGACY_NAMES: raise KeyError( - f"{name!r} is not a Chronicle environment variable; expected one of " - f"{sorted(CHRONICLE_ENV_LEGACY_NAMES)}." + f"{name!r} is not a Logbook environment variable; expected one of " + f"{sorted(LOGBOOK_ENV_LEGACY_NAMES)}." ) value = source.get(name) if value: return value - for legacy_name in CHRONICLE_ENV_LEGACY_NAMES[name]: + for legacy_name in LOGBOOK_ENV_LEGACY_NAMES[name]: legacy_value = source.get(legacy_name) if legacy_value: _warn_once(legacy_name, preferred=name) @@ -101,17 +105,17 @@ def chronicle_env( return default -def chronicle_env_names(name: str) -> tuple[str, ...]: +def logbook_env_names(name: str) -> tuple[str, ...]: """The preferred name followed by every legacy name still honored.""" - if name not in CHRONICLE_ENV_LEGACY_NAMES: + if name not in LOGBOOK_ENV_LEGACY_NAMES: raise KeyError( - f"{name!r} is not a Chronicle environment variable; expected one of " - f"{sorted(CHRONICLE_ENV_LEGACY_NAMES)}." + f"{name!r} is not a Logbook environment variable; expected one of " + f"{sorted(LOGBOOK_ENV_LEGACY_NAMES)}." ) - return (name, *CHRONICLE_ENV_LEGACY_NAMES[name]) + return (name, *LOGBOOK_ENV_LEGACY_NAMES[name]) -def describe_chronicle_env(*names: str) -> str: +def describe_logbook_env(*names: str) -> str: """Render required variables for an error message, legacy names included. Error text names both spellings on purpose: an operator whose environment @@ -122,12 +126,12 @@ def describe_chronicle_env(*names: str) -> str: legacy = ", ".join( legacy_name for name in names - for legacy_name in CHRONICLE_ENV_LEGACY_NAMES[name] + for legacy_name in LOGBOOK_ENV_LEGACY_NAMES[name] ) return f"{preferred} (legacy {legacy} still honored)" -def reset_chronicle_env_deprecation_warnings() -> None: +def reset_logbook_env_deprecation_warnings() -> None: """Forget which legacy names have warned. For tests only.""" with _WARNED_LOCK: _WARNED_LEGACY_NAMES.clear() @@ -139,9 +143,8 @@ def _warn_once(legacy_name: str, *, preferred: str) -> None: return _WARNED_LEGACY_NAMES.add(legacy_name) warnings.warn( - f"{legacy_name} is the ledger-era name for {preferred} and is " - "deprecated; PolicyEngine Ledger is now Chronicle " - "(PolicyEngine/chronicle#143). Set " + f"{legacy_name} is the pre-rename name for {preferred}; the build " + "ledger is now Logbook (microcosm#632). Set " f"{preferred} instead — {legacy_name} stays honored only for the " "dual-read window.", DeprecationWarning, diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py index 9867276a1..7df3399c8 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py @@ -162,7 +162,7 @@ class UKFirmLedgerTargetProfile: # Chronicle-era spellings of the three band maps above. These identifiers only # look like environment variables to a grep — they are plain support-layout # data, so they take aliases rather than the dual-read window in -# :mod:`microcosm.build.chronicle_env`. The ledger-era names stay: they are what +# :mod:`microcosm.build.logbook_env`. The ledger-era names stay: they are what # the generator below imports, and the value ids they translate are published # Chronicle ids, unaffected by the rename. CHRONICLE_ONS_TURNOVER_BANDS = LEDGER_ONS_TURNOVER_BANDS diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py b/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py index ab0bfea06..d37e3878e 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py @@ -35,7 +35,7 @@ #: Chronicle-era spelling of the same pin. This identifier only *looks* like an #: environment variable to a grep — it is a git commit of the source-coverage #: contract, so it takes an alias rather than the dual-read window in -#: :mod:`microcosm.build.chronicle_env`. The ledger-era name stays exported: it +#: :mod:`microcosm.build.logbook_env`. The ledger-era name stays exported: it #: is what callers import, and the ``ledger_commit`` diagnostic field it feeds #: is frozen at v1 (microcosm#639). CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT = LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT diff --git a/packages/microcosm-build/tests/test_chronicle_env.py b/packages/microcosm-build/tests/test_logbook_env.py similarity index 58% rename from packages/microcosm-build/tests/test_chronicle_env.py rename to packages/microcosm-build/tests/test_logbook_env.py index 76697a4b2..b06205773 100644 --- a/packages/microcosm-build/tests/test_chronicle_env.py +++ b/packages/microcosm-build/tests/test_logbook_env.py @@ -1,10 +1,10 @@ -"""The CHRONICLE_* / POPULACE_LEDGER_* environment dual-read window. +"""The LOGBOOK_* / POPULACE_LEDGER_* environment dual-read window. -chronicle#143 gives the operational stores a dual-read window so publish -flows and build scripts migrate on their own schedule: ``CHRONICLE_*`` is -preferred, the ledger-era name is still honored, and honoring it warns once -per process. These tests hold both halves — the fallback keeps working, and -the warning stays a single line rather than one per read in a build loop. +Logbook (microcosm#632) gives its operational store a dual-read window so +publish flows and build scripts migrate on their own schedule: ``LOGBOOK_*`` +is preferred, the ledger-era name is still honored, and honoring it warns +once per process. These tests hold both halves — the fallback keeps working, +and the warning stays a single line rather than one per read in a build loop. """ from __future__ import annotations @@ -13,28 +13,28 @@ import pytest -from microcosm.build.chronicle_env import ( - CHRONICLE_API_KEY_ENV, - CHRONICLE_ENV_LEGACY_NAMES, - CHRONICLE_EXPORT_KEY_ENV, - CHRONICLE_KEY_ENV, - CHRONICLE_URL_ENV, +from microcosm.build.logbook import _remote_config +from microcosm.build.logbook_env import ( LEGACY_API_KEY_ENV, LEGACY_EXPORT_KEY_ENV, LEGACY_KEY_ENV, LEGACY_URL_ENV, - chronicle_env, - chronicle_env_names, - describe_chronicle_env, - reset_chronicle_env_deprecation_warnings, + LOGBOOK_API_KEY_ENV, + LOGBOOK_ENV_LEGACY_NAMES, + LOGBOOK_EXPORT_KEY_ENV, + LOGBOOK_KEY_ENV, + LOGBOOK_URL_ENV, + describe_logbook_env, + logbook_env, + logbook_env_names, + reset_logbook_env_deprecation_warnings, ) -from microcosm.build.logbook import _remote_config PAIRS = ( - (CHRONICLE_URL_ENV, LEGACY_URL_ENV), - (CHRONICLE_KEY_ENV, LEGACY_KEY_ENV), - (CHRONICLE_API_KEY_ENV, LEGACY_API_KEY_ENV), - (CHRONICLE_EXPORT_KEY_ENV, LEGACY_EXPORT_KEY_ENV), + (LOGBOOK_URL_ENV, LEGACY_URL_ENV), + (LOGBOOK_KEY_ENV, LEGACY_KEY_ENV), + (LOGBOOK_API_KEY_ENV, LEGACY_API_KEY_ENV), + (LOGBOOK_EXPORT_KEY_ENV, LEGACY_EXPORT_KEY_ENV), ) @@ -43,21 +43,21 @@ def _clean_env(monkeypatch): for preferred, legacy in PAIRS: monkeypatch.delenv(preferred, raising=False) monkeypatch.delenv(legacy, raising=False) - reset_chronicle_env_deprecation_warnings() + reset_logbook_env_deprecation_warnings() yield - reset_chronicle_env_deprecation_warnings() + reset_logbook_env_deprecation_warnings() @pytest.mark.parametrize(("preferred", "legacy"), PAIRS) def test_preferred_name_wins_and_warns_about_nothing( monkeypatch, preferred: str, legacy: str ) -> None: - monkeypatch.setenv(preferred, "chronicle-value") + monkeypatch.setenv(preferred, "logbook-value") monkeypatch.setenv(legacy, "ledger-value") with warnings.catch_warnings(): warnings.simplefilter("error", DeprecationWarning) - assert chronicle_env(preferred) == "chronicle-value" + assert logbook_env(preferred) == "logbook-value" @pytest.mark.parametrize(("preferred", "legacy"), PAIRS) @@ -67,12 +67,12 @@ def test_legacy_name_is_honored_with_a_deprecation_warning( monkeypatch.setenv(legacy, "ledger-value") with pytest.warns(DeprecationWarning) as record: - assert chronicle_env(preferred) == "ledger-value" + assert logbook_env(preferred) == "ledger-value" message = str(record[0].message) assert legacy in message assert preferred in message - assert "chronicle#143" in message + assert "microcosm#632" in message def test_the_deprecation_warning_fires_once_per_process(monkeypatch) -> None: @@ -82,7 +82,7 @@ def test_the_deprecation_warning_fires_once_per_process(monkeypatch) -> None: with warnings.catch_warnings(record=True) as caught: warnings.simplefilter("always") for _ in range(5): - assert chronicle_env(CHRONICLE_URL_ENV) == "https://ledger.example" + assert logbook_env(LOGBOOK_URL_ENV) == "https://ledger.example" assert [ w for w in caught if issubclass(w.category, DeprecationWarning) @@ -95,8 +95,8 @@ def test_each_legacy_name_warns_on_its_own(monkeypatch) -> None: with warnings.catch_warnings(record=True) as caught: warnings.simplefilter("always") - chronicle_env(CHRONICLE_URL_ENV) - chronicle_env(CHRONICLE_KEY_ENV) + logbook_env(LOGBOOK_URL_ENV) + logbook_env(LOGBOOK_KEY_ENV) warned = { legacy @@ -107,39 +107,39 @@ def test_each_legacy_name_warns_on_its_own(monkeypatch) -> None: def test_unset_returns_the_default_and_empty_counts_as_unset(monkeypatch) -> None: - assert chronicle_env(CHRONICLE_URL_ENV) is None - assert chronicle_env(CHRONICLE_URL_ENV, "fallback") == "fallback" + assert logbook_env(LOGBOOK_URL_ENV) is None + assert logbook_env(LOGBOOK_URL_ENV, "fallback") == "fallback" - monkeypatch.setenv(CHRONICLE_URL_ENV, "") + monkeypatch.setenv(LOGBOOK_URL_ENV, "") monkeypatch.setenv(LEGACY_URL_ENV, "https://ledger.example") with pytest.warns(DeprecationWarning): - assert chronicle_env(CHRONICLE_URL_ENV) == "https://ledger.example" + assert logbook_env(LOGBOOK_URL_ENV) == "https://ledger.example" def test_an_explicit_environ_mapping_bypasses_the_process_environment() -> None: with pytest.warns(DeprecationWarning): assert ( - chronicle_env(CHRONICLE_KEY_ENV, environ={LEGACY_KEY_ENV: "writer-jwt"}) + logbook_env(LOGBOOK_KEY_ENV, environ={LEGACY_KEY_ENV: "writer-jwt"}) == "writer-jwt" ) def test_a_name_outside_the_window_is_a_programming_error() -> None: - with pytest.raises(KeyError, match="not a Chronicle environment variable"): - chronicle_env("CHRONICLE_NOT_A_REAL_VARIABLE") - with pytest.raises(KeyError, match="not a Chronicle environment variable"): - chronicle_env_names(LEGACY_URL_ENV) + with pytest.raises(KeyError, match="not a Logbook environment variable"): + logbook_env("LOGBOOK_NOT_A_REAL_VARIABLE") + with pytest.raises(KeyError, match="not a Logbook environment variable"): + logbook_env_names(LEGACY_URL_ENV) def test_names_and_descriptions_carry_both_spellings() -> None: - assert chronicle_env_names(CHRONICLE_URL_ENV) == (CHRONICLE_URL_ENV, LEGACY_URL_ENV) + assert logbook_env_names(LOGBOOK_URL_ENV) == (LOGBOOK_URL_ENV, LEGACY_URL_ENV) - described = describe_chronicle_env(CHRONICLE_URL_ENV, CHRONICLE_EXPORT_KEY_ENV) + described = describe_logbook_env(LOGBOOK_URL_ENV, LOGBOOK_EXPORT_KEY_ENV) # An operator whose environment predates the rename must still be able to # match the error text against what they have set. for name in ( - CHRONICLE_URL_ENV, - CHRONICLE_EXPORT_KEY_ENV, + LOGBOOK_URL_ENV, + LOGBOOK_EXPORT_KEY_ENV, LEGACY_URL_ENV, LEGACY_EXPORT_KEY_ENV, ): @@ -147,7 +147,7 @@ def test_names_and_descriptions_carry_both_spellings() -> None: def test_every_windowed_variable_maps_to_exactly_one_legacy_name() -> None: - assert dict(CHRONICLE_ENV_LEGACY_NAMES) == { + assert dict(LOGBOOK_ENV_LEGACY_NAMES) == { preferred: (legacy,) for preferred, legacy in PAIRS } @@ -164,13 +164,13 @@ def test_logbook_remote_config_reads_both_eras(monkeypatch) -> None: "writer-jwt", ) - monkeypatch.setenv(CHRONICLE_URL_ENV, "https://chronicle.example") - monkeypatch.setenv(CHRONICLE_KEY_ENV, "chronicle-jwt") - monkeypatch.setenv(CHRONICLE_API_KEY_ENV, "project-api-key") + monkeypatch.setenv(LOGBOOK_URL_ENV, "https://logbook.example") + monkeypatch.setenv(LOGBOOK_KEY_ENV, "logbook-jwt") + monkeypatch.setenv(LOGBOOK_API_KEY_ENV, "project-api-key") with warnings.catch_warnings(): warnings.simplefilter("error", DeprecationWarning) assert _remote_config() == ( - "https://chronicle.example", - "chronicle-jwt", + "https://logbook.example", + "logbook-jwt", "project-api-key", ) diff --git a/tools/logbook.py b/tools/logbook.py index afea050ef..ed7dd72a5 100644 --- a/tools/logbook.py +++ b/tools/logbook.py @@ -7,11 +7,11 @@ archive or a directory of them, reporting chain by chain. Remote export uses a distinct, read-only ``logbook_exporter`` JWT supplied -as ``CHRONICLE_EXPORT_KEY`` plus the hosted project's gateway key in -``CHRONICLE_API_KEY``. It never reuses the insert-only writer key. The +as ``LOGBOOK_EXPORT_KEY`` plus the hosted project's gateway key in +``LOGBOOK_API_KEY``. It never reuses the insert-only writer key. The ledger-era spellings (``POPULACE_LEDGER_EXPORT_KEY``, ``POPULACE_LEDGER_API_KEY``, ``POPULACE_LEDGER_URL``) stay honored for the -chronicle#143 dual-read window and warn once per process. +Logbook dual-read window (microcosm#632) and warn once per process. The live store is row-oriented and carries every attempt across all scopes; the per-scope split is an archive convention, not a database partition. """ @@ -27,14 +27,14 @@ from urllib.parse import urlencode from urllib.request import Request -from microcosm.build.chronicle_env import ( - CHRONICLE_API_KEY_ENV, - CHRONICLE_EXPORT_KEY_ENV, - CHRONICLE_URL_ENV, +from microcosm.build.logbook_env import ( LEGACY_API_KEY_ENV, LEGACY_EXPORT_KEY_ENV, - chronicle_env, - describe_chronicle_env, + LOGBOOK_API_KEY_ENV, + LOGBOOK_EXPORT_KEY_ENV, + LOGBOOK_URL_ENV, + describe_logbook_env, + logbook_env, ) from microcosm.build.logbook import ( LOGBOOK_ROW_FIELDS, @@ -57,9 +57,10 @@ #: chain is born, and country is the outermost one. DEFAULT_ARCHIVE_ROOT = ROOT / "logbook" DEFAULT_SPOOL_ROOT = ROOT / "logbook-spool" -#: Ledger-era names, still honored through the chronicle#143 dual-read window. -#: Reads go through :func:`microcosm.build.chronicle_env.chronicle_env`, which -#: prefers ``CHRONICLE_EXPORT_KEY`` / ``CHRONICLE_API_KEY``. +#: Ledger-era names, still honored through the Logbook dual-read window +#: (microcosm#632). Reads go through +#: :func:`microcosm.build.logbook_env.logbook_env`, which prefers +#: ``LOGBOOK_EXPORT_KEY`` / ``LOGBOOK_API_KEY``. REMOTE_EXPORT_KEY_ENV = LEGACY_EXPORT_KEY_ENV REMOTE_API_KEY_ENV = LEGACY_API_KEY_ENV REMOTE_PAGE_SIZE = 500 @@ -257,14 +258,14 @@ def _archive_scope(archive: Path) -> str: def _remote_rows(scope: str) -> tuple[LogbookRow, ...]: - ledger_url = chronicle_env(CHRONICLE_URL_ENV) - export_key = chronicle_env(CHRONICLE_EXPORT_KEY_ENV) - api_key = chronicle_env(CHRONICLE_API_KEY_ENV) + ledger_url = logbook_env(LOGBOOK_URL_ENV) + export_key = logbook_env(LOGBOOK_EXPORT_KEY_ENV) + api_key = logbook_env(LOGBOOK_API_KEY_ENV) if not ledger_url or not export_key or not api_key: raise ValueError( "remote export requires " - + describe_chronicle_env( - CHRONICLE_URL_ENV, CHRONICLE_EXPORT_KEY_ENV, CHRONICLE_API_KEY_ENV + + describe_logbook_env( + LOGBOOK_URL_ENV, LOGBOOK_EXPORT_KEY_ENV, LOGBOOK_API_KEY_ENV ) ) From ee73a62495944416d3ee823655c80c899e5df842 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 11:48:06 -0400 Subject: [PATCH 09/33] Reframe the env dual-read window as a Logbook cleanup, not chronicle#143 The changelog fragment, logbook/README.md, and the branch journal all described CHRONICLE_URL/CHRONICLE_KEY and the env dual-read window as part of the chronicle#143 epoch migration. It is a separate Logbook naming cleanup (microcosm#632) riding along on this branch: split the changelog sentence into its own paragraph, update the README's live-store section to LOGBOOK_URL/LOGBOOK_KEY, and append a dated correction note to the journal recording why and what changed. Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept.md | 29 ++++++++++++++++++++++ changelog.d/chronicle-dual-accept.added.md | 4 ++- logbook/README.md | 4 +-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/PROGRESS-chronicle-dual-accept.md b/PROGRESS-chronicle-dual-accept.md index ee477892f..409a159a4 100644 --- a/PROGRESS-chronicle-dual-accept.md +++ b/PROGRESS-chronicle-dual-accept.md @@ -98,3 +98,32 @@ question for the Chronicle lane; this branch does not guess. Nothing outstanding on this branch. Chronicle's own acceptance half lands in the parallel lane; the emit flip is a separate, later cutover. + +## Correction (2026-09-02): the env half was misnamed + +PR #849 review (Fable, main) caught that `POPULACE_LEDGER_URL` / +`_KEY` / `_API_KEY` / `_EXPORT_KEY` are **Logbook** store credentials +(Supabase `logbook` schema, `logbook_writer` / `logbook_exporter` roles — +see `logbook.py`'s docstring and `logbook/README.md`), not Chronicle fact- +store ones. "Ledger" there was the generic build-ledger sense renamed to +Logbook on 2026-08-08 (microcosm#632) specifically to stop colliding with +Chronicle. Naming the preferred spellings `CHRONICLE_*` would have recreated +that exact collision. + +The epoch half above (`chronicle_epoch.py`, `ledger_artifact.py`, +`import_entry_facts.py`, `ledger_targets.py`) is unaffected and was approved +as-is. The env half only: `chronicle_env.py` renamed to `logbook_env.py`, +`CHRONICLE_*_ENV`/`chronicle_env`/`chronicle_env_names`/ +`describe_chronicle_env`/`reset_chronicle_env_deprecation_warnings` renamed +to `LOGBOOK_*_ENV`/`logbook_env`/`logbook_env_names`/`describe_logbook_env`/ +`reset_logbook_env_deprecation_warnings`, and every caller (`logbook.py`, +`tools/logbook.py`, `build/__init__.py` exports, `logbook/README.md`, the +changelog fragment, this file, and the module-path comments in +`firm_generation.py`/`source_coverage.py`) updated to match. The +`POPULACE_LEDGER_*` legacy names and the once-per-process +`DeprecationWarning` behavior are unchanged; the warning text now cites +microcosm#632 instead of chronicle#143, since this window is a Logbook +naming cleanup riding along on this branch, not part of the chronicle#143 +epoch migration. `CHRONICLE_*_BANDS` and +`CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT` are untouched — those really +do translate Chronicle ids and pin a Chronicle commit. diff --git a/changelog.d/chronicle-dual-accept.added.md b/changelog.d/chronicle-dual-accept.added.md index 09e181db6..2f388d91b 100644 --- a/changelog.d/chronicle-dual-accept.added.md +++ b/changelog.d/chronicle-dual-accept.added.md @@ -1 +1,3 @@ -Accept chronicle-era Chronicle identities everywhere Microcosm consumes them: consumer-artifact manifests declaring `policyengine_chronicle.consumer_artifact.v2` load beside `policyengine_ledger.consumer_artifact.v1`, mixed-epoch feeds compile, and the loader records the observed manifest schema id, its epoch, the fact-key epochs present in the feed, and the per-row schema ids the rows declare in provenance. Only the manifest id is gated: per-row schema ids and fact keys are carried as published, since real feeds mint rows in namespaces belonging to neither era. Environment variables gain a `CHRONICLE_*` dual-read window with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. +Accept chronicle-era Chronicle identities everywhere Microcosm consumes them: consumer-artifact manifests declaring `policyengine_chronicle.consumer_artifact.v2` load beside `policyengine_ledger.consumer_artifact.v1`, mixed-epoch feeds compile, and the loader records the observed manifest schema id, its epoch, the fact-key epochs present in the feed, and the per-row schema ids the rows declare in provenance. Only the manifest id is gated: per-row schema ids and fact keys are carried as published, since real feeds mint rows in namespaces belonging to neither era. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. + +Separately, a Logbook naming cleanup (microcosm#632): the build ledger's environment variables gain a `LOGBOOK_*` dual-read window with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning. These are the Logbook store's own credentials, unrelated to the Chronicle fact store above. diff --git a/logbook/README.md b/logbook/README.md index 47f43e6fa..81dc42fdd 100644 --- a/logbook/README.md +++ b/logbook/README.md @@ -90,10 +90,10 @@ for `published` and `certified` rows. ## The live store -The best-effort Supabase insert (`CHRONICLE_URL` + `CHRONICLE_KEY`, the +The best-effort Supabase insert (`LOGBOOK_URL` + `LOGBOOK_KEY`, the migration's insert-only `logbook_writer` role; the ledger-era `POPULACE_LEDGER_URL` / `POPULACE_LEDGER_KEY` stay honored for the -chronicle#143 dual-read window and warn once per process) +Logbook dual-read window (microcosm#632) and warn once per process) uses the same scope rule as the archives after this PR's migration is applied by the project owner. The writer key is unaffected: rows are still inserted through the same role and the scope is derived from the hashed `pipeline` From a5121a1e0c4da8d7767fe8322bc948a957c7c5e7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 12:00:46 -0400 Subject: [PATCH 10/33] Apply ruff import-sort and formatting to the renamed files logbook_env's import in build/__init__.py sorted alphabetically after the rename, and tools/logbook.py's two dual-read imports needed reordering and reformatting to match. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/__init__.py | 8 +++---- .../src/microcosm/build/logbook_env.py | 4 +--- tools/logbook.py | 24 ++++++++----------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/__init__.py b/packages/microcosm-build/src/microcosm/build/__init__.py index 431f2793f..17ca54703 100644 --- a/packages/microcosm-build/src/microcosm/build/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/__init__.py @@ -49,10 +49,6 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: _assert_frame_compatible(_frame_version, _REQUIRED_FRAME_SERIES) -from microcosm.build.logbook_env import ( # noqa: E402 - after the compat gate - logbook_env, - logbook_env_names, -) from microcosm.build.chronicle_epoch import ( # noqa: E402 - after the compat gate ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS, @@ -141,6 +137,10 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: select_ledger_targets_from_jsonl, target_spec_from_ledger_fact, ) +from microcosm.build.logbook_env import ( # noqa: E402 - after the compat gate + logbook_env, + logbook_env_names, +) from microcosm.build.monetary_profile import ( # noqa: E402 - after compat gate MonetaryTargetContract, MonetaryTargetProfile, diff --git a/packages/microcosm-build/src/microcosm/build/logbook_env.py b/packages/microcosm-build/src/microcosm/build/logbook_env.py index 3536972b7..6a7ff6f9b 100644 --- a/packages/microcosm-build/src/microcosm/build/logbook_env.py +++ b/packages/microcosm-build/src/microcosm/build/logbook_env.py @@ -124,9 +124,7 @@ def describe_logbook_env(*names: str) -> str: """ preferred = ", ".join(names) legacy = ", ".join( - legacy_name - for name in names - for legacy_name in LOGBOOK_ENV_LEGACY_NAMES[name] + legacy_name for name in names for legacy_name in LOGBOOK_ENV_LEGACY_NAMES[name] ) return f"{preferred} (legacy {legacy} still honored)" diff --git a/tools/logbook.py b/tools/logbook.py index ed7dd72a5..423ba0097 100644 --- a/tools/logbook.py +++ b/tools/logbook.py @@ -27,15 +27,6 @@ from urllib.parse import urlencode from urllib.request import Request -from microcosm.build.logbook_env import ( - LEGACY_API_KEY_ENV, - LEGACY_EXPORT_KEY_ENV, - LOGBOOK_API_KEY_ENV, - LOGBOOK_EXPORT_KEY_ENV, - LOGBOOK_URL_ENV, - describe_logbook_env, - logbook_env, -) from microcosm.build.logbook import ( LOGBOOK_ROW_FIELDS, LogbookRow, @@ -47,6 +38,15 @@ render_markdown, urlopen, ) +from microcosm.build.logbook_env import ( + LEGACY_API_KEY_ENV, + LEGACY_EXPORT_KEY_ENV, + LOGBOOK_API_KEY_ENV, + LOGBOOK_EXPORT_KEY_ENV, + LOGBOOK_URL_ENV, + describe_logbook_env, + logbook_env, +) ROOT = Path(__file__).resolve().parents[1] #: Archives live at ``logbook//.jsonl`` — one hash chain per @@ -305,11 +305,7 @@ def _remote_rows(scope: str) -> tuple[LogbookRow, ...]: ) break wrong_scope = sorted( - { - row.pipeline - for row in rows - if _chain_scope(row.pipeline) != scope - } + {row.pipeline for row in rows if _chain_scope(row.pipeline) != scope} ) if wrong_scope: raise ValueError( From b98edd886f03b4ab62662d98f02fe4a46445069e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 12:04:07 -0400 Subject: [PATCH 11/33] Report the CHRONICLE_* to LOGBOOK_* correction on PR #849 Co-Authored-By: Claude Fable 5.1 --- out.md | 324 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 208 insertions(+), 116 deletions(-) diff --git a/out.md b/out.md index a727ccd79..64335b427 100644 --- a/out.md +++ b/out.md @@ -1,119 +1,211 @@ -# Armenia country package final report (#814) - -Date: 2026-08-28 - -Branch: `armenia-country-package-814` - -## Outcome - -The Armenia package is complete as a schema-valid, spec-only, engine-free -greenfield contract. It is not represented as an executable build: the exact -`populace-us` artifact, Armenian facts, generated cell bindings, community -distribution, gate policy, and shared runtime kernels remain explicit -prerequisites. - -The closed `am/` inventory mirrors Belgium's six typed resources and five -generation-zero JSON projections. It declares: - -- a two-stage load of a to-be-authenticated public `populace-us` artifact and - target-derived marz assignment; every record remains a US donor support - record and is never described as Armenian microdata; -- a 2022-census-vintage community spine constrained to the assigned marz, with - 10 marzes plus Yerevan and 71 consolidated communities documented but no - invented code roster; -- eight Ledger-only, count/indicator calibration authoring contracts spanning - demography, household structure, consumption, labour, earnings, pensions, - and family benefits; -- real-resolver refusal of unexpanded multi-cell tables: Chronicle must generate - cell-pinned Ledger references and direct/pre-built candidate bindings before - runtime activation; -- wage/payment, raw-income diagnostic, and national-accounts facts outside the - solver manifest until their validation role or AMD-compatible pre-built bridge - is enforceable; -- greenfield aggregate-admin, per-family-fit, target-coverage, macro-realism, - support, weight-audit, ESS, and ratio gate declarations, plus active - release-blocking reference-coverage/support/output checks; and -- a public 2024 release contract for `populace_am_{year}.h5`, with ArmStat open - dissemination stated and exact ArmStat/donor licence text left as a mandatory - verification item. - -`HARVEST.md` has exactly one solver worklist row per live target-reference key, -plus separate deferred validation/amount, geography, source-authentication, and -external-oracle worklists. `NOTES.md` records the Belgium solver lessons, -permanent survey tax-benefit holdouts, the amount/currency boundary, -`populace#263/#265`, and the future Axiom-backed `rulespec-am` boundary. - -Package identity after review: - -- CountrySpec fingerprint: - `64f50fa39e68e9ba6c451e3a47a2f2adeaba5a5ccb147cb80297f942de433ca8` -- Typed spec SHA-256: - `659b6baf5ebbd71fb7786ec4c4d49df565b2bddabeb868a9385ed226c56880f9` +# PR #849 env-variable correction — final report + +## What this was + +PR #849's review comment (Fable, main) caught that `POPULACE_LEDGER_URL` / +`_KEY` / `_API_KEY` / `_EXPORT_KEY` are the **Logbook** store's credentials +(Supabase `logbook` schema, `logbook_writer` / `logbook_exporter` roles — +`packages/microcosm-build/src/microcosm/build/logbook.py`'s own docstring +and `logbook/README.md`), not Chronicle fact-store variables. "Ledger" +there is the generic build-ledger sense renamed to Logbook on 2026-08-08 +(microcosm#632) specifically to stop colliding with Chronicle. The PR as +filed introduced `CHRONICLE_*` as the preferred spelling for these — the +wrong referent, recreating the exact collision #632 fixed. This task +renamed the preferred spelling to `LOGBOOK_*` everywhere and reframed the +docs/changelog/PR body accordingly. The epoch half of the PR +(`chronicle_epoch.py`, `ledger_artifact.py`, `import_entry_facts.py`, +`ledger_targets.py`) was approved as-is and left untouched except for two +stale module-path comments that had to follow the file rename. + +## Branch state before starting + +`chronicle-dual-accept` had 2 local commits ahead of `origin/chronicle-dual-accept` +(`d6cd24ca`, `1be2f18e`) that were unrelated follow-on work (journal exact-counts +edit, provenance docstring edit) not present on the PR head. Per the assignment, +the PR head (`origin/chronicle-dual-accept` = `4115573c`) is authoritative. Those +two commits were preserved on a new branch, +`backup/chronicle-dual-accept-pre-correction-1be2f18e`, before `chronicle-dual-accept` +was hard-reset to `4115573c`. `origin/main` was already an ancestor, so no rebase +was needed. + +## New head SHA + +**`a5121a1e0c4da8d7767fe8322bc948a957c7c5e7`**, pushed as a fast-forward of +`origin/chronicle-dual-accept` (no force needed — the branch was reset to the +exact PR head before new commits were added). + +Three new commits on top of `4115573c`: + +1. `061544e1` — Rename the CHRONICLE_* env dual-read window to LOGBOOK_* (module + rename + all symbol renames + every caller) +2. `ee73a624` — Reframe the env dual-read window as a Logbook cleanup, not + chronicle#143 (changelog, README, journal correction note) +3. `a5121a1e` — Apply ruff import-sort and formatting to the renamed files + +## Files changed (relative to 4115573c) + +``` + PROGRESS-chronicle-dual-accept.md | 29 +++++ + changelog.d/chronicle-dual-accept.added.md | 4 +- + logbook/README.md | 4 +- + packages/microcosm-build/src/microcosm/build/__init__.py | 10 +- + packages/microcosm-build/src/microcosm/build/logbook.py | 29 ++--- + .../build/{chronicle_env.py => logbook_env.py} | 91 ++++++------ + packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py | 2 +- + packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py | 2 +- + .../tests/{test_chronicle_env.py => test_logbook_env.py} | 98 +++++++------- + tools/logbook.py | 35 ++--- +``` + +Plus the PR body itself, edited via `gh pr edit 849` (four scoped changes: the +`chronicle_env` → `logbook_env` framing paragraph, two audit-table rows naming +`chronicle_env`/`CHRONICLE_*`, and the `test_chronicle_env.py` → `test_logbook_env.py` +test-file mention — everything else verbatim, confirmed by diffing old vs. new body +text before posting). + +### Rename map applied + +| Old | New | +|---|---| +| `chronicle_env.py` | `logbook_env.py` | +| `chronicle_env()` | `logbook_env()` | +| `chronicle_env_names()` | `logbook_env_names()` | +| `describe_chronicle_env()` | `describe_logbook_env()` | +| `reset_chronicle_env_deprecation_warnings()` | `reset_logbook_env_deprecation_warnings()` | +| `CHRONICLE_URL_ENV = "CHRONICLE_URL"` | `LOGBOOK_URL_ENV = "LOGBOOK_URL"` | +| `CHRONICLE_KEY_ENV = "CHRONICLE_KEY"` | `LOGBOOK_KEY_ENV = "LOGBOOK_KEY"` | +| `CHRONICLE_API_KEY_ENV = "CHRONICLE_API_KEY"` | `LOGBOOK_API_KEY_ENV = "LOGBOOK_API_KEY"` | +| `CHRONICLE_EXPORT_KEY_ENV = "CHRONICLE_EXPORT_KEY"` | `LOGBOOK_EXPORT_KEY_ENV = "LOGBOOK_EXPORT_KEY"` | +| `CHRONICLE_ENV_LEGACY_NAMES` | `LOGBOOK_ENV_LEGACY_NAMES` | +| `test_chronicle_env.py` | `test_logbook_env.py` | + +Unchanged (legacy names, same once-per-process `DeprecationWarning` behavior): +`LEGACY_URL_ENV = "POPULACE_LEDGER_URL"`, `LEGACY_KEY_ENV = "POPULACE_LEDGER_KEY"`, +`LEGACY_API_KEY_ENV = "POPULACE_LEDGER_API_KEY"`, +`LEGACY_EXPORT_KEY_ENV = "POPULACE_LEDGER_EXPORT_KEY"`. Warning message now +reads "...is the pre-rename name for LOGBOOK_...; the build ledger is now +Logbook (microcosm#632)..." — no chronicle#143 reference. + +Untouched by design (per the reviewer's own note — these really do translate +Chronicle ids / pin a Chronicle commit, so they correctly stay `CHRONICLE_*`): +`CHRONICLE_ONS_TURNOVER_BANDS`, `CHRONICLE_ONS_EMPLOYMENT_BANDS`, +`CHRONICLE_HMRC_BANDS` (`firm_generation.py`) and +`CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT` (`source_coverage.py`). Only +their comments' dotted-path references to the old `chronicle_env` module were +updated to `logbook_env`, since that module no longer exists under the old name. ## Verification -All commands ran offline. The package-wide command used the exact lock-required -`policyengine-us==1.819.0` already present in the local uv cache, so the two -engine-only test files ran inside the same aggregate rather than failing for a -missing optional dependency. - -Exact requested package-wide command: - -```sh -UV_NO_SYNC=1 UV_PROJECT_ENVIRONMENT=/tmp/armenia-uv-env.ME3TCl UV_CACHE_DIR=/tmp/uv-cache-armenia-814 PYTHONPATH=packages/microcosm-build/src:packages/microcosm-calibrate/src:packages/microcosm-frame/src:packages/microcosm-fit/src:packages/microcosm-data/src:/Users/maxghenis/.cache/uv/archive-v0/ewqqbcYNhWejPQ-OfsFxl:/tmp/armenia-no-engine-site.vZ5Kv8:/Users/maxghenis/PolicyEngine/chronicle/.venv/lib/python3.14/site-packages uv run pytest packages/microcosm-build -``` - -Result: **6,556 passed, 45 skipped, 2,351 warnings, 0 failed** in 3,671.74 -seconds (1:01:11). The warnings are existing numerical, pandas copy/fragmentation, -and PolicyEngine-US runtime warnings; none is Armenia-specific. - -Additional checks: - -- Focused package/golden/compiler suite: - `uv run pytest packages/microcosm-build/tests/test_spec_only_country_packages.py packages/microcosm-build/tests/test_country_spec.py packages/microcosm-build/tests/test_spec_engine_country_bundles.py -p no:cacheprovider` - — **101 passed** in 29.82 seconds. -- Authoritative `shared-spec` CI group: - `python3 tools/ci_test_groups.py --list shared-spec | xargs uv run pytest -p no:cacheprovider` - — **1,334 passed, 42 skipped, 1 warning** in 418.20 seconds. -- `ruff check .` — **passed**. -- `python3 tools/ci_test_groups.py --verify` — **verification=ok**, 313 test - files tracked. -- `git diff --check` — **passed**. - -## Deviations from Belgium and why - -1. Armenia consumes a pre-built public US donor pool instead of native, - restricted SILC. No `support_spine.json` is present because the current - vocabulary describes raw ASEC pool construction, not an existing artifact. -2. Armenia is engine-free. No target, gate, or release file requires - `rulespec-am`; any later rules leg must use Frame's `RulesEngine` protocol - through the Axiom adapter. -3. Marz is target-assigned before community cloning. The clone factor is the - compile-safe minimum of one, not Belgium's 20: collision-avoiding fanout must - wait for the 71-to-11 roster and within-marz support evidence. -4. There is no incumbent, so parity/export/target-surface gates are absent. - National accounts back a deferred macro-realism band; CEQ and World Bank - estimates remain documentation-only band candidates until harvested. -5. The live solver manifest contains eight count/indicator series contracts, - not guessed scalar cells or AMD amount targets. Those series will expand to - the reviewed cell-level profile after Chronicle harvest; the eventual - 10–16-margin selection is not fabricated in this package. - -## Top five maintainer questions - -1. Which immutable `populace-us` revision/file, hash, licence, and column - inventory certify the donor input? -2. Which exact Statbank, ILCS, LFS, SRC, pension, and benefit tables/cells define - the 2024 profile, and what generated cell-reference/binding artifact owns - their fanout? -3. Which scale-free indicator or reviewed AMD-compatible pre-built bridge makes - donor consumption bands and any future amount rows conceptually comparable? -4. What ex-ante Armenia aggregate-fit, family-fit, macro-realism, ESS, and - weight-ratio thresholds—and which shared evaluators—activate the deferred - gate declarations? -5. What is the authoritative 2022 marz/community roster and assignment table, - and when will the shared geography/source-coverage runtimes land under - `populace#263/#265`? - -No network fetch, push, PR, artifact build, release, or publication was -performed. The repository-root `PROGRESS.md` was not touched. +### `uv sync --all-packages --extra us` +``` +Resolved 125 packages in 15ms +Checked 102 packages in 68ms +``` + +### Targeted tests (exact command from the assignment) +``` +uv run pytest packages/microcosm-build/tests/test_logbook_env.py \ + packages/microcosm-build/tests/test_chronicle_epoch.py \ + packages/microcosm-build/tests/test_logbook.py \ + packages/microcosm-build/tests/test_logbook_cli.py \ + packages/microcosm-build/tests/test_logbook_backfill.py \ + packages/microcosm-build/tests/test_logbook_adoption.py \ + packages/microcosm-build/tests/test_logbook_archive.py \ + packages/microcosm-build/tests/test_logbook_prediction_seed.py \ + packages/microcosm-build/tests/test_logbook_chain_scopes_pg.py -q +``` +(`test_logbook*.py` expanded explicitly; `test_logbook_cli.py` is the only +other test file that imports `tools/logbook.py`, confirmed by grep.) + +``` +........................................................................ [ 46%] +........................................................................ [ 92%] +............ [100%] +96 passed +``` + +Three `DeprecationWarning`s fired during the run, confirming the renamed +legacy fallback path and the new message text work end-to-end: +``` +DeprecationWarning: POPULACE_LEDGER_URL is the pre-rename name for LOGBOOK_URL; +the build ledger is now Logbook (microcosm#632). Set LOGBOOK_URL instead — +POPULACE_LEDGER_URL stays honored only for the dual-read window. +``` +(and the same for `POPULACE_LEDGER_KEY`/`LOGBOOK_KEY`, +`POPULACE_LEDGER_API_KEY`/`LOGBOOK_API_KEY`, +`POPULACE_LEDGER_EXPORT_KEY`/`LOGBOOK_EXPORT_KEY`.) + +### `uv run ruff check .` +``` +All checks passed! +``` +(Two `I001` unsorted-import errors were introduced by the rename in +`build/__init__.py` and `tools/logbook.py`; fixed with `ruff check --fix` +and `ruff format`, scoped to only the files this task touched, committed +separately.) + +### `uv run ruff format --check .` +116 files "would be reformatted" — all pre-existing and unrelated to this +task (confirmed: the count was 118 before the ruff --fix/format pass above +and dropped to exactly 116 after fixing the two files this task's edits +affected; the remaining 116 are files this task never touched, e.g. +`test_uk_firm_generation.py`, `tools/spec_engine_coverage.py`). + +### `tools/ci_test_groups.py --verify` (the lint lane's own check) +``` +packages/microcosm-build/tests/test_logbook_env.py -> shared-spec +... +verification=ok +``` + +### Full `microcosm-build` package suite +`uv run pytest packages/microcosm-build -q` was launched as supplementary +verification beyond the assignment's required command list. It was still +running in the background when this report was written (long-running — +includes engine-gated US/UK tests now that `--extra us` is synced). The +required, scoped verification above is fully green; this run is extra +thoroughness, not a gate for this deliverable. + +### Grep sweep (exact command from the assignment) +``` +grep -rn "CHRONICLE_URL\|CHRONICLE_KEY\|CHRONICLE_API_KEY\|CHRONICLE_EXPORT_KEY\|chronicle_env" \ + --include=*.py --include=*.md . +``` +Result — 5 lines, all in `PROGRESS-chronicle-dual-accept.md`, all intentional: + +``` +PROGRESS-chronicle-dual-accept.md:39:- `microcosm/build/chronicle_env.py` — the env dual-read window, one helper, +PROGRESS-chronicle-dual-accept.md:51:- Tests: `test_chronicle_epoch.py`, `test_chronicle_env.py`, plus mixed-epoch +PROGRESS-chronicle-dual-accept.md:115:as-is. The env half only: `chronicle_env.py` renamed to `logbook_env.py`, +PROGRESS-chronicle-dual-accept.md:116:`CHRONICLE_*_ENV`/`chronicle_env`/`chronicle_env_names`/ +PROGRESS-chronicle-dual-accept.md:117:`describe_chronicle_env`/`reset_chronicle_env_deprecation_warnings` renamed +``` + +Lines 39/51 are in the journal's original "Done" section, which the +assignment explicitly says not to rewrite ("append a dated correction note; +do not rewrite history") — they're the historical record of what this +branch originally built, before the correction. Lines 115-117 are inside +the new "Correction (2026-09-02)" section this task appended, which by +necessity names the old symbols it renamed away from. **Zero occurrences in +any `.py` file** and **zero occurrences outside this one journal file's +history/correction-note text** — i.e., nothing outside git history in any +file that matters to running code, docs a reader would act on, or the PR +body. + +## What was NOT touched + +- The epoch half (`chronicle_epoch.py`, `ledger_artifact.py`, + `import_entry_facts.py`, `ledger_targets.py`, CD-vintage tests, band/commit + aliases) — approved as-is by the review, left alone except for the two + module-path comment fixes noted above. +- `CHRONICLE_*_BANDS` / `CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT` — real + Chronicle aliases, correctly still `CHRONICLE_*`. +- No merge was performed. PR #849 remains open. + +## Backup branch + +`backup/chronicle-dual-accept-pre-correction-1be2f18e` preserves the two +local-only commits that were on `chronicle-dual-accept` before this task +reset it to the PR head, in case that follow-on work (exact whole-feed +counts in the journal; per-row ids in the provenance docstring) is still +wanted — it was not part of PR #849 and was not re-applied. From 47df8f44f01f5ecd345f992d3b1079c9fad3b0be Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 12:04:31 -0400 Subject: [PATCH 12/33] Correct out.md's head-sha accounting for its own commit Co-Authored-By: Claude Fable 5.1 --- out.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/out.md b/out.md index 64335b427..0fbb13fb8 100644 --- a/out.md +++ b/out.md @@ -30,11 +30,15 @@ was needed. ## New head SHA -**`a5121a1e0c4da8d7767fe8322bc948a957c7c5e7`**, pushed as a fast-forward of -`origin/chronicle-dual-accept` (no force needed — the branch was reset to the -exact PR head before new commits were added). +**`a5121a1e0c4da8d7767fe8322bc948a957c7c5e7`** is the head of the substantive +code/docs/PR-body correction (all verification below was run against this +sha). One further commit, `b98edd88`, adds this report file (`out.md`, +following this repo's established per-task convention — see "out.md history" +below) on top, making `b98edd88` the actual current branch tip. Both were +pushed as fast-forwards of `origin/chronicle-dual-accept` (no force needed — +the branch was reset to the exact PR head before any new commits were added). -Three new commits on top of `4115573c`: +Three code/docs commits on top of `4115573c` (the original PR head): 1. `061544e1` — Rename the CHRONICLE_* env dual-read window to LOGBOOK_* (module rename + all symbol renames + every caller) @@ -42,6 +46,10 @@ Three new commits on top of `4115573c`: chronicle#143 (changelog, README, journal correction note) 3. `a5121a1e` — Apply ruff import-sort and formatting to the renamed files +Plus the report commit: + +4. `b98edd88` — Report the CHRONICLE_* to LOGBOOK_* correction on PR #849 (this file) + ## Files changed (relative to 4115573c) ``` @@ -202,6 +210,15 @@ body. Chronicle aliases, correctly still `CHRONICLE_*`. - No merge was performed. PR #849 remains open. +## out.md history + +Root `out.md` is this repo's established ephemeral per-task report file +(`git log --all -- out.md` shows dozens of prior merged PRs overwriting it +with their own final report, same as this one). Its prior content — an +Armenia country-package report from PR #814, merged 2026-08-28 — remains +fully recoverable at `git show 305a13ed:out.md` and was not otherwise lost; +overwriting it here follows the same convention every prior task used. + ## Backup branch `backup/chronicle-dual-accept-pre-correction-1be2f18e` preserves the two From 1f78847cbad7d9c6b258829662b6f1104819dc2b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 12:05:46 -0400 Subject: [PATCH 13/33] Drop the lane's root out.md; the repo keeps task journals as PROGRESS-*.md only Co-Authored-By: Claude Fable 5.1 --- out.md | 228 --------------------------------------------------------- 1 file changed, 228 deletions(-) delete mode 100644 out.md diff --git a/out.md b/out.md deleted file mode 100644 index 0fbb13fb8..000000000 --- a/out.md +++ /dev/null @@ -1,228 +0,0 @@ -# PR #849 env-variable correction — final report - -## What this was - -PR #849's review comment (Fable, main) caught that `POPULACE_LEDGER_URL` / -`_KEY` / `_API_KEY` / `_EXPORT_KEY` are the **Logbook** store's credentials -(Supabase `logbook` schema, `logbook_writer` / `logbook_exporter` roles — -`packages/microcosm-build/src/microcosm/build/logbook.py`'s own docstring -and `logbook/README.md`), not Chronicle fact-store variables. "Ledger" -there is the generic build-ledger sense renamed to Logbook on 2026-08-08 -(microcosm#632) specifically to stop colliding with Chronicle. The PR as -filed introduced `CHRONICLE_*` as the preferred spelling for these — the -wrong referent, recreating the exact collision #632 fixed. This task -renamed the preferred spelling to `LOGBOOK_*` everywhere and reframed the -docs/changelog/PR body accordingly. The epoch half of the PR -(`chronicle_epoch.py`, `ledger_artifact.py`, `import_entry_facts.py`, -`ledger_targets.py`) was approved as-is and left untouched except for two -stale module-path comments that had to follow the file rename. - -## Branch state before starting - -`chronicle-dual-accept` had 2 local commits ahead of `origin/chronicle-dual-accept` -(`d6cd24ca`, `1be2f18e`) that were unrelated follow-on work (journal exact-counts -edit, provenance docstring edit) not present on the PR head. Per the assignment, -the PR head (`origin/chronicle-dual-accept` = `4115573c`) is authoritative. Those -two commits were preserved on a new branch, -`backup/chronicle-dual-accept-pre-correction-1be2f18e`, before `chronicle-dual-accept` -was hard-reset to `4115573c`. `origin/main` was already an ancestor, so no rebase -was needed. - -## New head SHA - -**`a5121a1e0c4da8d7767fe8322bc948a957c7c5e7`** is the head of the substantive -code/docs/PR-body correction (all verification below was run against this -sha). One further commit, `b98edd88`, adds this report file (`out.md`, -following this repo's established per-task convention — see "out.md history" -below) on top, making `b98edd88` the actual current branch tip. Both were -pushed as fast-forwards of `origin/chronicle-dual-accept` (no force needed — -the branch was reset to the exact PR head before any new commits were added). - -Three code/docs commits on top of `4115573c` (the original PR head): - -1. `061544e1` — Rename the CHRONICLE_* env dual-read window to LOGBOOK_* (module - rename + all symbol renames + every caller) -2. `ee73a624` — Reframe the env dual-read window as a Logbook cleanup, not - chronicle#143 (changelog, README, journal correction note) -3. `a5121a1e` — Apply ruff import-sort and formatting to the renamed files - -Plus the report commit: - -4. `b98edd88` — Report the CHRONICLE_* to LOGBOOK_* correction on PR #849 (this file) - -## Files changed (relative to 4115573c) - -``` - PROGRESS-chronicle-dual-accept.md | 29 +++++ - changelog.d/chronicle-dual-accept.added.md | 4 +- - logbook/README.md | 4 +- - packages/microcosm-build/src/microcosm/build/__init__.py | 10 +- - packages/microcosm-build/src/microcosm/build/logbook.py | 29 ++--- - .../build/{chronicle_env.py => logbook_env.py} | 91 ++++++------ - packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py | 2 +- - packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py | 2 +- - .../tests/{test_chronicle_env.py => test_logbook_env.py} | 98 +++++++------- - tools/logbook.py | 35 ++--- -``` - -Plus the PR body itself, edited via `gh pr edit 849` (four scoped changes: the -`chronicle_env` → `logbook_env` framing paragraph, two audit-table rows naming -`chronicle_env`/`CHRONICLE_*`, and the `test_chronicle_env.py` → `test_logbook_env.py` -test-file mention — everything else verbatim, confirmed by diffing old vs. new body -text before posting). - -### Rename map applied - -| Old | New | -|---|---| -| `chronicle_env.py` | `logbook_env.py` | -| `chronicle_env()` | `logbook_env()` | -| `chronicle_env_names()` | `logbook_env_names()` | -| `describe_chronicle_env()` | `describe_logbook_env()` | -| `reset_chronicle_env_deprecation_warnings()` | `reset_logbook_env_deprecation_warnings()` | -| `CHRONICLE_URL_ENV = "CHRONICLE_URL"` | `LOGBOOK_URL_ENV = "LOGBOOK_URL"` | -| `CHRONICLE_KEY_ENV = "CHRONICLE_KEY"` | `LOGBOOK_KEY_ENV = "LOGBOOK_KEY"` | -| `CHRONICLE_API_KEY_ENV = "CHRONICLE_API_KEY"` | `LOGBOOK_API_KEY_ENV = "LOGBOOK_API_KEY"` | -| `CHRONICLE_EXPORT_KEY_ENV = "CHRONICLE_EXPORT_KEY"` | `LOGBOOK_EXPORT_KEY_ENV = "LOGBOOK_EXPORT_KEY"` | -| `CHRONICLE_ENV_LEGACY_NAMES` | `LOGBOOK_ENV_LEGACY_NAMES` | -| `test_chronicle_env.py` | `test_logbook_env.py` | - -Unchanged (legacy names, same once-per-process `DeprecationWarning` behavior): -`LEGACY_URL_ENV = "POPULACE_LEDGER_URL"`, `LEGACY_KEY_ENV = "POPULACE_LEDGER_KEY"`, -`LEGACY_API_KEY_ENV = "POPULACE_LEDGER_API_KEY"`, -`LEGACY_EXPORT_KEY_ENV = "POPULACE_LEDGER_EXPORT_KEY"`. Warning message now -reads "...is the pre-rename name for LOGBOOK_...; the build ledger is now -Logbook (microcosm#632)..." — no chronicle#143 reference. - -Untouched by design (per the reviewer's own note — these really do translate -Chronicle ids / pin a Chronicle commit, so they correctly stay `CHRONICLE_*`): -`CHRONICLE_ONS_TURNOVER_BANDS`, `CHRONICLE_ONS_EMPLOYMENT_BANDS`, -`CHRONICLE_HMRC_BANDS` (`firm_generation.py`) and -`CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT` (`source_coverage.py`). Only -their comments' dotted-path references to the old `chronicle_env` module were -updated to `logbook_env`, since that module no longer exists under the old name. - -## Verification - -### `uv sync --all-packages --extra us` -``` -Resolved 125 packages in 15ms -Checked 102 packages in 68ms -``` - -### Targeted tests (exact command from the assignment) -``` -uv run pytest packages/microcosm-build/tests/test_logbook_env.py \ - packages/microcosm-build/tests/test_chronicle_epoch.py \ - packages/microcosm-build/tests/test_logbook.py \ - packages/microcosm-build/tests/test_logbook_cli.py \ - packages/microcosm-build/tests/test_logbook_backfill.py \ - packages/microcosm-build/tests/test_logbook_adoption.py \ - packages/microcosm-build/tests/test_logbook_archive.py \ - packages/microcosm-build/tests/test_logbook_prediction_seed.py \ - packages/microcosm-build/tests/test_logbook_chain_scopes_pg.py -q -``` -(`test_logbook*.py` expanded explicitly; `test_logbook_cli.py` is the only -other test file that imports `tools/logbook.py`, confirmed by grep.) - -``` -........................................................................ [ 46%] -........................................................................ [ 92%] -............ [100%] -96 passed -``` - -Three `DeprecationWarning`s fired during the run, confirming the renamed -legacy fallback path and the new message text work end-to-end: -``` -DeprecationWarning: POPULACE_LEDGER_URL is the pre-rename name for LOGBOOK_URL; -the build ledger is now Logbook (microcosm#632). Set LOGBOOK_URL instead — -POPULACE_LEDGER_URL stays honored only for the dual-read window. -``` -(and the same for `POPULACE_LEDGER_KEY`/`LOGBOOK_KEY`, -`POPULACE_LEDGER_API_KEY`/`LOGBOOK_API_KEY`, -`POPULACE_LEDGER_EXPORT_KEY`/`LOGBOOK_EXPORT_KEY`.) - -### `uv run ruff check .` -``` -All checks passed! -``` -(Two `I001` unsorted-import errors were introduced by the rename in -`build/__init__.py` and `tools/logbook.py`; fixed with `ruff check --fix` -and `ruff format`, scoped to only the files this task touched, committed -separately.) - -### `uv run ruff format --check .` -116 files "would be reformatted" — all pre-existing and unrelated to this -task (confirmed: the count was 118 before the ruff --fix/format pass above -and dropped to exactly 116 after fixing the two files this task's edits -affected; the remaining 116 are files this task never touched, e.g. -`test_uk_firm_generation.py`, `tools/spec_engine_coverage.py`). - -### `tools/ci_test_groups.py --verify` (the lint lane's own check) -``` -packages/microcosm-build/tests/test_logbook_env.py -> shared-spec -... -verification=ok -``` - -### Full `microcosm-build` package suite -`uv run pytest packages/microcosm-build -q` was launched as supplementary -verification beyond the assignment's required command list. It was still -running in the background when this report was written (long-running — -includes engine-gated US/UK tests now that `--extra us` is synced). The -required, scoped verification above is fully green; this run is extra -thoroughness, not a gate for this deliverable. - -### Grep sweep (exact command from the assignment) -``` -grep -rn "CHRONICLE_URL\|CHRONICLE_KEY\|CHRONICLE_API_KEY\|CHRONICLE_EXPORT_KEY\|chronicle_env" \ - --include=*.py --include=*.md . -``` -Result — 5 lines, all in `PROGRESS-chronicle-dual-accept.md`, all intentional: - -``` -PROGRESS-chronicle-dual-accept.md:39:- `microcosm/build/chronicle_env.py` — the env dual-read window, one helper, -PROGRESS-chronicle-dual-accept.md:51:- Tests: `test_chronicle_epoch.py`, `test_chronicle_env.py`, plus mixed-epoch -PROGRESS-chronicle-dual-accept.md:115:as-is. The env half only: `chronicle_env.py` renamed to `logbook_env.py`, -PROGRESS-chronicle-dual-accept.md:116:`CHRONICLE_*_ENV`/`chronicle_env`/`chronicle_env_names`/ -PROGRESS-chronicle-dual-accept.md:117:`describe_chronicle_env`/`reset_chronicle_env_deprecation_warnings` renamed -``` - -Lines 39/51 are in the journal's original "Done" section, which the -assignment explicitly says not to rewrite ("append a dated correction note; -do not rewrite history") — they're the historical record of what this -branch originally built, before the correction. Lines 115-117 are inside -the new "Correction (2026-09-02)" section this task appended, which by -necessity names the old symbols it renamed away from. **Zero occurrences in -any `.py` file** and **zero occurrences outside this one journal file's -history/correction-note text** — i.e., nothing outside git history in any -file that matters to running code, docs a reader would act on, or the PR -body. - -## What was NOT touched - -- The epoch half (`chronicle_epoch.py`, `ledger_artifact.py`, - `import_entry_facts.py`, `ledger_targets.py`, CD-vintage tests, band/commit - aliases) — approved as-is by the review, left alone except for the two - module-path comment fixes noted above. -- `CHRONICLE_*_BANDS` / `CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT` — real - Chronicle aliases, correctly still `CHRONICLE_*`. -- No merge was performed. PR #849 remains open. - -## out.md history - -Root `out.md` is this repo's established ephemeral per-task report file -(`git log --all -- out.md` shows dozens of prior merged PRs overwriting it -with their own final report, same as this one). Its prior content — an -Armenia country-package report from PR #814, merged 2026-08-28 — remains -fully recoverable at `git show 305a13ed:out.md` and was not otherwise lost; -overwriting it here follows the same convention every prior task used. - -## Backup branch - -`backup/chronicle-dual-accept-pre-correction-1be2f18e` preserves the two -local-only commits that were on `chronicle-dual-accept` before this task -reset it to the PR head, in case that follow-on work (exact whole-feed -counts in the journal; per-row ids in the provenance docstring) is still -wanted — it was not part of PR #849 and was not re-applied. From e76bffd27491e59bbb8ac2aacde9b3246dcac648 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 12:48:33 -0400 Subject: [PATCH 14/33] Open a round-2 journal with the verified Chronicle identity ground truth The findings turn on which schema ids Chronicle actually emits, so the identities are recorded here with the file and line they were read from on chronicle origin/main rather than restated from the PR body. Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept-round2.md | 48 ++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 PROGRESS-chronicle-dual-accept-round2.md diff --git a/PROGRESS-chronicle-dual-accept-round2.md b/PROGRESS-chronicle-dual-accept-round2.md new file mode 100644 index 000000000..8728c5df1 --- /dev/null +++ b/PROGRESS-chronicle-dual-accept-round2.md @@ -0,0 +1,48 @@ +# Round-2 review fixes — PR #849 (`chronicle-dual-accept`) + +Journal for the gate-findings pass on top of `1f78847c`. History, not state: +check git/GitHub for current truth. + +## Verified ground truth (read this session, 2026-09-02) + +Read from `PolicyEngine/chronicle` at `origin/main`: + +| Identity | Where | Epoch | +|---|---|---| +| `policyengine_ledger.consumer_artifact.v2` | `policyengine_chronicle/consumer.py:30`, README line 299 | ledger | +| `ledger.consumer_fact.v1` | `chronicle/consumer_contract.py:28` | ledger | +| `ledger.fact.v1` | `chronicle/core.py:103` | ledger | +| `ledger.source_cell.v1` | `chronicle/sources/cells.py:24` | ledger | +| `ledger.source_row.v1`, `ledger.source_column.v1`, `ledger.source_row_value.v1` | `chronicle/sources/rows.py:27-29` | ledger | +| `ledger.{aggregate_fact,semantic_fact,concept_alignment,dimension_set,observed_measure,source_release,source_series,universe_constraint_set}.v2` | `chronicle/consumer_contract.py`, `policyengine_chronicle/consumer.py:195` | ledger | + +`policyengine_ledger.consumer_artifact.v1` is what **Microcosm** mints +(`import_entry_facts.py:164`), never what Chronicle emits — it is ledger-era +history that must keep loading. + +There is **no** `origin/epoch-dual-domain` branch on chronicle +(`git ls-remote --heads origin | grep -i epoch` → empty), so the chronicle-era +successors are declared here by the migration rule chronicle#143 states — +new namespace, same family, version bumped by one — and the brief pins the two +that matter: `policyengine_chronicle.consumer_artifact.v3` and +`chronicle.consumer_fact.v2`. + +## State + +Round 2 complete; pushed to `chronicle-dual-accept`. **DO NOT MERGE** — +the lane is authorized to fix and push only. + +## Done + +- [x] (1) Declared identity registry keyed by `(namespace, family, version)` +- [x] (2) Autouse Logbook env isolation + fail-closed network in tests +- [x] (3) UK `_ledger_provenance` delegates to `provenance()` +- [x] (4) Undeclared chronicle-namespace identities labelled `undeclared` +- [x] (5) `microcosm.build.logbook_env` module import no longer shadowed +- [x] (6) `CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT` in the us_runtime barrel +- [x] (7) Non-string `schema_version` raises the documented ValueError +- [x] (8) `tools/logbook.py --remote` help prefers `LOGBOOK_*` + +## Next + +Nothing in this lane. Reviewer decides on merge. From dd244fb41ba4b0326b3c0bac94113b2b0dbd97db Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:07:50 -0400 Subject: [PATCH 15/33] Accept the artifact ids producers actually stamp, from a declared registry The accepted set was {policyengine_ledger.consumer_artifact.v1, policyengine_chronicle.consumer_artifact.v2}, which is one generation off at both ends. Chronicle's main emits policyengine_ledger.consumer_artifact.v2 today (policyengine_chronicle/consumer.py:30, README line 299), so the loader rejected every artifact Chronicle currently publishes, and the chronicle-era successor of that id is .v3, not .v2. The v1 spelling is Microcosm's own minted artifact and stays accepted as the history it is. Epoch now comes from a declaration keyed by (namespace, family, version) rather than from the namespace segment of the key. Reading the namespace told us where a key claimed to come from, not that Chronicle issued it, so chronicle.source_cell.v3 and chronicle.anything.vN were being witnessed as Chronicle-issued identity. The ledger-era half of the table is transcribed from Chronicle's own hash-domain constants; the chronicle-era half is each one's successor under the rename rule, which puts source_cell at v2 where aggregate_fact is at v3. An undeclared spelling in a Chronicle namespace is reported as 'undeclared' in provenance, with the domain named, instead of being folded into an era nobody declared it for. The membership predicates are total over JSON. A manifest whose schema_version is a list or an object raised TypeError out of a frozenset membership test, bypassing the loader's own unsupported-schema message. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/chronicle_epoch.py | 481 ++++++++++++++---- .../src/microcosm/build/ledger_artifact.py | 68 ++- .../us_runtime/us_trade/import_entry_facts.py | 8 +- .../tests/test_chronicle_epoch.py | 308 +++++++++-- .../tests/test_ledger_targets.py | 2 +- .../tests/test_us_trade_facts.py | 6 +- 6 files changed, 699 insertions(+), 174 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py index c84dd31b0..86fdf09a3 100644 --- a/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py +++ b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py @@ -2,13 +2,10 @@ PolicyEngine Ledger is being renamed Chronicle. Per the migration spec on PolicyEngine/chronicle#143 the rename of *identities* happens **by epoch, -never in place**: Chronicle introduces chronicle-era hash domains -(``chronicle.aggregate_fact.v3``, ``chronicle.semantic_fact.v3``, ...) and -chronicle-named schema ids (``policyengine_chronicle.consumer_artifact.v2``, -``chronicle.consumer_fact.v2``) for **newly emitted** rows at a declared -cutover release. Ledger-era ids (``ledger.aggregate_fact.v2``, -``policyengine_ledger.consumer_artifact.v1``, ...) stay valid *history* -forever: no golden regenerates and no witnessed row is rewritten. +never in place**: Chronicle introduces chronicle-era hash domains and +chronicle-named schema ids for **newly emitted** rows at a declared cutover +release, and ledger-era ids stay valid *history* forever. No golden +regenerates and no witnessed row is rewritten. Microcosm is a consumer, so it must accept both eras **before** Chronicle flips emit. This module is the single place that knows which identities are @@ -19,12 +16,15 @@ hash. Comparison stays exact string equality, which is correct in both eras; what changes is that a validator asking "is this a Chronicle fact key?" must answer yes for either epoch. -2. **Never hard-code a single epoch in a validator.** Epoch detection here is - *structural* — the namespace segment of the key domain — not a lookup in a - frozen list of domain strings. Chronicle has declared the family-``v3`` - spellings for the two fact families named in the spec; the version numbers - the remaining families will take are not declared yet, and this module - deliberately does not guess them. +2. **Epoch is a declaration, not a guess.** Every identity this module calls + Chronicle-issued is listed in :data:`DECLARED_IDENTITIES` below, keyed by + ``(namespace, family, version)``. Structural parsing of + ``..v:`` still happens, but only so an + *undeclared* key in a Chronicle namespace can be reported as + :data:`UNDECLARED` in provenance — never silently promoted to issued + identity. A cutover that ships a spelling this table does not carry is a + one-row diff here, made deliberately, with the reader able to see which + spellings the build was actually prepared for. 3. **Microcosm-minted keys are epoch-independent.** Keys Microcosm mints live in Microcosm-owned namespaces (``microcosm.derived_fact.*``, ``populace_us_trade.*``) and are frozen at v1 by microcosm#639. They carry @@ -35,8 +35,16 @@ (``ledger_aggregate_fact_key``, ``ledger_commit``), H5 attributes, ``populace_*`` ids, goldens, and fixtures are frozen at v1. -Only the identity strings the migration spec names explicitly are pinned as -literals here. Everything else is derived. +Provenance for the ledger-era half of the table was read out of +``PolicyEngine/chronicle`` at ``origin/main`` rather than restated from a +plan: ``policyengine_chronicle/consumer.py`` for the artifact id, +``chronicle/consumer_contract.py`` for the per-row id and the ``.v2`` fact +domains, ``chronicle/core.py`` and ``chronicle/sources/`` for the ``.v1`` +source domains. The chronicle-era half is the successor each of those takes +under the rule chronicle#143 states for the rename — same family, new +namespace, version bumped by one — with the two ids the consumer migration +pins spelled out explicitly. Chronicle has published no per-family +enumeration of its own; when it does, this table is what changes. """ from __future__ import annotations @@ -52,19 +60,34 @@ "CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION", "CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION", "CHRONICLE_EPOCH", + "CHRONICLE_FACT_KEY_DOMAINS", + "CHRONICLE_NAMESPACES", + "DECLARED_IDENTITIES", + "DECLARED_IDENTITY_EPOCHS", + "DECLARED_IDENTITY_REGISTRY", "EPOCHS", + "FACT_KEY_EPOCH_LABELS", "FACT_KEY_FIELDS", + "FACT_KEY_IDENTITY_KIND", + "CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND", + "CONSUMER_FACT_SCHEMA_IDENTITY_KIND", + "DeclaredIdentity", "FactKeyIdentity", - "LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION", "LEDGER_CONSUMER_FACT_SCHEMA_VERSION", "LEDGER_EPOCH", "LEDGER_FACT_KEY_DOMAINS", + "MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION", + "PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION", + "UNDECLARED", "consumer_artifact_schema_epoch", "consumer_fact_schema_epoch", + "declared_identity", "describe_accepted_consumer_artifact_schema_versions", "describe_accepted_consumer_fact_schema_versions", "fact_key_epoch", + "fact_key_epoch_label", "feed_fact_key_epochs", + "feed_undeclared_fact_key_domains", "is_accepted_consumer_artifact_schema_version", "is_accepted_consumer_fact_schema_version", "is_chronicle_fact_key", @@ -72,65 +95,225 @@ "row_fact_key_epochs", ] -#: The ledger era: everything Chronicle emitted under its former name. +#: The ledger era: everything Chronicle issued under its former name. LEDGER_EPOCH = "ledger" -#: The chronicle era: everything emitted from the declared cutover forward. +#: The chronicle era: everything issued from the declared cutover forward. CHRONICLE_EPOCH = "chronicle" #: Both eras, oldest first. A validator iterates this; it never names one. EPOCHS: tuple[str, ...] = (LEDGER_EPOCH, CHRONICLE_EPOCH) -#: Consumer-artifact manifest ``schema_version``, per epoch. Both spellings -#: are declared in the chronicle#143 migration spec. -LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" +#: The label for an identity in a Chronicle namespace that this module's +#: declaration table does not carry — an unrecognized family, or a family at +#: a version nobody declared. Such an identity is *reported*, so a release +#: manifest shows that the feed contained something the build was not +#: prepared for, but it is never counted as Chronicle-issued identity. +UNDECLARED = "undeclared" + +#: The labels :func:`feed_fact_key_epochs` can emit, in report order. +FACT_KEY_EPOCH_LABELS: tuple[str, ...] = (*EPOCHS, UNDECLARED) + +#: Namespace -> epoch, for every namespace Chronicle issues identities in. +#: Fact keys and per-row schema ids use the bare ``ledger`` / ``chronicle`` +#: namespace; the consumer-artifact manifest id uses the package-qualified +#: ``policyengine_ledger`` / ``policyengine_chronicle`` one. +CHRONICLE_NAMESPACES: Mapping[str, str] = { + "ledger": LEDGER_EPOCH, + "policyengine_ledger": LEDGER_EPOCH, + "chronicle": CHRONICLE_EPOCH, + "policyengine_chronicle": CHRONICLE_EPOCH, +} + +#: Identity kinds. An identity's kind says where it is allowed to appear: +#: a fact-key domain never gates a manifest and a manifest id is never a key. +CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND = "consumer_artifact_schema" +CONSUMER_FACT_SCHEMA_IDENTITY_KIND = "consumer_fact_schema" +FACT_KEY_IDENTITY_KIND = "fact_key" + +_VERSION_PATTERN = re.compile(r"^v\d+$") + + +@dataclass(frozen=True) +class DeclaredIdentity: + """One identity spelling the migration declares, and the epoch that owns it.""" + + namespace: str + family: str + version: str + epoch: str + kind: str + + @property + def identity(self) -> str: + """The identity string as it appears in an artifact, ``a.b.vN``.""" + return f"{self.namespace}.{self.family}.{self.version}" + + @property + def registry_key(self) -> tuple[str, str, str]: + """The ``(namespace, family, version)`` triple this is registered under.""" + return (self.namespace, self.family, self.version) + + +def _declare(identity: str, *, epoch: str, kind: str) -> DeclaredIdentity: + """Build one registry row from its literal identity string. + + Every argument is a literal at the call site below, so the table reads as + the list of spellings it is, and a typo fails at import rather than at + cutover. + """ + namespace, _, remainder = identity.partition(".") + family, _, version = remainder.rpartition(".") + if not namespace or not family or not _VERSION_PATTERN.match(version): + raise ValueError(f"Not a Chronicle identity spelling: {identity!r}.") + if CHRONICLE_NAMESPACES.get(namespace) != epoch: + raise ValueError( + f"{identity!r} is declared for the {epoch!r} epoch but its " + f"namespace {namespace!r} belongs to " + f"{CHRONICLE_NAMESPACES.get(namespace)!r}." + ) + return DeclaredIdentity( + namespace=namespace, family=family, version=version, epoch=epoch, kind=kind + ) + + +#: The consumer-artifact manifest ``schema_version`` Microcosm's **own** +#: minted artifacts declare (``import_entry_facts.write_consumer_artifact``). +#: Frozen at v1 by microcosm#639: these bytes must not move, and they must +#: keep loading forever. +MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" + +#: The consumer-artifact manifest ``schema_version`` **Chronicle** stamps +#: today (``policyengine_chronicle/consumer.py`` on chronicle ``main``). Still +#: ledger-era: chronicle#143 has not flipped the namespace yet. +PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v2" + +#: The chronicle-era successor of the id above: same payload, chronicle +#: namespace, version bumped. CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION = ( - "policyengine_chronicle.consumer_artifact.v2" + "policyengine_chronicle.consumer_artifact.v3" ) -#: Per-row consumer-fact ``schema_version``, per epoch. +#: The per-row consumer-fact ``schema_version`` Chronicle stamps today +#: (``chronicle/consumer_contract.py`` on chronicle ``main``), and its +#: chronicle-era successor. LEDGER_CONSUMER_FACT_SCHEMA_VERSION = "ledger.consumer_fact.v1" CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION = "chronicle.consumer_fact.v2" -CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH: Mapping[str, str] = { - LEDGER_EPOCH: LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, - CHRONICLE_EPOCH: CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, +#: Fact-key domains, ledger-era spelling beside its chronicle-era successor. +#: The ledger column is what Chronicle's ``main`` hashes with today; the +#: version numbers differ by family (the source-side domains are still v1 +#: where the derived ones are v2), which is why a version can never be +#: assumed and why this table is explicit rather than computed at the call +#: site. +_FACT_KEY_DOMAIN_DECLARATIONS: tuple[tuple[str, str], ...] = ( + # chronicle/core.py + ("ledger.fact.v1", "chronicle.fact.v2"), + # chronicle/sources/cells.py, chronicle/sources/rows.py + ("ledger.source_cell.v1", "chronicle.source_cell.v2"), + ("ledger.source_row.v1", "chronicle.source_row.v2"), + ("ledger.source_column.v1", "chronicle.source_column.v2"), + ("ledger.source_row_value.v1", "chronicle.source_row_value.v2"), + # chronicle/consumer_contract.py, policyengine_chronicle/consumer.py + ("ledger.aggregate_fact.v2", "chronicle.aggregate_fact.v3"), + ("ledger.semantic_fact.v2", "chronicle.semantic_fact.v3"), + ("ledger.concept_alignment.v2", "chronicle.concept_alignment.v3"), + ("ledger.dimension_set.v2", "chronicle.dimension_set.v3"), + ("ledger.observed_measure.v2", "chronicle.observed_measure.v3"), + ("ledger.source_release.v2", "chronicle.source_release.v3"), + ("ledger.source_series.v2", "chronicle.source_series.v3"), + ("ledger.universe_constraint_set.v2", "chronicle.universe_constraint_set.v3"), +) + +#: Every identity spelling this consumer is declared to understand. The +#: registry below is keyed off it; nothing outside this tuple is Chronicle +#: identity as far as Microcosm is concerned. +DECLARED_IDENTITIES: tuple[DeclaredIdentity, ...] = ( + _declare( + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, + epoch=LEDGER_EPOCH, + kind=CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND, + ), + _declare( + PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, + epoch=LEDGER_EPOCH, + kind=CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND, + ), + _declare( + CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, + epoch=CHRONICLE_EPOCH, + kind=CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND, + ), + _declare( + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + epoch=LEDGER_EPOCH, + kind=CONSUMER_FACT_SCHEMA_IDENTITY_KIND, + ), + _declare( + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + epoch=CHRONICLE_EPOCH, + kind=CONSUMER_FACT_SCHEMA_IDENTITY_KIND, + ), + *( + _declare(identity, epoch=epoch, kind=FACT_KEY_IDENTITY_KIND) + for ledger_domain, chronicle_domain in _FACT_KEY_DOMAIN_DECLARATIONS + for identity, epoch in ( + (ledger_domain, LEDGER_EPOCH), + (chronicle_domain, CHRONICLE_EPOCH), + ) + ), +) + +#: The registry: ``(namespace, family, version)`` -> the declared identity. +#: One triple can only belong to one epoch, and the constructor above +#: refuses a row whose namespace disagrees with the epoch it claims. +DECLARED_IDENTITY_REGISTRY: Mapping[tuple[str, str, str], DeclaredIdentity] = { + declaration.registry_key: declaration for declaration in DECLARED_IDENTITIES } -CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH: Mapping[str, str] = { - LEDGER_EPOCH: LEDGER_CONSUMER_FACT_SCHEMA_VERSION, - CHRONICLE_EPOCH: CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, +if len(DECLARED_IDENTITY_REGISTRY) != len(DECLARED_IDENTITIES): # pragma: no cover + raise ValueError("Duplicate (namespace, family, version) in DECLARED_IDENTITIES.") + +#: The same registry reduced to what epoch resolution actually asks it: +#: ``(namespace, family, version)`` -> epoch. +DECLARED_IDENTITY_EPOCHS: Mapping[tuple[str, str, str], str] = { + registry_key: declaration.epoch + for registry_key, declaration in DECLARED_IDENTITY_REGISTRY.items() } + +def _identities_of(kind: str) -> tuple[str, ...]: + """Declared identity strings of one kind, oldest era first.""" + return tuple( + declaration.identity + for era in EPOCHS + for declaration in DECLARED_IDENTITIES + if declaration.kind == kind and declaration.epoch == era + ) + + #: Membership sets. Loaders test membership, never equality with one era. +#: The artifact set carries three spellings, not two: Microcosm's own minted +#: v1, Chronicle's published v2, and the chronicle-era v3 successor. ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS = frozenset( - CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH.values() + _identities_of(CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND) ) ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS = frozenset( - CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH.values() + _identities_of(CONSUMER_FACT_SCHEMA_IDENTITY_KIND) ) -#: Ledger-era fact-key domains, as *observed* in the feeds and fixtures this -#: repo carries: every family in -#: ``tests/fixtures/uk_target_reference_feed_rows.jsonl``, plus -#: ``source_row``, which only the far larger pinned US feed exercises. The -#: version numbers are the observed ones and differ by family — ``fact`` and -#: ``source_cell`` are still v1 while the rest are v2 — which is why epoch -#: detection is structural and never a lookup here. Recorded for documentation -#: and for the frozen-history tests; a family this list has never seen still -#: resolves to its epoch. +#: Fact-key domains by family, per epoch. Nothing consults these at runtime — +#: resolution goes through the registry — but they document the table and let +#: tests pin it against the feeds this repo carries. LEDGER_FACT_KEY_DOMAINS: Mapping[str, str] = { - "aggregate_fact": "ledger.aggregate_fact.v2", - "semantic_fact": "ledger.semantic_fact.v2", - # Carried by ``legacy_fact_key``, not by a ``fact_key`` field. - "fact": "ledger.fact.v1", - "source_cell": "ledger.source_cell.v1", - "source_row": "ledger.source_row.v1", - "dimension_set": "ledger.dimension_set.v2", - "concept_alignment": "ledger.concept_alignment.v2", - "observed_measure": "ledger.observed_measure.v2", - "source_release": "ledger.source_release.v2", - "source_series": "ledger.source_series.v2", - "universe_constraint_set": "ledger.universe_constraint_set.v2", + declaration.family: declaration.identity + for declaration in DECLARED_IDENTITIES + if declaration.kind == FACT_KEY_IDENTITY_KIND and declaration.epoch == LEDGER_EPOCH +} +CHRONICLE_FACT_KEY_DOMAINS: Mapping[str, str] = { + declaration.family: declaration.identity + for declaration in DECLARED_IDENTITIES + if declaration.kind == FACT_KEY_IDENTITY_KIND + and declaration.epoch == CHRONICLE_EPOCH } #: Consumer-fact row fields that carry a single Chronicle key. The first four @@ -164,17 +347,22 @@ ("concept_alignment", "concept_alignment_key"), ) -_VERSION_PATTERN = re.compile(r"^v\d+$") - @dataclass(frozen=True) class FactKeyIdentity: """The structure of a Chronicle-shaped key, ``:``. - ``epoch`` is ``"ledger"`` or ``"chronicle"`` for Chronicle-issued keys and - ``None`` for keys minted in some other namespace — Microcosm's own - ``microcosm.derived_fact.*`` and ``populace_us_trade.*`` derived keys, for - instance, which are deliberately outside both eras. + ``epoch`` is the *declared* epoch — ``"ledger"`` or ``"chronicle"`` — and + is ``None`` for anything :data:`DECLARED_IDENTITY_REGISTRY` does not carry. + ``namespace_epoch`` is the weaker, structural answer: the epoch the key's + namespace belongs to, whatever family or version follows it. The two + differ exactly for a key in a Chronicle namespace whose spelling was never + declared, which :attr:`epoch_label` reports as :data:`UNDECLARED` rather + than promoting it to issued identity. + + Both are ``None`` for keys minted in some other namespace — Microcosm's + own ``microcosm.derived_fact.*`` and ``populace_us_trade.*`` derived keys, + for instance, which are deliberately outside both eras. """ domain: str @@ -183,15 +371,29 @@ class FactKeyIdentity: version: str digest: str epoch: str | None + namespace_epoch: str | None + + @property + def declared(self) -> bool: + """True when this exact spelling is in the declaration table.""" + return self.epoch is not None + + @property + def epoch_label(self) -> str | None: + """The declared epoch, :data:`UNDECLARED`, or ``None`` if foreign.""" + if self.epoch is not None: + return self.epoch + return UNDECLARED if self.namespace_epoch is not None else None def parse_fact_key(key: object) -> FactKeyIdentity | None: """Split ``..v:``; ``None`` if not that shape. Parsing is deliberately shallow. Microcosm does not recompute Chronicle - digests, so it needs only enough structure to answer "which epoch issued - this key?" — and it must answer that without a frozen list of domain - strings, so a chronicle-era family this code has never seen still resolves. + digests, so it needs only enough structure to look the spelling up in + :data:`DECLARED_IDENTITY_REGISTRY` — and, when the lookup misses, to say + whether the miss was in a Chronicle namespace (undeclared, worth + reporting) or in some other namespace entirely (not Chronicle's at all). """ if not isinstance(key, str) or not key: return None @@ -208,105 +410,170 @@ def parse_fact_key(key: object) -> FactKeyIdentity | None: family = ".".join(segments[1:-1]) if not namespace or not family: return None + declaration = DECLARED_IDENTITY_REGISTRY.get((namespace, family, version)) + if declaration is not None and declaration.kind != FACT_KEY_IDENTITY_KIND: + # A manifest or per-row schema id is a declared identity, but it is + # not a fact-key domain: keys never carry it. + declaration = None return FactKeyIdentity( domain=domain, namespace=namespace, family=family, version=version, digest=digest, - epoch=namespace if namespace in EPOCHS else None, + epoch=None if declaration is None else declaration.epoch, + namespace_epoch=CHRONICLE_NAMESPACES.get(namespace), ) +def declared_identity(identity: object) -> DeclaredIdentity | None: + """The declaration for an identity string, or ``None`` if undeclared.""" + if not isinstance(identity, str) or not identity: + return None + namespace, _, remainder = identity.partition(".") + family, _, version = remainder.rpartition(".") + if not namespace or not family: + return None + return DECLARED_IDENTITY_REGISTRY.get((namespace, family, version)) + + def fact_key_epoch(key: object) -> str | None: - """The epoch that issued ``key``, or ``None`` for a foreign namespace.""" + """The epoch that *declared* ``key``'s domain, or ``None``. + + ``None`` covers both a foreign namespace and a Chronicle namespace whose + exact spelling was never declared; :func:`fact_key_epoch_label` + distinguishes them. + """ identity = parse_fact_key(key) return None if identity is None else identity.epoch +def fact_key_epoch_label(key: object) -> str | None: + """``"ledger"``, ``"chronicle"``, :data:`UNDECLARED`, or ``None``.""" + identity = parse_fact_key(key) + return None if identity is None else identity.epoch_label + + def is_chronicle_fact_key(key: object) -> bool: - """True when ``key`` is a Chronicle-issued key of *either* epoch.""" + """True when ``key`` is a *declared* Chronicle key of either epoch. + + An undeclared ``chronicle.*`` spelling is deliberately false here: it may + turn out to be Chronicle's, but this build has not been told so, and a + validator that answered yes would be treating a guess as identity. + """ return fact_key_epoch(key) is not None def row_fact_key_epochs(row: object) -> frozenset[str]: - """Every Chronicle epoch appearing in one consumer-fact row's keys. + """Every epoch label appearing in one consumer-fact row's Chronicle keys. - Empty for a row whose keys are all Microcosm-minted: those namespaces are - outside both eras by design. + Contains :data:`UNDECLARED` when the row carries a key in a Chronicle + namespace whose spelling this consumer does not declare. Empty for a row + whose keys are all Microcosm-minted: those namespaces are outside both + eras by design. """ - if not isinstance(row, Mapping): - return frozenset() - epochs: set[str] = set() - for field in FACT_KEY_FIELDS: - epoch = fact_key_epoch(row.get(field)) - if epoch is not None: - epochs.add(epoch) - for path in _FACT_KEY_NESTED_PATHS: - epoch = fact_key_epoch(_at(row, path)) - if epoch is not None: - epochs.add(epoch) - for path in _FACT_KEY_LIST_PATHS: - values = _at(row, path) - if isinstance(values, Iterable) and not isinstance(values, str | bytes): - for value in values: - epoch = fact_key_epoch(value) - if epoch is not None: - epochs.add(epoch) - return frozenset(epochs) + return frozenset(label for label, _ in _row_labelled_keys(row)) + + +def feed_undeclared_fact_key_domains(rows: Iterable[Any]) -> tuple[str, ...]: + """Sorted Chronicle-namespace key domains the declaration table lacks. + + Reported alongside the epochs so a release manifest names *what* it did + not recognise, rather than only that something went unrecognised. + """ + undeclared: set[str] = set() + for row in rows: + for label, domain in _row_labelled_keys(row): + if label == UNDECLARED: + undeclared.add(domain) + return tuple(sorted(undeclared)) def feed_fact_key_epochs(rows: Iterable[Any]) -> tuple[str, ...]: - """Chronicle epochs observed across a whole feed, in :data:`EPOCHS` order. + """Epoch labels observed across a whole feed, in report order. A mixed-epoch feed — ledger-era history beside chronicle-era rows — is - expected during the cutover window and is reported, not rejected. + expected during the cutover window and is reported, not rejected. So is + an undeclared spelling: it appears as :data:`UNDECLARED`, never folded + into either era. """ observed: set[str] = set() for row in rows: observed |= row_fact_key_epochs(row) - return tuple(epoch for epoch in EPOCHS if epoch in observed) + return tuple(label for label in FACT_KEY_EPOCH_LABELS if label in observed) def is_accepted_consumer_artifact_schema_version(value: object) -> bool: - """True for the consumer-artifact manifest schema id of either epoch.""" - return value in ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS + """True for a declared consumer-artifact manifest schema id, either epoch. + + Non-string JSON — a list or object where a schema id belongs — is simply + not accepted. It must not raise here: the loader turns a rejection into + the documented unsupported-schema ``ValueError``, and a ``TypeError`` + escaping a membership test would bypass that message entirely. + """ + return ( + isinstance(value, str) and value in ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS + ) def is_accepted_consumer_fact_schema_version(value: object) -> bool: - """True for the per-row consumer-fact schema id of either epoch.""" - return value in ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS + """True for a declared per-row consumer-fact schema id, either epoch.""" + return isinstance(value, str) and value in ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS def consumer_artifact_schema_epoch(value: object) -> str | None: - """The epoch of a consumer-artifact schema id, or ``None`` if unknown.""" - return _epoch_of(value, CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH) + """The epoch of a consumer-artifact schema id, or ``None`` if undeclared.""" + return _schema_epoch(value, CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND) def consumer_fact_schema_epoch(value: object) -> str | None: """The epoch of a per-row consumer-fact schema id, or ``None``.""" - return _epoch_of(value, CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH) + return _schema_epoch(value, CONSUMER_FACT_SCHEMA_IDENTITY_KIND) def describe_accepted_consumer_artifact_schema_versions() -> str: - """Both accepted artifact schema ids, oldest era first, for messages.""" - return _describe(CONSUMER_ARTIFACT_SCHEMA_VERSION_BY_EPOCH) + """Every accepted artifact schema id, oldest era first, for messages.""" + return _describe(CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND) def describe_accepted_consumer_fact_schema_versions() -> str: - """Both accepted per-row fact schema ids, oldest era first, for messages.""" - return _describe(CONSUMER_FACT_SCHEMA_VERSION_BY_EPOCH) + """Every accepted per-row fact schema id, oldest era first, for messages.""" + return _describe(CONSUMER_FACT_SCHEMA_IDENTITY_KIND) + + +def _describe(kind: str) -> str: + return ", ".join(repr(identity) for identity in _identities_of(kind)) + + +def _schema_epoch(value: object, kind: str) -> str | None: + declaration = declared_identity(value) + if declaration is None or declaration.kind != kind: + return None + return declaration.epoch -def _describe(by_epoch: Mapping[str, str]) -> str: - return ", ".join(repr(by_epoch[epoch]) for epoch in EPOCHS) +def _row_labelled_keys(row: object) -> tuple[tuple[str, str], ...]: + """``(epoch label, key domain)`` for every Chronicle key in one row.""" + if not isinstance(row, Mapping): + return () + labelled: list[tuple[str, str]] = [] + def record(value: object) -> None: + identity = parse_fact_key(value) + if identity is None or identity.epoch_label is None: + return + labelled.append((identity.epoch_label, identity.domain)) -def _epoch_of(value: object, by_epoch: Mapping[str, str]) -> str | None: - for epoch in EPOCHS: - if value == by_epoch[epoch]: - return epoch - return None + for field in FACT_KEY_FIELDS: + record(row.get(field)) + for path in _FACT_KEY_NESTED_PATHS: + record(_at(row, path)) + for path in _FACT_KEY_LIST_PATHS: + values = _at(row, path) + if isinstance(values, Iterable) and not isinstance(values, str | bytes): + for value in values: + record(value) + return tuple(labelled) def _at(row: Mapping[str, Any], path: tuple[str, ...]) -> Any: diff --git a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py index 6a08f219a..815da04a7 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -12,21 +12,28 @@ against the published artifact contract (stdlib only); it does not import the Chronicle implementation package. -**Both eras load.** The manifest's ``schema_version`` is checked for -membership in :data:`ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS`, never for -equality with one era, so an artifact published after Chronicle's rename +**Every declared era loads.** The manifest's ``schema_version`` is checked +for membership in :data:`ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS`, never +for equality with one era, so an artifact published after Chronicle's rename cutover loads here without a code change — see -:mod:`microcosm.build.chronicle_epoch` and PolicyEngine/chronicle#143. The -observed id, its epoch, the fact-key epochs present in the feed, and the +:mod:`microcosm.build.chronicle_epoch` and PolicyEngine/chronicle#143. Three +spellings are accepted, not two: Microcosm's own minted +``policyengine_ledger.consumer_artifact.v1``, the +``policyengine_ledger.consumer_artifact.v2`` Chronicle's ``main`` emits +today, and the chronicle-era +``policyengine_chronicle.consumer_artifact.v3`` successor. + +The observed id, its epoch, the fact-key epochs present in the feed, any +Chronicle-namespace key domain the declaration table does not carry, and the per-row schema ids the rows themselves declare are all recorded in :meth:`LedgerConsumerArtifact.provenance`, so a release manifest witnesses which era it actually consumed rather than which era it assumed. Acceptance widened here; nothing narrowed. Only the *manifest* schema id is -gated, and only against the two ids chronicle#143 declares. Row-level ids and -fact keys are carried as published — real feeds mint rows in namespaces that -belong to neither era, and a consumer that rejected them would fail closed on -data that has always loaded. +gated, and only against the declared ids. Row-level ids and fact keys are +carried as published — real feeds mint rows in namespaces that belong to +neither era, and a consumer that rejected them would fail closed on data that +has always loaded. """ from __future__ import annotations @@ -40,10 +47,11 @@ from microcosm.build.chronicle_epoch import ( ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, - LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, consumer_artifact_schema_epoch, describe_accepted_consumer_artifact_schema_versions, feed_fact_key_epochs, + feed_undeclared_fact_key_domains, is_accepted_consumer_artifact_schema_version, ) @@ -58,9 +66,11 @@ "resolve_ledger_artifact", ] -#: The era Microcosm's own minted artifacts still declare. Frozen at v1 by -#: microcosm#639; loading is governed by the accepted *set*, not by this. -CONSUMER_ARTIFACT_SCHEMA_VERSION = LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION +#: The id Microcosm's own minted artifacts still declare. Frozen at v1 by +#: microcosm#639; loading is governed by the accepted *set*, not by this. It +#: is deliberately *not* the id Chronicle emits — Chronicle's ``main`` stamps +#: ``policyengine_ledger.consumer_artifact.v2``, which the set also accepts. +CONSUMER_ARTIFACT_SCHEMA_VERSION = MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION ALLOWED_LEDGER_ASSERTIONS = frozenset(("observation", "source_projection")) DEFAULT_LEDGER_ASSERTION = "observation" @@ -108,14 +118,26 @@ def schema_epoch(self) -> str | None: @property def fact_key_epochs(self) -> tuple[str, ...]: - """Chronicle epochs observed across the feed's fact keys. + """Epoch labels observed across the feed's Chronicle fact keys. Empty when the feed carries only Microcosm-minted keys, and both epochs when a cutover-window feed mixes ledger-era history with - chronicle-era rows. + chronicle-era rows. A Chronicle-namespace key whose exact spelling is + undeclared appears as ``"undeclared"`` — reported, never folded into + an era it was not declared for. """ return feed_fact_key_epochs(self.facts) + @property + def undeclared_fact_key_domains(self) -> tuple[str, ...]: + """Chronicle-namespace key domains the declaration table lacks. + + Normally empty. A non-empty tuple means the feed carried a spelling + this build was not told about, and names it, so the manifest says + *what* went unrecognised instead of only that something did. + """ + return feed_undeclared_fact_key_domains(self.facts) + @property def fact_schema_versions(self) -> tuple[str, ...]: """Distinct per-row ``schema_version`` values in the feed, sorted. @@ -134,9 +156,11 @@ def fact_schema_versions(self) -> tuple[str, ...]: def provenance(self) -> dict[str, Any]: """Chronicle-artifact identity block for build and release manifests. - Records the schema id as *observed*, plus the epoch it belongs to and - the epochs of the fact keys in the feed, so a manifest witnesses which - era of Chronicle actually resolved its targets. + Records the schema id as *observed*, plus the epoch it belongs to, + the epoch labels of the fact keys in the feed, and any undeclared + Chronicle-namespace domain among them, so a manifest witnesses which + era of Chronicle actually resolved its targets — and says so when the + feed carried a spelling this build did not declare. """ payload: dict[str, Any] = { "path_name": self.path.name, @@ -160,6 +184,7 @@ def provenance(self) -> dict[str, Any]: payload["manifest_sha256"] = None payload["schema_epoch"] = self.schema_epoch payload["fact_key_epochs"] = list(self.fact_key_epochs) + payload["undeclared_fact_key_domains"] = list(self.undeclared_fact_key_domains) payload["fact_schema_versions"] = list(self.fact_schema_versions) return payload @@ -203,8 +228,11 @@ def load_ledger_consumer_artifact( ) schema_version = manifest.get("schema_version") # Membership, not equality: ledger-era and chronicle-era artifacts are - # the same contract under two names, and both must load through the - # rename cutover (chronicle#143). + # the same contract under different names, and all of them must load + # through the rename cutover (chronicle#143). The predicate is total + # over JSON — a manifest whose schema_version is a list or an object + # is unsupported, and must say so with this message rather than + # escaping as a TypeError from a membership test. if not is_accepted_consumer_artifact_schema_version(schema_version): raise ValueError( "Unsupported Chronicle consumer artifact schema_version " diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py b/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py index 2e84e05d6..4851851a0 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py @@ -50,8 +50,8 @@ from microcosm.build.chronicle_epoch import ( ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, - LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, describe_accepted_consumer_artifact_schema_versions, is_accepted_consumer_artifact_schema_version, ) @@ -161,7 +161,7 @@ class FactSourceLeg: #: whose epoch they could inherit. Chronicle's own cutover moves what Chronicle #: emits, not what Microcosm mints. Acceptance is the separate, dual-era #: question, and it lives in :mod:`microcosm.build.chronicle_epoch`. -CONSUMER_ARTIFACT_SCHEMA_VERSION = LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION +CONSUMER_ARTIFACT_SCHEMA_VERSION = MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION _FACT_SCHEMA_VERSION = LEDGER_CONSUMER_FACT_SCHEMA_VERSION #: Microcosm's own key namespace: outside both Chronicle eras by construction, #: so these keys can never collide with or impersonate Chronicle-built keys — @@ -618,8 +618,8 @@ def write_consumer_artifact( which re-hashes the fact file against ``manifest.facts_sha256``. ``schema_version`` defaults to the ledger-era id these artifacts have - always declared and is validated for membership in both eras, so the - chronicle-era cutover is a caller decision rather than an edit here. + always declared and is validated for membership in the declared set, so + the chronicle-era cutover is a caller decision rather than an edit here. """ if not fact_rows: raise ValueError("Refusing to write an empty consumer artifact.") diff --git a/packages/microcosm-build/tests/test_chronicle_epoch.py b/packages/microcosm-build/tests/test_chronicle_epoch.py index f7cdca835..9f1fd4c0e 100644 --- a/packages/microcosm-build/tests/test_chronicle_epoch.py +++ b/packages/microcosm-build/tests/test_chronicle_epoch.py @@ -6,6 +6,12 @@ these tests are the contract that says so: no validator may reject a row for being on the other side of the cutover, and no minted Microcosm identity may move because a source row crossed it. + +The other half of the contract is that acceptance follows a *declaration*. +An identity Microcosm has not been told about is reported as undeclared, not +waved through as Chronicle's — a consumer that inferred issued identity from +the shape of a string would accept anything that happened to be spelled like +a Chronicle key. """ from __future__ import annotations @@ -23,15 +29,26 @@ CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, CHRONICLE_EPOCH, + CHRONICLE_FACT_KEY_DOMAINS, + CHRONICLE_NAMESPACES, + DECLARED_IDENTITIES, + DECLARED_IDENTITY_EPOCHS, EPOCHS, FACT_KEY_FIELDS, - LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + FACT_KEY_IDENTITY_KIND, LEDGER_CONSUMER_FACT_SCHEMA_VERSION, LEDGER_EPOCH, LEDGER_FACT_KEY_DOMAINS, + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, + PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, + UNDECLARED, consumer_artifact_schema_epoch, + consumer_fact_schema_epoch, + declared_identity, fact_key_epoch, + fact_key_epoch_label, feed_fact_key_epochs, + feed_undeclared_fact_key_domains, is_accepted_consumer_artifact_schema_version, is_accepted_consumer_fact_schema_version, is_chronicle_fact_key, @@ -45,6 +62,15 @@ _CHRONICLE_AGGREGATE_KEY = "chronicle.aggregate_fact.v3:abc123" _LEDGER_AGGREGATE_KEY = "ledger.aggregate_fact.v2:abc123" +#: Every consumer-artifact manifest id a real producer stamps. Microcosm's +#: own minted v1 and Chronicle's published v2 are both ledger-era; v3 is the +#: chronicle-era successor. +_ARTIFACT_SCHEMA_IDS_BY_EPOCH = ( + (MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_EPOCH), + (PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_EPOCH), + (CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, CHRONICLE_EPOCH), +) + def _fact_row(**overrides): row = { @@ -67,13 +93,20 @@ def _fact_row(**overrides): def _chronicle_fact_row(**overrides): - """The same row after Chronicle's cutover: every key domain re-epoched.""" + """The same row after Chronicle's cutover: every key domain re-epoched. + + Each successor spelling comes from the declaration table rather than + being written out here, so a row this fixture builds is one the loader + recognises as chronicle-era rather than one it reports as undeclared. + """ row = _fact_row( aggregate_fact_key=_CHRONICLE_AGGREGATE_KEY, semantic_fact_key="chronicle.semantic_fact.v3:abc123", ) row["lineage"] = dict(row["lineage"]) - row["lineage"]["source_cell_keys"] = ["chronicle.source_cell.v3:cell"] + row["lineage"]["source_cell_keys"] = [ + CHRONICLE_FACT_KEY_DOMAINS["source_cell"] + ":cell" + ] row.update(overrides) return row @@ -141,14 +174,15 @@ def test_every_observed_ledger_era_domain_resolves_to_the_ledger_epoch( def test_observed_domain_map_covers_the_captured_feed() -> None: - """The map documents what the repo has actually seen, not a guess. - - ``LEDGER_FACT_KEY_DOMAINS`` claims to record the ledger-era families this - repo's feeds carry, and nothing consults it at runtime — which is exactly - how such a list rots. This pins it to the captured feed. The version - numbers differ by family (``fact`` and ``source_cell`` are v1 where the - rest are v2), which is the concrete reason epoch detection cannot be a - lookup in this map. + """Every domain a real feed carries is one the registry declares. + + ``LEDGER_FACT_KEY_DOMAINS`` is the ledger-era half of the declaration + table, transcribed from Chronicle's own hash-domain constants. This pins + it against the captured feed: a domain the repo has actually seen and the + table has not would make that feed load with an ``undeclared`` witness, + which is a review event, not a silent pass. The version numbers differ by + family (``fact`` and ``source_cell`` are v1 where the rest are v2), which + is the concrete reason a version can never be inferred from a family. """ observed = { key.split(":", 1)[0] for row in _captured_feed_rows() for key in _keys_in(row) @@ -160,23 +194,117 @@ def test_observed_domain_map_covers_the_captured_feed() -> None: ) -def test_chronicle_era_keys_resolve_without_a_declared_version_number() -> None: - """Epoch detection is structural, so undeclared families still resolve. +@pytest.mark.parametrize("domain", sorted(CHRONICLE_FACT_KEY_DOMAINS.values())) +def test_every_declared_chronicle_era_domain_resolves_to_the_chronicle_epoch( + domain: str, +) -> None: + assert fact_key_epoch(f"{domain}:digest") == CHRONICLE_EPOCH + assert fact_key_epoch_label(f"{domain}:digest") == CHRONICLE_EPOCH + assert is_chronicle_fact_key(f"{domain}:digest") + + +def test_each_declared_family_pairs_one_ledger_id_with_one_chronicle_id() -> None: + """The two eras name the same families, one version apart. - chronicle#143 names the ``v3`` spelling for the aggregate and semantic - fact families; it does not say which version number the remaining - families take. A validator that answered "unknown" for those would - fail closed on the cutover, so detection reads the namespace segment - rather than matching a frozen list of domain strings. + Successor spellings are declared, so this pins the shape of the + declaration rather than deriving it at call time: the source-side + families sit at v1/v2 where the derived ones sit at v2/v3, which is + precisely why a version can never be assumed from a family name. """ - for key in ( - _CHRONICLE_AGGREGATE_KEY, - "chronicle.semantic_fact.v3:abc123", + assert set(LEDGER_FACT_KEY_DOMAINS) == set(CHRONICLE_FACT_KEY_DOMAINS) + for family, ledger_domain in LEDGER_FACT_KEY_DOMAINS.items(): + chronicle_domain = CHRONICLE_FACT_KEY_DOMAINS[family] + ledger_version = int(ledger_domain.rsplit(".v", 1)[1]) + chronicle_version = int(chronicle_domain.rsplit(".v", 1)[1]) + assert chronicle_domain == f"chronicle.{family}.v{chronicle_version}" + assert chronicle_version == ledger_version + 1, family + assert LEDGER_FACT_KEY_DOMAINS["source_cell"] == "ledger.source_cell.v1" + assert CHRONICLE_FACT_KEY_DOMAINS["source_cell"] == "chronicle.source_cell.v2" + assert LEDGER_FACT_KEY_DOMAINS["aggregate_fact"] == "ledger.aggregate_fact.v2" + assert CHRONICLE_FACT_KEY_DOMAINS["aggregate_fact"] == ( + "chronicle.aggregate_fact.v3" + ) + + +@pytest.mark.parametrize( + "key", + [ + # source_cell's declared successor is v2; v3 is nobody's spelling. + "chronicle.source_cell.v3:cell", "chronicle.source_cell.v7:cell", "chronicle.some_family_nobody_has_declared_yet.v11:digest", - ): - assert fact_key_epoch(key) == CHRONICLE_EPOCH - assert is_chronicle_fact_key(key) + "chronicle.aggregate_fact.v4:digest", + # A ledger-era namespace can go undeclared the same way. + "ledger.aggregate_fact.v9:digest", + "ledger.invented_family.v1:digest", + # Declared, but as a *schema* id — never as a fact-key domain. + "ledger.consumer_fact.v1:digest", + ], +) +def test_undeclared_chronicle_namespace_keys_are_reported_not_issued(key: str) -> None: + """An undeclared spelling is undeclared, not Chronicle-issued identity. + + Reading the namespace segment tells you where a key *claims* to come + from, not that Chronicle issued it. Treating the claim as identity would + let ``chronicle.anything.vN`` pass as a witnessed Chronicle key, which is + the opposite of what pinning a fact key is for. The claim is still worth + surfacing, so it is labelled ``undeclared`` and reported in provenance. + """ + assert fact_key_epoch(key) is None + assert not is_chronicle_fact_key(key) + assert fact_key_epoch_label(key) == UNDECLARED + + identity = parse_fact_key(key) + assert identity is not None + assert not identity.declared + assert identity.namespace_epoch == CHRONICLE_NAMESPACES[identity.namespace] + + +def test_undeclared_domains_are_named_in_the_feed_report() -> None: + row = _fact_row(semantic_fact_key="chronicle.semantic_fact.v9:abc123") + + assert row_fact_key_epochs(row) == frozenset({LEDGER_EPOCH, UNDECLARED}) + assert feed_fact_key_epochs([row]) == (LEDGER_EPOCH, UNDECLARED) + assert feed_undeclared_fact_key_domains([row]) == ("chronicle.semantic_fact.v9",) + assert feed_undeclared_fact_key_domains([_fact_row()]) == () + + +def test_undeclared_domains_reach_the_artifact_provenance(tmp_path) -> None: + """A release manifest has to name what the build did not recognise.""" + rows = [_fact_row(), _fact_row(source_series_key="chronicle.source_series.v9:s")] + artifact_dir = _write_artifact_dir( + tmp_path, rows, schema_version=PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION + ) + + provenance = load_ledger_consumer_artifact(artifact_dir).provenance() + + assert provenance["fact_key_epochs"] == [LEDGER_EPOCH, UNDECLARED] + assert provenance["undeclared_fact_key_domains"] == ["chronicle.source_series.v9"] + + +def test_the_registry_is_keyed_by_namespace_family_and_version() -> None: + """Every accepted identity comes from one reviewable table. + + The registry, not a parser, is what makes an identity Chronicle's. This + walks it end to end: each declaration round-trips through its + ``(namespace, family, version)`` key, and the epoch a namespace belongs + to always agrees with the epoch the declaration claims. + """ + assert DECLARED_IDENTITIES + for declaration in DECLARED_IDENTITIES: + key = (declaration.namespace, declaration.family, declaration.version) + assert DECLARED_IDENTITY_EPOCHS[key] == declaration.epoch + assert declared_identity(declaration.identity) is declaration + assert CHRONICLE_NAMESPACES[declaration.namespace] == declaration.epoch + assert declaration.epoch in EPOCHS + if declaration.kind == FACT_KEY_IDENTITY_KIND: + assert fact_key_epoch(f"{declaration.identity}:digest") == ( + declaration.epoch + ) + + assert declared_identity("arch.consumer_fact.v1") is None + assert declared_identity("not-an-identity") is None + assert declared_identity(None) is None def test_microcosm_minted_namespaces_are_outside_both_epochs() -> None: @@ -224,7 +352,9 @@ def test_row_epochs_cover_every_key_field_including_nested_lists() -> None: # reports both eras: lineage keys are Chronicle identities too. straddling = _fact_row() straddling["lineage"] = dict(straddling["lineage"]) - straddling["lineage"]["source_cell_keys"] = ["chronicle.source_cell.v3:cell"] + straddling["lineage"]["source_cell_keys"] = [ + CHRONICLE_FACT_KEY_DOMAINS["source_cell"] + ":cell" + ] assert row_fact_key_epochs(straddling) == frozenset({LEDGER_EPOCH, CHRONICLE_EPOCH}) @@ -249,33 +379,88 @@ def test_feed_epochs_report_a_mixed_feed_in_epoch_order() -> None: assert feed_fact_key_epochs([]) == () -def test_schema_id_membership_covers_both_eras_and_nothing_else() -> None: +def test_schema_id_membership_covers_every_real_producer_id() -> None: + """Acceptance is keyed to what producers actually stamp, not to a pair. + + Three artifact ids exist, not two. Microcosm's own minted artifacts + declare ``policyengine_ledger.consumer_artifact.v1``; Chronicle's ``main`` + stamps ``policyengine_ledger.consumer_artifact.v2`` today + (``policyengine_chronicle/consumer.py``); the chronicle-era successor is + ``policyengine_chronicle.consumer_artifact.v3``. A loader that accepted + only the first and the last would reject every artifact Chronicle + publishes right now. + """ assert ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS == { - LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, + PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, } assert ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS == { LEDGER_CONSUMER_FACT_SCHEMA_VERSION, CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, } - assert is_accepted_consumer_artifact_schema_version( - CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION + for schema_id, expected_epoch in _ARTIFACT_SCHEMA_IDS_BY_EPOCH: + assert is_accepted_consumer_artifact_schema_version(schema_id), schema_id + assert consumer_artifact_schema_epoch(schema_id) == expected_epoch, schema_id + assert consumer_fact_schema_epoch(LEDGER_CONSUMER_FACT_SCHEMA_VERSION) == ( + LEDGER_EPOCH ) - assert is_accepted_consumer_fact_schema_version( - CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION + assert consumer_fact_schema_epoch(CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION) == ( + CHRONICLE_EPOCH ) assert not is_accepted_consumer_artifact_schema_version( "policyengine_chronicle.other.v9" ) + # Version numbers are declared, not inferred: the chronicle-era per-row id + # is v2, so v1 under the chronicle namespace is nobody's id. assert not is_accepted_consumer_fact_schema_version("chronicle.consumer_fact.v1") + assert consumer_fact_schema_epoch("chronicle.consumer_fact.v1") is None + # A fact-key domain is a declared identity but not a schema id, and the + # kinds do not leak into one another. + assert not is_accepted_consumer_fact_schema_version("ledger.aggregate_fact.v2") + assert consumer_artifact_schema_epoch(LEDGER_CONSUMER_FACT_SCHEMA_VERSION) is None + + +def test_chronicle_main_manifest_loads_exactly_as_published(tmp_path) -> None: + """The manifest chronicle ``main`` writes today, field for field. + + Mirrors ``build_consumer_artifact`` in ``policyengine_chronicle/consumer.py``: + ``policyengine_ledger.consumer_artifact.v2`` over rows stamped + ``ledger.consumer_fact.v1``, with ``consumer_fact_schema_versions`` and + ``consumer_fact_schema_sha256`` beside the hashes. This is the artifact a + Microcosm build is handed right now, so it is the one that has to load. + """ + rows = [_fact_row(schema_version=LEDGER_CONSUMER_FACT_SCHEMA_VERSION)] + payload = "".join(json.dumps(row, sort_keys=True) + "\n" for row in rows) + artifact_dir = tmp_path / "chronicle-main" + artifact_dir.mkdir() + (artifact_dir / "consumer_facts.jsonl").write_text(payload) + (artifact_dir / "manifest.json").write_text( + json.dumps( + { + "schema_version": PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, + "consumer_fact_schema_versions": [LEDGER_CONSUMER_FACT_SCHEMA_VERSION], + "consumer_fact_schema_sha256": "cd" * 32, + "fact_row_count": len(rows), + "facts_sha256": hashlib.sha256(payload.encode()).hexdigest(), + }, + indent=2, + sort_keys=True, + ) + + "\n" + ) + + artifact = load_ledger_consumer_artifact(artifact_dir) + + assert artifact.schema_version == PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION + assert artifact.schema_epoch == LEDGER_EPOCH + assert artifact.fact_schema_versions == (LEDGER_CONSUMER_FACT_SCHEMA_VERSION,) + assert artifact.fact_key_epochs == (LEDGER_EPOCH,) + assert artifact.undeclared_fact_key_domains == () @pytest.mark.parametrize( - ("schema_version", "expected_epoch"), - [ - (LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_EPOCH), - (CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, CHRONICLE_EPOCH), - ], + ("schema_version", "expected_epoch"), _ARTIFACT_SCHEMA_IDS_BY_EPOCH ) def test_artifact_loads_under_each_schema_id_and_records_the_observed_one( tmp_path, schema_version: str, expected_epoch: str @@ -346,7 +531,7 @@ def test_bare_feed_has_no_schema_epoch_but_still_reports_fact_key_epochs( assert provenance["fact_key_epochs"] == list(EPOCHS) -def test_unknown_schema_id_is_rejected_naming_both_accepted_eras(tmp_path) -> None: +def test_unknown_schema_id_is_rejected_naming_every_accepted_id(tmp_path) -> None: artifact_dir = _write_artifact_dir( tmp_path, [_fact_row()], schema_version="policyengine_chronicle.other.v9" ) @@ -356,8 +541,49 @@ def test_unknown_schema_id_is_rejected_naming_both_accepted_eras(tmp_path) -> No message = str(excinfo.value) assert "schema_version" in message - assert LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION in message - assert CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION in message + for schema_id, _epoch in _ARTIFACT_SCHEMA_IDS_BY_EPOCH: + assert schema_id in message, schema_id + + +@pytest.mark.parametrize( + "schema_version", + [ + ["policyengine_ledger.consumer_artifact.v1"], + {"id": "policyengine_ledger.consumer_artifact.v1"}, + {}, + [], + 1, + True, + None, + ], +) +def test_malformed_schema_version_types_raise_the_documented_error( + tmp_path, schema_version +) -> None: + """A JSON list or object where a schema id belongs is *unsupported*. + + ``schema_version`` arrives from an untrusted manifest, so its type is not + guaranteed. A membership test against a frozenset raises ``TypeError`` on + an unhashable value, which would escape the loader as a bare + ``unhashable type: 'list'`` instead of the message that names what the + loader accepts. The predicate is total over JSON so the loader's own + error is the one an operator sees. + """ + artifact_dir = _write_artifact_dir( + tmp_path, [_fact_row()], schema_version=schema_version + ) + + assert not is_accepted_consumer_artifact_schema_version(schema_version) + assert not is_accepted_consumer_fact_schema_version(schema_version) + assert consumer_artifact_schema_epoch(schema_version) is None + assert consumer_fact_schema_epoch(schema_version) is None + + with pytest.raises(ValueError) as excinfo: + load_ledger_consumer_artifact(artifact_dir) + + assert "Unsupported Chronicle consumer artifact schema_version" in str( + excinfo.value + ) @pytest.mark.parametrize( @@ -450,7 +676,9 @@ def test_every_published_key_field_is_witnessed_for_its_epoch() -> None: row_keys = _fact_row() row_keys["lineage"] = dict(row_keys["lineage"]) - row_keys["lineage"]["source_row_keys"] = ["chronicle.source_row.v3:row"] + row_keys["lineage"]["source_row_keys"] = [ + CHRONICLE_FACT_KEY_DOMAINS["source_row"] + ":row" + ] assert row_fact_key_epochs(row_keys) == frozenset({LEDGER_EPOCH, CHRONICLE_EPOCH}) diff --git a/packages/microcosm-build/tests/test_ledger_targets.py b/packages/microcosm-build/tests/test_ledger_targets.py index 60e6e7837..cf441548d 100644 --- a/packages/microcosm-build/tests/test_ledger_targets.py +++ b/packages/microcosm-build/tests/test_ledger_targets.py @@ -2957,7 +2957,7 @@ def test__given_mixed_epoch_fact_feed__then_both_eras_compile_to_targets() -> No semantic_fact_key="chronicle.semantic_fact.v3:def456", lineage={ "source_record_id": "irs_soi.ty2024.table_1_1.all.adjusted_gross_income", - "source_cell_keys": ["chronicle.source_cell.v3:cell"], + "source_cell_keys": ["chronicle.source_cell.v2:cell"], "source_row_keys": [], }, ) diff --git a/packages/microcosm-build/tests/test_us_trade_facts.py b/packages/microcosm-build/tests/test_us_trade_facts.py index 08ab5b100..e7b233669 100644 --- a/packages/microcosm-build/tests/test_us_trade_facts.py +++ b/packages/microcosm-build/tests/test_us_trade_facts.py @@ -9,8 +9,8 @@ from microcosm.build.chronicle_epoch import ( CHRONICLE_CONSUMER_ARTIFACT_SCHEMA_VERSION, - LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION, LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, ) from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.ledger_targets import ( @@ -841,7 +841,9 @@ def test_minted_artifact_declares_the_ledger_era_id_and_loads_under_either(tmp_p retrieval_manifest=_manifest_entries(), generator=default_generator_block(months=("2026-01", "2026-02")), ) - assert default_manifest["schema_version"] == LEDGER_CONSUMER_ARTIFACT_SCHEMA_VERSION + assert ( + default_manifest["schema_version"] == MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION + ) # Every row's key stays in Microcosm's own frozen namespace, outside both # Chronicle eras, so the cutover cannot re-identify them (microcosm#639). assert all( From 05cd32e78e5bedaa03d65aea2ee9a4cf3ee72beb Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:10:21 -0400 Subject: [PATCH 16/33] Cut every test in the build shard off from a live Logbook MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The per-module delenv lists named POPULACE_LEDGER_* only, because they were written before the LOGBOOK_* spelling existed. A shell exporting the preferred names — a developer who just ran an export, a runner where the variables are set for a later job — walked straight past them: logbook._remote_config() returns ('https://example.invalid', 'x', 'x') under LOGBOOK_URL/LOGBOOK_KEY alone, and the append path would then POST to it. The store is append-only, so a row that lands cannot be retracted. An autouse conftest fixture now clears both generations of every variable in the dual-read window, taken from the window itself so a variable added there cannot leave a hole here, plus POPULACE_LOGBOOK_PREV_ROW_DIGEST. The second, independent guard replaces the Logbook urlopen with one that raises — on every module currently holding it, since tools/logbook.py binds the name at import, and on the opener it delegates to, which closes the path for any importer this does not find. allow_logbook_network restores the real callables for a test that means it; nothing in the suite asks for it. Co-Authored-By: Claude Fable 5.1 --- packages/microcosm-build/tests/conftest.py | 112 +++++++++++++++++- .../tests/test_logbook_isolation.py | 94 +++++++++++++++ 2 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 packages/microcosm-build/tests/test_logbook_isolation.py diff --git a/packages/microcosm-build/tests/conftest.py b/packages/microcosm-build/tests/conftest.py index ac3f6b9dc..cffd6547f 100644 --- a/packages/microcosm-build/tests/conftest.py +++ b/packages/microcosm-build/tests/conftest.py @@ -1,5 +1,7 @@ -"""Shared fixtures: a small person+household frame, and an ODS writer.""" +"""Shared fixtures: a small person+household frame, an ODS writer, and the +autouse guard that keeps every test in this shard away from a live Logbook.""" +import sys from pathlib import Path from zipfile import ZIP_DEFLATED, ZIP_STORED, ZipFile @@ -104,3 +106,111 @@ class ODSBuilder: def ods() -> ODSBuilder: """Helpers for writing a small ODS file to a temporary path.""" return ODSBuilder() + + +# --- Logbook isolation -------------------------------------------------- +# +# The Logbook live store is append-only: a row that reaches it cannot be +# taken back. These tests must never be able to reach it, and "must never" +# has to hold in a shell that already has an operator's credentials +# exported — a developer who has just run an export, or a runner where the +# variables are set for a later job. Per-module ``delenv`` lists did not +# hold: they were written before the ``LOGBOOK_*`` spelling existed, so a +# shell carrying the new names walked straight past them into +# ``_remote_config()`` and out to Supabase. +# +# Two independent guards, because either one alone is a single point of +# failure: the environment is cleared for every test, and the Logbook +# network call is replaced with one that raises. A test that means to +# exercise the remote path stubs ``urlopen`` itself, as several already do; +# a test that means to reach the real network asks for +# ``allow_logbook_network`` and says so in its own body. + + +def _logbook_environment_names() -> tuple[str, ...]: + """Every environment variable that can point tests at a live Logbook. + + Both generations of the dual-read window, taken from the window itself + rather than restated, so adding a variable there cannot leave a hole + here. ``POPULACE_LOGBOOK_PREV_ROW_DIGEST`` is not in the window (it has + only ever had one spelling) but it is read from the environment and it + changes which chain a row claims to extend, so it is cleared too. + """ + from microcosm.build.logbook_env import LOGBOOK_ENV_LEGACY_NAMES + + names = {"POPULACE_LOGBOOK_PREV_ROW_DIGEST"} + for preferred, legacy_names in LOGBOOK_ENV_LEGACY_NAMES.items(): + names.add(preferred) + names.update(legacy_names) + return tuple(sorted(names)) + + +class UnstubbedLogbookNetworkError(AssertionError): + """Raised when a test reaches the Logbook live store for real.""" + + +def _refuse_logbook_network(*_args: object, **_kwargs: object) -> None: + raise UnstubbedLogbookNetworkError( + "A test tried to open a real Logbook HTTP request. The live store is " + "append-only, so this is never a harmless mistake. Stub the module's " + "'urlopen' (see test_logbook.py) to exercise the remote path, or " + "request the 'allow_logbook_network' fixture if the network is " + "genuinely the thing under test." + ) + + +def _logbook_urlopen_holders(real_urlopen: object) -> list[object]: + """Every imported module whose ``urlopen`` is the Logbook one. + + ``tools/logbook.py`` binds the function at import + (``from microcosm.build.logbook import urlopen``), so patching the + defining module alone leaves the CLI's copy live. Rather than name the + importers — the next one would be missed — this finds every module + currently holding the same object. + """ + return [ + module + for module in list(sys.modules.values()) + if getattr(module, "urlopen", None) is real_urlopen + ] + + +@pytest.fixture(autouse=True) +def _isolate_logbook(monkeypatch: pytest.MonkeyPatch) -> dict[str, object]: + """Detach every test from any live Logbook the shell may point at. + + Returns the callables it displaced, so the opt-in fixture below can put + the real ones back without having to guess what they were. + """ + from microcosm.build import logbook + + for name in _logbook_environment_names(): + monkeypatch.delenv(name, raising=False) + + displaced = { + "urlopen": logbook.urlopen, + "open": logbook._NO_REDIRECT_OPENER.open, + } + for module in _logbook_urlopen_holders(displaced["urlopen"]): + monkeypatch.setattr(module, "urlopen", _refuse_logbook_network) + # The opener is what a surviving reference to the real ``urlopen`` would + # ultimately call, so guarding it closes the path even for a caller this + # fixture did not find. + monkeypatch.setattr(logbook._NO_REDIRECT_OPENER, "open", _refuse_logbook_network) + return displaced + + +@pytest.fixture +def allow_logbook_network( + monkeypatch: pytest.MonkeyPatch, _isolate_logbook: dict[str, object] +) -> None: + """Opt back in to real Logbook HTTP. Nothing in this suite should need it. + + It exists so the guard above is a policy with a documented exception + rather than a wall, and so the guard itself can be tested. + """ + from microcosm.build import logbook + + for module in _logbook_urlopen_holders(_refuse_logbook_network): + monkeypatch.setattr(module, "urlopen", _isolate_logbook["urlopen"]) + monkeypatch.setattr(logbook._NO_REDIRECT_OPENER, "open", _isolate_logbook["open"]) diff --git a/packages/microcosm-build/tests/test_logbook_isolation.py b/packages/microcosm-build/tests/test_logbook_isolation.py new file mode 100644 index 000000000..cb38af7bf --- /dev/null +++ b/packages/microcosm-build/tests/test_logbook_isolation.py @@ -0,0 +1,94 @@ +"""The suite cannot reach a live Logbook, however the shell is configured. + +The Logbook live store is append-only. A test that appends to it has written +a row nobody can retract, into the chain a real release will later have to +validate. So the guarantee this file pins is not "tests usually do not use +the network" — it is that a test *cannot* reach the store even when the +developer or runner shell is fully credentialed, under either generation of +the variable names. + +The guard itself lives in ``conftest.py`` as an autouse fixture, which is +what makes it total: nothing has to remember to ask for it. +""" + +from __future__ import annotations + +import os + +import pytest + +from microcosm.build import logbook +from microcosm.build.logbook_env import LOGBOOK_ENV_LEGACY_NAMES, logbook_env + +_ALL_LOGBOOK_ENV_NAMES = tuple( + sorted( + {name for name in LOGBOOK_ENV_LEGACY_NAMES} + | { + legacy + for legacy_names in LOGBOOK_ENV_LEGACY_NAMES.values() + for legacy in legacy_names + } + | {"POPULACE_LOGBOOK_PREV_ROW_DIGEST"} + ) +) + + +@pytest.mark.parametrize("name", _ALL_LOGBOOK_ENV_NAMES) +def test_no_logbook_variable_survives_into_a_test(name: str) -> None: + """Both generations are cleared, not just the ledger-era spelling. + + The per-module ``delenv`` lists this fixture replaced named only + ``POPULACE_LEDGER_*``. They were written before ``LOGBOOK_*`` existed, so + a shell exporting the preferred names walked straight past them. + """ + assert name not in os.environ + + +def test_remote_config_is_unconfigured_regardless_of_the_shell() -> None: + """``_remote_config`` is the gate every write to the live store passes.""" + assert logbook._remote_config() is None + for name in LOGBOOK_ENV_LEGACY_NAMES: + assert logbook_env(name) is None + + +def test_the_logbook_network_call_is_refused_by_default() -> None: + """An unstubbed request raises instead of leaving the machine.""" + with pytest.raises(AssertionError, match="real Logbook HTTP request"): + logbook.urlopen(object(), timeout=1.0) + + +def test_the_underlying_opener_is_refused_too() -> None: + """The second guard: a stale reference to the real ``urlopen``. + + ``tools/logbook.py`` binds ``urlopen`` at import time, and a future + importer could do the same. Guarding the opener the real function + delegates to closes that path without having to enumerate importers. + """ + with pytest.raises(AssertionError, match="real Logbook HTTP request"): + logbook._NO_REDIRECT_OPENER.open(object(), timeout=1.0) + + +def test_appending_a_row_to_a_polluted_environment_writes_nothing() -> None: + """The end-to-end shape of the accident this prevents. + + With credentials in the environment, ``_remote_config`` would return them + and the append would POST to Supabase. Here it is unconfigured, so the + remote leg is skipped entirely — no request is attempted, which is why + this passes rather than raising the guard's error. + """ + assert logbook._remote_config() is None + + +def test_the_opt_in_fixture_restores_the_real_callables( + allow_logbook_network, +) -> None: + """The guard is a policy with a documented exception, not a wall. + + Nothing in this suite opts in. The fixture exists so a test that genuinely + needs the network can say so in its own body, and so the restoration path + is exercised rather than assumed. No request is made here: this asserts + only that the shipped callables are back in place. + """ + assert logbook.urlopen.__module__ == logbook.__name__ + assert logbook.urlopen.__name__ == "urlopen" + assert logbook._NO_REDIRECT_OPENER.open.__self__ is logbook._NO_REDIRECT_OPENER From 1f5619dea7a939ba2525f11305fb725de6799855 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:11:41 -0400 Subject: [PATCH 17/33] Stop the barrel shadowing logbook_env, and export the Chronicle commit alias MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit microcosm.build re-exported the reader function logbook_env under the same name as its module. 'import a.b as c' returns the attribute when the package has one, so 'import microcosm.build.logbook_env as env' handed back the function and every env.LOGBOOK_URL_ENV after it raised AttributeError. The barrel now re-exports only logbook_env_names, which collides with nothing; the function is imported from its own module, as logbook.py and tools/logbook.py already do. CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT was added beside the ledger-era pin but never re-exported, so it was importable from source_coverage and not from the us_runtime barrel its sibling reaches — an alias only half the callers could use. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/__init__.py | 18 ++++++++++-- .../microcosm/build/us_runtime/__init__.py | 2 ++ .../microcosm-build/tests/test_logbook_env.py | 29 +++++++++++++++++++ .../tests/test_us_source_coverage.py | 27 +++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/__init__.py b/packages/microcosm-build/src/microcosm/build/__init__.py index 17ca54703..b50754703 100644 --- a/packages/microcosm-build/src/microcosm/build/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/__init__.py @@ -53,10 +53,15 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS, CHRONICLE_EPOCH, + DECLARED_IDENTITIES, + DECLARED_IDENTITY_EPOCHS, EPOCHS, LEDGER_EPOCH, + UNDECLARED, fact_key_epoch, + fact_key_epoch_label, feed_fact_key_epochs, + feed_undeclared_fact_key_domains, is_chronicle_fact_key, parse_fact_key, ) @@ -137,8 +142,13 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: select_ledger_targets_from_jsonl, target_spec_from_ledger_fact, ) + +# Only ``logbook_env_names`` is re-exported here. The reader function is +# spelled ``logbook_env`` — the same name as its module — so binding it on +# the package would make ``import microcosm.build.logbook_env as env`` hand +# back the function instead of the module. Import the function from its +# module: ``from microcosm.build.logbook_env import logbook_env``. from microcosm.build.logbook_env import ( # noqa: E402 - after the compat gate - logbook_env, logbook_env_names, ) from microcosm.build.monetary_profile import ( # noqa: E402 - after compat gate @@ -214,8 +224,11 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS", "ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS", "CHRONICLE_EPOCH", + "DECLARED_IDENTITIES", + "DECLARED_IDENTITY_EPOCHS", "EPOCHS", "LEDGER_EPOCH", + "UNDECLARED", "LedgerConsumerArtifact", "LedgerTargetMapping", "LedgerTargetSelection", @@ -224,10 +237,11 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "MonetaryTargetProfile", "PreparedMonetaryMeasure", "add_ledger_artifact_args", - "logbook_env", "logbook_env_names", "fact_key_epoch", + "fact_key_epoch_label", "feed_fact_key_epochs", + "feed_undeclared_fact_key_domains", "is_chronicle_fact_key", "parse_fact_key", "aggregate_admin_gate", diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/us_runtime/__init__.py index 518baacb6..9437b99e8 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/__init__.py @@ -885,6 +885,7 @@ with_us_snap_take_up_inputs, ) from microcosm.build.us_runtime.source_coverage import ( + CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT, LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT, US_SOURCE_COVERAGE, hard_target_package_aliases, @@ -1107,6 +1108,7 @@ "SimpleTaxExpenditureReform", "ReformValidationSpec", "REFORM_VALIDATION_SCHEMA_VERSION", + "CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT", "LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT", "AgeBand", "AGE_BANDS", diff --git a/packages/microcosm-build/tests/test_logbook_env.py b/packages/microcosm-build/tests/test_logbook_env.py index b06205773..5357f2591 100644 --- a/packages/microcosm-build/tests/test_logbook_env.py +++ b/packages/microcosm-build/tests/test_logbook_env.py @@ -174,3 +174,32 @@ def test_logbook_remote_config_reads_both_eras(monkeypatch) -> None: "logbook-jwt", "project-api-key", ) + + +def test_the_module_import_binds_the_module_not_the_reader() -> None: + """``import microcosm.build.logbook_env as env`` must give the module. + + The reader function shares its module's name. Re-exporting it from the + package barrel bound the function to ``microcosm.build.logbook_env``, and + ``import a.b as c`` returns the *attribute* when one exists — so the + submodule import silently handed back a callable, and every + ``env.LOGBOOK_URL_ENV`` after it raised ``AttributeError``. The barrel + therefore does not re-export the function; callers import it from here. + """ + import types + + import microcosm.build + import microcosm.build.logbook_env as env + + assert isinstance(env, types.ModuleType) + assert env.__name__ == "microcosm.build.logbook_env" + assert env.LOGBOOK_URL_ENV == LOGBOOK_URL_ENV + assert callable(env.logbook_env) + # The package attribute is the module too: `from microcosm.build import + # logbook_env` and the submodule import must not disagree about what the + # name means. + assert microcosm.build.logbook_env is env + assert "logbook_env" not in microcosm.build.__all__ + # The non-colliding helper is still re-exported, so removing the shadow + # did not quietly shrink the barrel further than it had to. + assert microcosm.build.logbook_env_names is logbook_env_names diff --git a/packages/microcosm-build/tests/test_us_source_coverage.py b/packages/microcosm-build/tests/test_us_source_coverage.py index 9f6b3096e..996967785 100644 --- a/packages/microcosm-build/tests/test_us_source_coverage.py +++ b/packages/microcosm-build/tests/test_us_source_coverage.py @@ -4,6 +4,7 @@ from microcosm.build.gates import GateReport from microcosm.build.us_runtime.source_coverage import ( + CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT, LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT, hard_target_package_aliases, source_gap_family_ids, @@ -14,8 +15,34 @@ ) +def test_both_contract_commit_spellings_reach_the_us_runtime_barrel() -> None: + """The Chronicle-named alias is importable everywhere its sibling is. + + The alias was added beside the ledger-era pin in ``source_coverage`` but + not re-exported, so ``from microcosm.build.us_runtime import + CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT`` failed while the ledger-era + name resolved — an alias only half of the callers could use. Both name the + same commit; neither is a second pin. + """ + from microcosm.build import us_runtime + + assert ( + us_runtime.CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT + is us_runtime.LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT + ) + for name in ( + "CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT", + "LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT", + ): + assert name in us_runtime.__all__, name + + def test_us_source_coverage_snapshot_has_expected_roles() -> None: assert len(LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT) == 40 + assert ( + CHRONICLE_US_SOURCE_COVERAGE_CONTRACT_COMMIT + == LEDGER_US_SOURCE_COVERAGE_CONTRACT_COMMIT + ) assert "soi-filing-season-week47-2024-eitc-total" in hard_target_package_aliases() assert "ssa-ssi-table-7b1-2024" in hard_target_package_aliases() assert "cms-aca-oep-state-level" in hard_target_package_aliases() From e5111760de8272e3d2bc6ac96211976938e3c974 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:17:07 -0400 Subject: [PATCH 18/33] Carry the Chronicle epoch witnesses into the UK run's own evidence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _ledger_provenance rebuilt the block from the artifact field by field, which is how it came to record facts_sha256, fact_row_count and manifest_sha256 but not schema_epoch, fact_key_epochs or fact_schema_versions. The loader had already worked out which era resolved the targets; the UK run reported only the hashes, so a signed diagnostics file could not say whether a cutover-window feed had straddled the rename. It now delegates to LedgerConsumerArtifact.provenance() and keeps only the manifest sub-block UK-shaped, because that one feeds the run's identity digest and is deliberately narrow. A stand-in without the shared method still records what it carries rather than fabricating the rest. Coverage is a real mixed-epoch artifact through run_uk_calibration: a Chronicle-main manifest id over ledger-era and chronicle-era rows plus one undeclared Chronicle-namespace key, asserted in the build record and in the diagnostics 'build' block. The delegation itself is pinned as a property — every shared field reaches the UK block — rather than as a list that would go stale the next time the shared block grows. Co-Authored-By: Claude Fable 5.1 --- .../build/uk_runtime/calibration_run.py | 51 +++- .../tests/test_uk_calibration_run.py | 235 ++++++++++++++++-- 2 files changed, 261 insertions(+), 25 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 6864a9eff..527961aa0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -919,23 +919,62 @@ def uk_aggregate_admin_totals( return totals, receipt +#: The manifest fields the UK run seals into ``run_config``. Narrower than +#: the artifact's whole manifest on purpose: only the fields that identify +#: *which* published artifact was compiled belong in the identity digest. +_LEDGER_MANIFEST_IDENTITY_FIELDS = ( + "artifact_id", + "profile", + "schema_version", + "generated_at", +) + +#: Epoch witnesses :meth:`LedgerConsumerArtifact.provenance` supplies, split +#: by shape. Named here so the delegation below cannot quietly drop one: a +#: run that compiled a chronicle-era or mixed-epoch feed has to say so in its +#: own evidence, not only in the loader's return value +#: (PolicyEngine/chronicle#143). +_LEDGER_EPOCH_WITNESS_SCALARS = ("schema_epoch",) +_LEDGER_EPOCH_WITNESS_LISTS = ( + "fact_key_epochs", + "undeclared_fact_key_domains", + "fact_schema_versions", +) + + def _ledger_provenance(artifact: Any) -> dict[str, object]: - """The verified identity of the Ledger consumer feed this run compiled. + """The verified identity of the Chronicle consumer feed this run compiled. + + Delegates to :meth:`microcosm.build.ledger_artifact.LedgerConsumerArtifact.provenance` + rather than rebuilding the block field by field. Rebuilding it is how the + epoch witnesses went missing here in the first place: the loader learned + which era resolved the targets and the UK run kept reporting only the + hashes. Anything the shared block gains, this block gains. + + Only the manifest sub-block is UK-shaped, and it stays narrow because it + feeds the run's identity digest. A bare ``consumer_facts.jsonl`` feed carries no manifest, so its - Ledger-side provenance is recorded as absent rather than invented. + Chronicle-side provenance is recorded as absent rather than invented. So + is a stand-in that predates the shared block: the fields it cannot supply + are recorded ``None``/empty rather than fabricated. """ + shared = getattr(artifact, "provenance", None) + block: Mapping[str, Any] = shared() if callable(shared) else {} provenance: dict[str, object] = { - "facts_sha256": getattr(artifact, "facts_sha256", None), - "fact_row_count": getattr(artifact, "fact_row_count", None), - "manifest_sha256": getattr(artifact, "manifest_sha256", None), + field: block.get(field, getattr(artifact, field, None)) + for field in ("facts_sha256", "fact_row_count", "manifest_sha256") } + for field in _LEDGER_EPOCH_WITNESS_SCALARS: + provenance[field] = block.get(field) + for field in _LEDGER_EPOCH_WITNESS_LISTS: + provenance[field] = list(block.get(field) or ()) manifest = getattr(artifact, "manifest", None) if isinstance(manifest, Mapping): provenance["manifest"] = { key: manifest.get(key) - for key in ("artifact_id", "profile", "schema_version", "generated_at") + for key in _LEDGER_MANIFEST_IDENTITY_FIELDS if manifest.get(key) is not None } return provenance diff --git a/packages/microcosm-build/tests/test_uk_calibration_run.py b/packages/microcosm-build/tests/test_uk_calibration_run.py index 5781eb777..08405c963 100644 --- a/packages/microcosm-build/tests/test_uk_calibration_run.py +++ b/packages/microcosm-build/tests/test_uk_calibration_run.py @@ -10,7 +10,13 @@ import pandas as pd import pytest +from microcosm.build.chronicle_epoch import ( + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, +) from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.logbook import canonical_json_bytes from microcosm.build.uk_runtime import calibration_run from microcosm.build.uk_runtime.calibration_run import ( @@ -137,9 +143,7 @@ def _write_spine_sidecar( entity: int(len(frame.table(entity))) for entity in frame.entities }, "household_weight_kind": uk_household_weight_kind(frame).value, - "household_weight_total": float( - frame.weights_for("household").values.sum() - ), + "household_weight_total": float(frame.weights_for("household").values.sum()), } sidecar.update(overrides) input_h5.with_suffix(".build.json").write_text( @@ -178,8 +182,13 @@ def _admin_anchor_values(): def test_gate_scope_classifies_every_uk_gate(): all_ids = {entry.id for entry in load_country_spec("uk").gates.gates} - assert set(UK_CALIBRATION_GATE_SCOPE) | set(UK_CALIBRATION_GATE_SCOPE_EXCLUSIONS) == all_ids - assert set(UK_CALIBRATION_GATE_SCOPE).isdisjoint(UK_CALIBRATION_GATE_SCOPE_EXCLUSIONS) + assert ( + set(UK_CALIBRATION_GATE_SCOPE) | set(UK_CALIBRATION_GATE_SCOPE_EXCLUSIONS) + == all_ids + ) + assert set(UK_CALIBRATION_GATE_SCOPE).isdisjoint( + UK_CALIBRATION_GATE_SCOPE_EXCLUSIONS + ) assert all(UK_CALIBRATION_GATE_SCOPE_EXCLUSIONS.values()) @@ -233,9 +242,15 @@ def test_run_uk_calibration_writes_cross_pinned_outputs(monkeypatch, tmp_path: P assert paths.diagnostics_json.exists() assert paths.build_record_json.exists() assert paths.terminal_gate_json.exists() - assert result.build_record["artifacts"]["staging_h5"]["sha256"] == _sha(paths.staging_h5) - assert result.build_record["artifacts"]["diagnostics_json"]["sha256"] == _sha(paths.diagnostics_json) - assert result.build_record["artifacts"]["terminal_gate_json"]["sha256"] == _sha(paths.terminal_gate_json) + assert result.build_record["artifacts"]["staging_h5"]["sha256"] == _sha( + paths.staging_h5 + ) + assert result.build_record["artifacts"]["diagnostics_json"]["sha256"] == _sha( + paths.diagnostics_json + ) + assert result.build_record["artifacts"]["terminal_gate_json"]["sha256"] == _sha( + paths.terminal_gate_json + ) # The record makes no shippability claim of its own — the hand-written # literal retired with the #757 release-cut audit — and instead points # at the certification artifact whose verdict is authoritative. @@ -251,9 +266,13 @@ def test_run_uk_calibration_writes_cross_pinned_outputs(monkeypatch, tmp_path: P assert spine_provenance["stage_records"] == spine_sidecar["stage_records"] assert spine_provenance["stage_evidence"] == spine_sidecar["stage_evidence"] assert spine_provenance["artifact_pins"] == spine_sidecar["artifact_pins"] - assert spine_provenance["input_artifact_pins"] == spine_sidecar["input_artifact_pins"] + assert ( + spine_provenance["input_artifact_pins"] == spine_sidecar["input_artifact_pins"] + ) assert spine_provenance["resource_pins"] == spine_sidecar["resource_pins"] - assert spine_provenance["stage_artifact_pins"] == spine_sidecar["stage_artifact_pins"] + assert ( + spine_provenance["stage_artifact_pins"] == spine_sidecar["stage_artifact_pins"] + ) assert spine_provenance["declared_seeds"] == spine_sidecar["declared_seeds"] assert spine_provenance["rules_engine"] == spine_sidecar["rules_engine"] assert spine_provenance["source_vintages"] == spine_sidecar["source_vintages"] @@ -272,7 +291,10 @@ def test_run_uk_calibration_writes_cross_pinned_outputs(monkeypatch, tmp_path: P signature = attestation["signature"] attestation["signature"] = None key = b"0123456789abcdef0123456789abcdef" - assert hmac.new(key, canonical_json_bytes(report), hashlib.sha256).hexdigest() == signature + assert ( + hmac.new(key, canonical_json_bytes(report), hashlib.sha256).hexdigest() + == signature + ) assert result.logbook_spool.exists() @@ -456,10 +478,13 @@ def test_run_uk_calibration_refuses_input_sha_before_outputs(tmp_path: Path): doctrine_overrides={}, measure_resolver=None, source_pins={ - "input_h5": {"sha256": _sha(input_h5), "size_bytes": input_h5.stat().st_size} + "input_h5": { + "sha256": _sha(input_h5), + "size_bytes": input_h5.stat().st_size, + } }, run_config_extra={"calibration_year": 2025}, - release_id="bad-sha", + release_id="bad-sha", ) assert not paths.staging_h5.exists() assert not paths.diagnostics_json.exists() @@ -496,7 +521,7 @@ def test_run_uk_calibration_refuses_absent_input_sidecar(tmp_path: Path): } }, run_config_extra={"calibration_year": 2025}, - release_id="missing-sidecar", + release_id="missing-sidecar", ) assert not paths.staging_h5.exists() @@ -549,7 +574,7 @@ def test_run_uk_calibration_refuses_unbound_input_sidecar( } }, run_config_extra={"calibration_year": 2025}, - release_id="unbound-sidecar", + release_id="unbound-sidecar", ) assert not paths.staging_h5.exists() @@ -612,7 +637,10 @@ def test_seam_never_modifies_data_variables(monkeypatch, tmp_path: Path): doctrine_overrides={}, measure_resolver=None, source_pins={ - "input_h5": {"sha256": _sha(input_h5), "size_bytes": input_h5.stat().st_size} + "input_h5": { + "sha256": _sha(input_h5), + "size_bytes": input_h5.stat().st_size, + } }, run_config_extra={}, release_id="invariant-run", @@ -749,7 +777,7 @@ def test_refusal_records_a_failed_attempt_and_stages_nothing(tmp_path: Path): } }, run_config_extra={"calibration_year": 2025}, - release_id="refused-run", + release_id="refused-run", ) # Every terminal disposition is a row; a refusal that left the chain @@ -806,7 +834,7 @@ def test_attempt_ids_are_unique_across_reruns_of_one_release( measure_resolver=None, source_pins=source_pins, run_config_extra={"calibration_year": 2025}, - release_id="one-release-id", + release_id="one-release-id", ) build_ids.append(result.build_record["build_id"]) @@ -857,7 +885,10 @@ def test_verified_ledger_identity_reaches_the_run_evidence(monkeypatch, tmp_path doctrine_overrides={}, measure_resolver=None, source_pins={ - "input_h5": {"sha256": _sha(input_h5), "size_bytes": input_h5.stat().st_size} + "input_h5": { + "sha256": _sha(input_h5), + "size_bytes": input_h5.stat().st_size, + } }, run_config_extra={"calibration_year": 2025}, release_id="ledger-identity", @@ -875,3 +906,169 @@ def test_verified_ledger_identity_reaches_the_run_evidence(monkeypatch, tmp_path # A bare feed carries no manifest, and that absence is recorded rather # than invented. assert calibration_run._ledger_provenance(object())["manifest_sha256"] is None + + +def _consumer_fact_row( + *, + aggregate_fact_key: str, + semantic_fact_key: str, + schema_version: str, + source_release_key: str | None = None, +) -> dict: + row = { + "aggregate_fact_key": aggregate_fact_key, + "semantic_fact_key": semantic_fact_key, + "schema_version": schema_version, + "value": 1.0, + "period": {"type": "tax_year", "value": 2025}, + "geography": {"level": "country", "id": "K02000001"}, + "entity": {"name": "household"}, + "aggregation": {"method": "sum"}, + "observed_measure": {"source_name": "ons", "unit": "gbp"}, + "source": {"source_name": "ons"}, + "lineage": {"source_record_id": "ons.2025.total"}, + } + if source_release_key is not None: + row["source_release_key"] = source_release_key + return row + + +def _mixed_epoch_artifact_dir(tmp_path: Path) -> Path: + """A cutover-window feed: ledger-era history, chronicle-era rows, and one + Chronicle-namespace key spelling nothing declares. + + The manifest declares what Chronicle's ``main`` stamps today + (``policyengine_ledger.consumer_artifact.v2``), so this is the shape a UK + run is handed now, not a hypothetical one. + """ + rows = [ + _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:aaa", + semantic_fact_key="ledger.semantic_fact.v2:aaa", + schema_version=LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + ), + _consumer_fact_row( + aggregate_fact_key="chronicle.aggregate_fact.v3:bbb", + semantic_fact_key="chronicle.semantic_fact.v3:bbb", + schema_version=CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + ), + _consumer_fact_row( + aggregate_fact_key="ledger.aggregate_fact.v2:ccc", + semantic_fact_key="ledger.semantic_fact.v2:ccc", + schema_version=LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + source_release_key="chronicle.source_release.v9:undeclared", + ), + ] + artifact_dir = tmp_path / "chronicle-artifact" + artifact_dir.mkdir() + payload = "".join(json.dumps(row, sort_keys=True) + "\n" for row in rows) + (artifact_dir / "consumer_facts.jsonl").write_text(payload) + (artifact_dir / "manifest.json").write_text( + json.dumps( + { + "schema_version": PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION, + "artifact_id": "chronicle-uk-artifact-mixed", + "profile": "uk-national", + "fact_row_count": len(rows), + "facts_sha256": hashlib.sha256(payload.encode()).hexdigest(), + }, + indent=2, + sort_keys=True, + ) + + "\n" + ) + return artifact_dir + + +def test_mixed_epoch_feed_epochs_reach_the_uk_release_evidence(monkeypatch, tmp_path): + """A UK run says which Chronicle era resolved its targets. + + The run's own provenance block used to be assembled field by field from + the artifact, which is how it came to carry the hashes but not the epoch + witnesses the loader had already computed. It now delegates to the shared + block, so a cutover-window feed is visible in the signed diagnostics and + in the build record — including the one Chronicle-namespace spelling this + build does not declare, named rather than folded into an era. + """ + pytest.importorskip("tables") # pandas HDF backend + monkeypatch.setattr( + calibration_run, + "uk_aggregate_admin_totals", + lambda frame, manifest: (_admin_anchor_values(), []), + ) + input_h5 = tmp_path / "input.h5" + frame = _frame() + write_uk_national_frame(frame, input_h5) + _write_spine_sidecar(input_h5, frame) + artifact = load_ledger_consumer_artifact(_mixed_epoch_artifact_dir(tmp_path)) + diagnostics_json = tmp_path / "diagnostics.json" + + result = run_uk_calibration( + paths=UKCalibrationRunPaths( + input_h5=input_h5, + staging_h5=tmp_path / "staged.h5", + diagnostics_json=diagnostics_json, + build_record_json=tmp_path / "build_record.json", + terminal_gate_json=tmp_path / "terminal_gates.json", + ), + input_sha256=_sha(input_h5), + ledger_artifact=artifact, + register_registry=_registry(), + band_edge_registry=_registry(), + calibration_year=2025, + exclusion_receipt={}, + doctrine=UKNationalSolveDoctrine(epochs=5), + doctrine_overrides={}, + measure_resolver=None, + source_pins={ + "input_h5": { + "sha256": _sha(input_h5), + "size_bytes": input_h5.stat().st_size, + } + }, + run_config_extra={"calibration_year": 2025}, + release_id="chronicle-mixed-epoch", + ) + + ledger = result.build_record["run_config"]["ledger"] + # The observed manifest id, verbatim, and the era it belongs to. + assert ledger["manifest"]["schema_version"] == ( + PUBLISHED_CONSUMER_ARTIFACT_SCHEMA_VERSION + ) + assert ledger["schema_epoch"] == "ledger" + # The feed straddles the cutover, and says so rather than reporting one era. + assert ledger["fact_key_epochs"] == ["ledger", "chronicle", "undeclared"] + assert ledger["undeclared_fact_key_domains"] == ["chronicle.source_release.v9"] + assert ledger["fact_schema_versions"] == [ + CHRONICLE_CONSUMER_FACT_SCHEMA_VERSION, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + ] + # The hashes the block always carried are unchanged by the delegation. + assert ledger["facts_sha256"] == artifact.facts_sha256 + assert ledger["fact_row_count"] == 3 + + # The same block is what the signed diagnostics carry, so the evidence a + # release assembler reads witnesses the era too. + diagnostics = json.loads(diagnostics_json.read_text()) + assert diagnostics["build"]["ledger"] == ledger + + +def test_the_uk_block_delegates_rather_than_reassembling_the_shared_one(tmp_path): + """Every field of the shared provenance block reaches the UK block. + + Pinned as a property, not as a list: the failure being prevented is a + field the loader learns and this seam silently drops, and a test that + enumerated today's fields would not catch tomorrow's. + """ + artifact = load_ledger_consumer_artifact(_mixed_epoch_artifact_dir(tmp_path)) + shared = artifact.provenance() + + block = calibration_run._ledger_provenance(artifact) + + for field, value in shared.items(): + if field in {"path_name", "schema_version", "profiles"}: + # Not identity of the feed: the directory name is local, and the + # manifest id is carried in the narrower manifest sub-block. + continue + assert block[field] == value, field + assert block["manifest"]["schema_version"] == shared["schema_version"] From edac801ec666222a7b0ca36f57382e6ccb8eaffd Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:18:24 -0400 Subject: [PATCH 19/33] Advertise the preferred Logbook variable names in the CLI help 'logbook export --remote --help' named POPULACE_LEDGER_URL alone, so an operator configuring from the help text set up the exact spelling the dual-read window exists to retire, then got a deprecation warning for following the instructions. The preferred LOGBOOK_* names come first and the ledger-era ones are named as the fallback they are, since an operator whose environment predates the rename still has to recognise what is being asked for. Co-Authored-By: Claude Fable 5.1 --- .../microcosm-build/tests/test_logbook_cli.py | 62 +++++++++++++++---- tools/logbook.py | 13 +++- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/packages/microcosm-build/tests/test_logbook_cli.py b/packages/microcosm-build/tests/test_logbook_cli.py index 64444560f..cafaec71f 100644 --- a/packages/microcosm-build/tests/test_logbook_cli.py +++ b/packages/microcosm-build/tests/test_logbook_cli.py @@ -2,6 +2,7 @@ from __future__ import annotations +import argparse import importlib.util import json from pathlib import Path @@ -165,9 +166,7 @@ def test_export_refuses_a_directory_archive( spool.mkdir() cli = _load_cli() - assert ( - cli.main(["export", "--archive", str(tmp_path), "--source", str(spool)]) == 1 - ) + assert cli.main(["export", "--archive", str(tmp_path), "--source", str(spool)]) == 1 assert "extends exactly one scope chain" in capsys.readouterr().err @@ -256,9 +255,7 @@ def test_cli_local_export_refuses_wrong_scope_rows( _write_jsonl(source, _chain(pipeline="uk-local-rowwise")) cli = _load_cli() - exit_code = cli.main( - ["export", "--archive", str(archive), "--source", str(source)] - ) + exit_code = cli.main(["export", "--archive", str(archive), "--source", str(source)]) assert exit_code == 1 err = capsys.readouterr().err @@ -280,9 +277,7 @@ def test_cli_export_refuses_an_unratified_scope_archive( _write_jsonl(source, _chain(pipeline="uk-firms-staging")) cli = _load_cli() - exit_code = cli.main( - ["export", "--archive", str(archive), "--source", str(source)] - ) + exit_code = cli.main(["export", "--archive", str(archive), "--source", str(source)]) assert exit_code == 1 assert "not in the ratified scope list" in capsys.readouterr().err @@ -300,9 +295,7 @@ def test_cli_export_accepts_uk_local_scope_archive( _write_jsonl(source, rows) cli = _load_cli() - exit_code = cli.main( - ["export", "--archive", str(archive), "--source", str(source)] - ) + exit_code = cli.main(["export", "--archive", str(archive), "--source", str(source)]) assert exit_code == 0 assert "exported 3 new Logbook rows" in capsys.readouterr().out @@ -616,3 +609,48 @@ def test_chain_scope_matches_sql_contract( cli = _load_cli() assert cli._chain_scope(pipeline) == scope + + +def test_remote_help_asks_for_the_preferred_logbook_variable_names() -> None: + """``--help`` is the only place most operators read these names. + + It advertised ``POPULACE_LEDGER_URL`` alone, so an operator configuring + from the help text set up the very spelling the dual-read window exists to + retire — and then got a deprecation warning for following the + instructions. The preferred names come first; the ledger-era ones are + named as the fallback they are, because an operator whose environment + predates the rename still has to recognise what is being asked for. + """ + cli = _load_cli() + + remote = next( + action + for action in _export_actions(cli) + if "--remote" in getattr(action, "option_strings", ()) + ) + help_text = remote.help or "" + + for preferred in ( + cli.LOGBOOK_URL_ENV, + cli.LOGBOOK_EXPORT_KEY_ENV, + cli.LOGBOOK_API_KEY_ENV, + ): + assert preferred in help_text, preferred + for legacy in ( + cli.LEGACY_URL_ENV, + cli.REMOTE_EXPORT_KEY_ENV, + cli.REMOTE_API_KEY_ENV, + ): + assert legacy in help_text, legacy + # Preferred first: the reading order is the migration instruction. + assert help_text.index(cli.LOGBOOK_URL_ENV) < help_text.index(cli.LEGACY_URL_ENV) + + +def _export_actions(cli: ModuleType) -> list[object]: + """Every argparse action on the ``export`` subcommand.""" + subparsers = next( + action + for action in cli._parser()._actions + if isinstance(action, argparse._SubParsersAction) + ) + return list(subparsers.choices["export"]._actions) diff --git a/tools/logbook.py b/tools/logbook.py index 423ba0097..852ca3946 100644 --- a/tools/logbook.py +++ b/tools/logbook.py @@ -41,6 +41,7 @@ from microcosm.build.logbook_env import ( LEGACY_API_KEY_ENV, LEGACY_EXPORT_KEY_ENV, + LEGACY_URL_ENV, LOGBOOK_API_KEY_ENV, LOGBOOK_EXPORT_KEY_ENV, LOGBOOK_URL_ENV, @@ -117,10 +118,16 @@ def _parser() -> argparse.ArgumentParser: source.add_argument( "--remote", action="store_true", + # The help text names the preferred Logbook spellings first and the + # ledger-era ones as the fallback they now are, so an operator + # reading --help configures the environment the dual-read window + # wants rather than the one it merely still tolerates. help=( - "Read the private live store using POPULACE_LEDGER_URL and the " - f"read-only {REMOTE_EXPORT_KEY_ENV}, authenticated at the gateway " - f"by {REMOTE_API_KEY_ENV}." + f"Read the private live store using {LOGBOOK_URL_ENV} and the " + f"read-only {LOGBOOK_EXPORT_KEY_ENV}, authenticated at the " + f"gateway by {LOGBOOK_API_KEY_ENV}. The ledger-era names " + f"({LEGACY_URL_ENV}, {REMOTE_EXPORT_KEY_ENV}, " + f"{REMOTE_API_KEY_ENV}) are still honored and warn once." ), ) From 5f14424f01f297bd344470af1e74d7c37861324e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:19:26 -0400 Subject: [PATCH 20/33] Historicize the first-pass journal's identity and design claims The lane journal is history once written, but four of its claims read as current design and are now wrong: the two-id accepted set, the uniform v2-to-v3 domain bump, CHRONICLE_* env names, and structural epoch detection. Each is annotated in place with the correction and its date so the file cannot mislead a later reader, and the changelog fragments now describe the behavior that is actually on the branch. Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept.md | 34 ++++++++++++++++++++ changelog.d/chronicle-dual-accept.added.md | 4 +-- changelog.d/chronicle-dual-accept.changed.md | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 changelog.d/chronicle-dual-accept.changed.md diff --git a/PROGRESS-chronicle-dual-accept.md b/PROGRESS-chronicle-dual-accept.md index 409a159a4..604b9ec9a 100644 --- a/PROGRESS-chronicle-dual-accept.md +++ b/PROGRESS-chronicle-dual-accept.md @@ -4,6 +4,15 @@ Branch `chronicle-dual-accept`. Journal for this lane. Root journals are history, not state (see CLAUDE.md); this one is current only while the branch is open. +> **Corrected 2026-09-02 by the round-2 review pass.** Several identity and +> design claims below were accurate to the first pass and are wrong now. The +> accepted artifact set is three ids, not two; the chronicle-era successor of +> the artifact id is `.v3`; epoch resolution is a declared registry, not +> namespace parsing; and the env half is `LOGBOOK_*`, not `CHRONICLE_*`. Each +> is annotated in place below. See `PROGRESS-chronicle-dual-accept-round2.md` +> and the PR's "Review fixes (round 2)" section for what is actually in the +> branch. + ## Goal Microcosm must accept BOTH ledger-era and chronicle-era Chronicle identities @@ -12,11 +21,25 @@ Microcosm must accept BOTH ledger-era and chronicle-era Chronicle identities - schema ids: `policyengine_ledger.consumer_artifact.v1` **and** `policyengine_chronicle.consumer_artifact.v2`; `ledger.consumer_fact.v1` **and** `chronicle.consumer_fact.v2` + + *(Corrected 2026-09-02: wrong at both ends. Chronicle's `main` emits + `policyengine_ledger.consumer_artifact.v2` today, so that pair rejected + every artifact Chronicle publishes; and the chronicle-era successor of the + v2 id is `policyengine_chronicle.consumer_artifact.v3`. The branch now + accepts all three.)* - hash domains: `ledger..v2` **and** `chronicle..v3` (same canonical payload, new domain string) + + *(Corrected 2026-09-02: the version numbers differ by family. The + source-side domains are ledger `v1` → chronicle `v2`; only the derived + families are `v2` → `v3`.)* - env names: `CHRONICLE_*` preferred, legacy honored with a once-per-process deprecation warning + *(Corrected on the PR before merge, and again here: these are the + **Logbook** store's credentials, so the preferred spellings are + `LOGBOOK_*`. See the PR review comment of 2026-09-01.)* + Frozen (microcosm#639): nothing on disk or in artifacts renames. Diagnostic field names (`ledger_aggregate_fact_key`, `ledger_commit`), H5 attrs, `populace_*` ids, fact keys, goldens and fixtures stay at v1. @@ -36,8 +59,19 @@ in the lane's report. PR #849, open, do not merge. lookup in a frozen domain list, because chronicle#143 declares the `v3` spelling only for the aggregate and semantic fact families. Only identity strings the spec names explicitly are pinned as literals. + + *(Corrected 2026-09-02: structural detection reported + `chronicle..vN` as Chronicle-**issued** identity, which is a + guess dressed as a witness. Resolution is now a declared registry keyed by + `(namespace, family, version)`; an undeclared spelling in a Chronicle + namespace is reported as `undeclared`. The claim that chronicle#143 + "declares the `v3` spelling" for two families also overstated the issue, + which lists `dual-hash window or v3 domains` as open options.)* - `microcosm/build/chronicle_env.py` — the env dual-read window, one helper, one `DeprecationWarning` per process per legacy name. + + *(Renamed before merge to `microcosm/build/logbook_env.py`; there is no + `chronicle_env.py` on the branch.)* - `ledger_artifact.py` — the manifest `schema_version` is a membership test over both eras; per-row schema ids and fact keys are carried as published; `provenance()` records the observed manifest id, `schema_epoch`, diff --git a/changelog.d/chronicle-dual-accept.added.md b/changelog.d/chronicle-dual-accept.added.md index 2f388d91b..0af1451c3 100644 --- a/changelog.d/chronicle-dual-accept.added.md +++ b/changelog.d/chronicle-dual-accept.added.md @@ -1,3 +1 @@ -Accept chronicle-era Chronicle identities everywhere Microcosm consumes them: consumer-artifact manifests declaring `policyengine_chronicle.consumer_artifact.v2` load beside `policyengine_ledger.consumer_artifact.v1`, mixed-epoch feeds compile, and the loader records the observed manifest schema id, its epoch, the fact-key epochs present in the feed, and the per-row schema ids the rows declare in provenance. Only the manifest id is gated: per-row schema ids and fact keys are carried as published, since real feeds mint rows in namespaces belonging to neither era. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. - -Separately, a Logbook naming cleanup (microcosm#632): the build ledger's environment variables gain a `LOGBOOK_*` dual-read window with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning. These are the Logbook store's own credentials, unrelated to the Chronicle fact store above. +Accept chronicle-era Chronicle identities everywhere Microcosm consumes them, from a declared identity registry keyed by `(namespace, family, version)`. Consumer-artifact manifests load under every id a real producer stamps — Microcosm's own minted `policyengine_ledger.consumer_artifact.v1`, the `policyengine_ledger.consumer_artifact.v2` Chronicle emits today, and the chronicle-era `policyengine_chronicle.consumer_artifact.v3` successor — and per-row `ledger.consumer_fact.v1` / `chronicle.consumer_fact.v2` alike. Mixed-epoch feeds compile, and provenance records the observed manifest id, its epoch, the fact-key epoch labels present in the feed, any undeclared Chronicle-namespace key domain among them, and the per-row schema ids the rows declare. An identity in a Chronicle namespace that the registry does not carry is reported as `undeclared`, never counted as Chronicle-issued. Only the manifest id is gated: per-row schema ids and fact keys are carried as published, since real feeds mint rows in namespaces belonging to neither era. Nothing renames on disk: emitted ids, diagnostic field names, `populace_*` key namespaces, goldens and fixtures stay frozen at v1. diff --git a/changelog.d/chronicle-dual-accept.changed.md b/changelog.d/chronicle-dual-accept.changed.md new file mode 100644 index 000000000..ec894c9c6 --- /dev/null +++ b/changelog.d/chronicle-dual-accept.changed.md @@ -0,0 +1 @@ +Give the Logbook store's environment variables a `LOGBOOK_*` dual-read window, with the `POPULACE_LEDGER_*` names honored under a once-per-process deprecation warning and preferred in the `tools/logbook.py --remote` help text (microcosm#632). These are the Logbook store's own credentials, unrelated to the Chronicle fact store. Every test in the build shard is now detached from a live Logbook by an autouse fixture that clears both generations of the variables and refuses unstubbed Logbook HTTP. From 3c4ddf2ca1713a39699c0f646748d305ee672c57 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:20:30 -0400 Subject: [PATCH 21/33] Drop two prose claims the declared registry falsified Both said chronicle#143 declares the v3 spelling for exactly two fact families, which the issue does not: it lists 'dual-hash window or v3 domains' as open options. The import_entry_facts header also named the chronicle-era artifact id as .v2 and did not say which of the ledger-era ids this module emits, which is the distinction the whole finding turned on. Co-Authored-By: Claude Fable 5.1 --- .../build/us_runtime/us_trade/import_entry_facts.py | 12 ++++++++---- .../microcosm-build/tests/test_chronicle_epoch.py | 3 +-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py b/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py index 4851851a0..3525b9234 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/us_trade/import_entry_facts.py @@ -9,13 +9,17 @@ CBP statistics. The contract has a chronicle-era spelling too (``chronicle.consumer_fact.v2`` -under ``policyengine_chronicle.consumer_artifact.v2``, chronicle#143), and the -loader accepts both. What this module *emits* stays ledger-era: the rows are +under ``policyengine_chronicle.consumer_artifact.v3``, chronicle#143), and the +loader accepts every declared spelling. What this module *emits* stays +ledger-era, and specifically stays at +``policyengine_ledger.consumer_artifact.v1`` — the id Microcosm's own minted +artifacts have always declared, which is a generation behind the +``...consumer_artifact.v2`` Chronicle itself publishes. The rows are byte-pinned goldens, and they are minted from official source bytes rather than derived from a Chronicle row whose epoch they would have to inherit. :func:`write_consumer_artifact` takes the declared id as an argument, checked -for membership in both eras, so flipping the declaration later is a caller -change rather than a code change. +for membership in the declared set, so flipping the declaration later is a +caller change rather than a code change. Producer identity is explicit: these rows are **microcosm-minted** from official source bytes — not an export of a PolicyEngine/ledger build — and diff --git a/packages/microcosm-build/tests/test_chronicle_epoch.py b/packages/microcosm-build/tests/test_chronicle_epoch.py index 9f1fd4c0e..53d5516bb 100644 --- a/packages/microcosm-build/tests/test_chronicle_epoch.py +++ b/packages/microcosm-build/tests/test_chronicle_epoch.py @@ -657,8 +657,7 @@ def test_every_published_key_field_is_witnessed_for_its_epoch() -> None: The captured feed fixture carries nine single-key fields and two key lists, not just the four identifiers targets resolve by. Chronicle's - cutover moves families independently — the spec declares ``v3`` only for - the aggregate and semantic families — so a row can straddle it: ledger-era + cutover moves families independently, so a row can straddle it: ledger-era aggregate key, chronicle-era source-release key. Reading only the resolution set would report that row as pure ledger-era. """ From 65a25d87d0485301288e643d2e50cbd3e460a562 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 13:23:54 -0400 Subject: [PATCH 22/33] Record the round-2 state and the structural change for the next reader Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept-round2.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/PROGRESS-chronicle-dual-accept-round2.md b/PROGRESS-chronicle-dual-accept-round2.md index 8728c5df1..99a513e9d 100644 --- a/PROGRESS-chronicle-dual-accept-round2.md +++ b/PROGRESS-chronicle-dual-accept-round2.md @@ -29,9 +29,23 @@ that matter: `policyengine_chronicle.consumer_artifact.v3` and ## State -Round 2 complete; pushed to `chronicle-dual-accept`. **DO NOT MERGE** — +Round 2 code, tests, journal and changelog pushed to `chronicle-dual-accept` +at `3c4ddf2c`. Two full `packages/microcosm-build` suites (clean env and the +polluted-Logbook env from finding 2) were running at the time of writing; +their results and the PR-body update are the last steps. **DO NOT MERGE** — the lane is authorized to fix and push only. +## What changed structurally, for the next reader + +The first pass treated epoch as something you could *read off* a key's +namespace. That is why it accepted a two-id set that excluded the id +Chronicle actually emits, and why `chronicle.anything.vN` was witnessed as +Chronicle-issued identity. Round 2 replaces it with a declared registry: +`DECLARED_IDENTITIES` in `chronicle_epoch.py`, keyed by +`(namespace, family, version)`. Anything not in that table is `undeclared` +and is reported as such. If Chronicle publishes its own successor +enumeration, that table is the one place that changes. + ## Done - [x] (1) Declared identity registry keyed by `(namespace, family, version)` From a15f153decc80214c7f2349777518fc53fb058b9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 2 Sep 2026 15:09:27 -0400 Subject: [PATCH 23/33] Record the round-2 verification, including the two pre-existing failures Both microcosm-build suites are outcome-identical, which is the guarantee the Logbook isolation finding asked for. The two red tests are recorded with the evidence that they reproduce at origin/main, because the earlier lane reported this suite as all green and on a machine holding the pinned feed it is not. Co-Authored-By: Claude Fable 5.1 --- PROGRESS-chronicle-dual-accept-round2.md | 37 ++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/PROGRESS-chronicle-dual-accept-round2.md b/PROGRESS-chronicle-dual-accept-round2.md index 99a513e9d..8406d02f9 100644 --- a/PROGRESS-chronicle-dual-accept-round2.md +++ b/PROGRESS-chronicle-dual-accept-round2.md @@ -29,11 +29,38 @@ that matter: `policyengine_chronicle.consumer_artifact.v3` and ## State -Round 2 code, tests, journal and changelog pushed to `chronicle-dual-accept` -at `3c4ddf2c`. Two full `packages/microcosm-build` suites (clean env and the -polluted-Logbook env from finding 2) were running at the time of writing; -their results and the PR-body update are the last steps. **DO NOT MERGE** — -the lane is authorized to fix and push only. +Round 2 complete and pushed to `chronicle-dual-accept`; the PR body carries a +"Review fixes (round 2)" section with the same content as this journal's +verification block. **DO NOT MERGE** — the lane was authorized to fix and +push only. + +## Verification (2026-09-02) + +Both full `packages/microcosm-build` suites — clean shell and the +polluted-Logbook shell finding 2 specifies — returned **outcome-identical** +results: 7116 passed, 47 skipped, 2 failed, out of 7165. + +The 2 failures are `test_release_target_parity.py::TestRegeneration` and are +**not this branch's**. They reproduce identically at `1f78847c` (this +branch's previous head) and at `origin/main` `47c74225`, both verified in a +throwaway worktree this session: + + ValueError: Ledger target reference + 'cbo.revenue_projection.ty2024.income_by_source.adjusted_gross_income.projected_amount' + assertion_policy='observed_only' does not allow resolved fact assertion + 'source_projection'. + +They run only where the pinned feed exists — +`~/PolicyEngine/_buildh-runtime/inputs/consumer_facts_buildn_v9_4.jsonl`, +outside the repo — and skip everywhere else, PR CI included. Worth a separate +issue: on a machine holding that feed, the committed +`cbo.revenue_projection.*` reference and the feed row it resolves to disagree +about assertion class. + +`uv run ruff format --check .` is red repo-wide (116 files) at this branch +*and* at its merge base: ruff 0.15.16's formatter against a repo pinned to +`ruff>=0.8`, whose CI lint lane runs `ruff check` only. Every file this +branch touches is format-clean before and after. ## What changed structurally, for the next reader From eb8abcdd9a65cbf3ba99031b18446c521daa4990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 00:41:05 +0200 Subject: [PATCH 24/33] Floor the uk extra at policyengine-uk>=2.93 and lock 2.94.0 (#834) policyengine-uk 2.93.0 adds the person-level tax_free_childcare_spend_routed_share input and 2.92.2 applies the Tax-Free Childcare rate to the gross payment; the port of uk-data #473/#474 needs both. 2.94.0 is the release the free-childcare dashboard was measured on. The frame and data shards' uk extras had drifted back to >=2.88 after #811; all three shards now agree on >=2.93. Co-Authored-By: Claude Fable 5.1 --- changelog.d/uk-engine-floor-834.changed.md | 1 + packages/microcosm-build/pyproject.toml | 2 +- packages/microcosm-data/pyproject.toml | 2 +- packages/microcosm-frame/pyproject.toml | 2 +- uv.lock | 12 ++++++------ 5 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 changelog.d/uk-engine-floor-834.changed.md diff --git a/changelog.d/uk-engine-floor-834.changed.md b/changelog.d/uk-engine-floor-834.changed.md new file mode 100644 index 000000000..dc0d7c846 --- /dev/null +++ b/changelog.d/uk-engine-floor-834.changed.md @@ -0,0 +1 @@ +Floor the uk extra at policyengine-uk>=2.93 and lock 2.94.0, the first release that defines `tax_free_childcare_spend_routed_share` and applies the gross-side Tax-Free Childcare rate (#834). diff --git a/packages/microcosm-build/pyproject.toml b/packages/microcosm-build/pyproject.toml index 48d478366..4747035cb 100644 --- a/packages/microcosm-build/pyproject.toml +++ b/packages/microcosm-build/pyproject.toml @@ -39,7 +39,7 @@ us = [ # The UK extra adds the rules engine for local metric generation from a # Microcosm UK H5. Target tables remain explicit inputs, and the base package # still does not import policyengine-uk at import time. -uk = ["policyengine-uk>=2.92", "h5py>=3", "tables>=3"] +uk = ["policyengine-uk>=2.93", "h5py>=3", "tables>=3"] [project.scripts] microcosm-export-us-l0-refit-h5 = "microcosm.build.us_runtime.l0_refit_export:main" diff --git a/packages/microcosm-data/pyproject.toml b/packages/microcosm-data/pyproject.toml index 6ef7d481b..5f5e27ba9 100644 --- a/packages/microcosm-data/pyproject.toml +++ b/packages/microcosm-data/pyproject.toml @@ -28,7 +28,7 @@ us = ["policyengine-us>=1.745.0,<2"] # The UK artifact lives in a PRIVATE repo (UK Data Service licence): loads # require an authenticated HF token with access. The loader surfaces the # 401 with that explanation rather than retrying. -uk = ["policyengine-uk>=2.88"] +uk = ["policyengine-uk>=2.93"] [project.urls] Homepage = "https://microcosm.institute" diff --git a/packages/microcosm-frame/pyproject.toml b/packages/microcosm-frame/pyproject.toml index 359ea4f23..70822aebf 100644 --- a/packages/microcosm-frame/pyproject.toml +++ b/packages/microcosm-frame/pyproject.toml @@ -16,7 +16,7 @@ microcosm-graph = { workspace = true } [project.optional-dependencies] us = ["microunit>=0.1.0"] policyengine = ["policyengine-us>=1.745.0,<2", "microunit>=0.1.0"] -uk = ["policyengine-uk>=2.88"] +uk = ["policyengine-uk>=2.93"] # The Axiom adapter's PyPI-resolvable dependencies. The engine itself # (axiom-rules-engine + its dense native extension) is not on PyPI yet and # installs from a checkout; see microcosm/frame/adapters/axiom.py. diff --git a/uv.lock b/uv.lock index b3bfb8926..177c79099 100644 --- a/uv.lock +++ b/uv.lock @@ -780,7 +780,7 @@ requires-dist = [ { name = "microunit", marker = "extra == 'us'", specifier = ">=0.1.0" }, { name = "numpy", specifier = ">=1.26" }, { name = "pandas", specifier = ">=2" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.92" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.93" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = ">=1.745.0,<2" }, { name = "pyarrow", specifier = ">=15" }, { name = "pyyaml", specifier = ">=6" }, @@ -853,7 +853,7 @@ requires-dist = [ { name = "h5py", specifier = ">=3" }, { name = "huggingface-hub", specifier = ">=0.20" }, { name = "packaging", specifier = ">=24" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.88" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.93" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = ">=1.745.0,<2" }, ] provides-extras = ["us", "uk"] @@ -931,7 +931,7 @@ requires-dist = [ { name = "microunit", marker = "extra == 'us'", specifier = ">=0.1.0" }, { name = "numpy", specifier = ">=2" }, { name = "pandas", specifier = ">=2.3" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.88" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.93" }, { name = "policyengine-us", marker = "extra == 'policyengine'", specifier = ">=1.745.0,<2" }, { name = "tables", marker = "extra == 'axiom'", specifier = ">=3" }, ] @@ -1494,7 +1494,7 @@ wheels = [ [[package]] name = "policyengine-uk" -version = "2.92.1" +version = "2.94.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "microdf-python" }, @@ -1502,9 +1502,9 @@ dependencies = [ { name = "pydantic" }, { name = "tables" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/ad/753fc50a4479d9670cb27b9db3c728bc377d4bbd44464858fec4c1b3df61/policyengine_uk-2.92.1.tar.gz", hash = "sha256:204792cebd1c916c5201f3bfbd1e7cc638bf67cb1aa893ee8456b90853e3f69f", size = 1243396, upload-time = "2026-08-28T12:05:48.065Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/55/8553c4d71f74ea56431eff96144b86a899f36ea1ec71dc797ccc8b07b930/policyengine_uk-2.94.0.tar.gz", hash = "sha256:85edac86c05cb3583e2eec265b44674beb3ea2553fba7e1a8bfc9d117c4c2e24", size = 1255741, upload-time = "2026-08-30T13:39:32.301Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/b9/e52246d4f8ed11fe394de9a0de7ca457c6c01282814b7495612d628d166c/policyengine_uk-2.92.1-py3-none-any.whl", hash = "sha256:056fa8c9e2813094ca3c4761df89047374256a7acf8b88de22ddba0a94deb175", size = 2042832, upload-time = "2026-08-28T12:05:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/97/91/330552ab3bfc6457505edb7ed34fab18bd055da3455389196e840f795451/policyengine_uk-2.94.0-py3-none-any.whl", hash = "sha256:327f8af96e92af20cac4978129006f967515b6405ab76674b26929b1aba5438d", size = 2054879, upload-time = "2026-08-30T13:39:30.5Z" }, ] [[package]] From 14c71008754fecc1400a7577f4271329fb93bf1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 04:15:07 +0200 Subject: [PATCH 25/33] Re-pin the UK target surfaces to Chronicle 6fb700e and repair the contract they compile against (#834, #789 I0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The committed national surface was generated on a Chronicle feed (226358e7, 107,550 rows) the local census no longer pinned (33ca98a, 108,112 rows); on the pinned feed 19 references failed to compile and the calibration runner refused to run. Both surfaces now pin one feed built from Chronicle main 6fb700e (128,717 rows, facts 6ae49d7d…, manifest dcda51d6…, artifact schema v2), and the runner refuses any other feed unless --allow-unpinned-feed is passed and recorded. What the re-pin surfaced and how the contract answers it: - The #239 UC crosses share source_concept and groupby_dimension with the base family-type and number-of-children tables; the composition rows now pin their exact dimension key set, and the generator no longer reads a `dimensions` list as a sum trigger. - The caseload row keeps binding DWP UC deductions statistics Table 1 (measure total_units, month groupby): its April–December 2025 calendar-year average is 6,758,889, the value #735 recorded; the Stat-Xplore family-type sum runs 1.45% above it (chronicle#247 asks for the cube's Total row). - The CGT totals pin Table 1; Table 5's UK rows carry the same concepts. - Every dwp_universal_credit row is a calendar-year average (one temporal basis): the 100 payment-band rows move from the May-2025 snapshot to the 2025 mean, and the Scotland youngest-child row is re-bound at benefit-unit grain. - ons.population.scotland_households_3plus_children is signed out (its selector reaches person-level mid-year population rows; #736). - The local private-rent deferral private_rent_pipr_after_target_period is stale since #231 extended PIPR to 2023–2026: the 314 rows bind the 2025 calendar-year average (12 members each). Local active references 19,618 -> 19,932. - The nine scotgov council-tax bands restore themselves (#231's measure-id fix). Regenerated with the repository tools: national and local references and membership, the local census and validation levels, both compile-parity receipts, the feed-row fixture. A hermetic test regenerates the surfaces from the pinned identity and skips only when the feed is absent. docs/uk-chronicle-feed-repin.md records the procedure. Codex implemented increment I0 of the #834 plan under the approved-plan protocol; reviewed section by section, source_repo restored to the canonical PolicyEngine/chronicle, census regenerated. Co-Authored-By: Claude Fable 5.1 --- changelog.d/uk-chronicle-repin-834.changed.md | 4 + docs/uk-chronicle-feed-repin.md | 26 + experiments/834-childcare-tfc-receipts.md | 93 + .../build/target_reference_authoring.py | 4 + ...ity_incumbent_2025_signed_differences.json | 240 +- ...ty_production_2023_signed_differences.json | 4 +- .../uk/local_target_reference_membership.json | 7026 ++++++++++----- .../build/uk/local_target_references.json | 7850 +++++++++++++++++ .../build/uk/local_validation_levels.json | 7 +- .../build/uk/target_reference_membership.json | 1393 ++- .../microcosm/build/uk/target_references.json | 773 +- .../build/uk/uk_local_target_census.json | 40 +- .../build/uk/uk_population_targets.json | 78 +- .../build/uk_runtime/local_target_census.py | 7 +- .../uk_runtime/local_validation_levels.py | 2 +- .../uk_target_reference_feed_rows.jsonl | 13 + .../tests/test_uk_battery_bindings.py | 6 +- .../tests/test_uk_calibration_seam_driver.py | 46 +- .../tests/test_uk_local_target_census.py | 5 +- .../tests/test_uk_national_calibration.py | 20 +- .../tests/test_uk_pipr_deferrals.py | 37 +- .../tests/test_uk_population_targets.py | 4 + .../tests/test_uk_target_references.py | 232 +- tools/calibrate_uk_national_dataset.py | 45 +- tools/generate_uk_local_target_references.py | 35 +- tools/generate_uk_target_references.py | 69 +- tools/score_uk_local_candidate.py | 2 +- 27 files changed, 14721 insertions(+), 3340 deletions(-) create mode 100644 changelog.d/uk-chronicle-repin-834.changed.md create mode 100644 docs/uk-chronicle-feed-repin.md create mode 100644 experiments/834-childcare-tfc-receipts.md diff --git a/changelog.d/uk-chronicle-repin-834.changed.md b/changelog.d/uk-chronicle-repin-834.changed.md new file mode 100644 index 000000000..80dc4cc8c --- /dev/null +++ b/changelog.d/uk-chronicle-repin-834.changed.md @@ -0,0 +1,4 @@ +Re-pin the UK national and local target surfaces to the Chronicle `6fb700e` +consumer artifact, tighten Universal Credit and CGT selectors, align Universal +Credit rows on 2025 calendar-year averages, and activate the available PIPR +local rent rows on the same temporal basis. diff --git a/docs/uk-chronicle-feed-repin.md b/docs/uk-chronicle-feed-repin.md new file mode 100644 index 000000000..689d8072c --- /dev/null +++ b/docs/uk-chronicle-feed-repin.md @@ -0,0 +1,26 @@ +# Re-pin the UK Chronicle consumer feed + +The national and local target surfaces must always use one reviewed Chronicle +consumer artifact. Rebuild the UK bundle and consumer artifact in +`PolicyEngine/arch-data`, then copy the resulting `consumer_facts.jsonl` and +`manifest.json` into `.codex-work/consumer_facts_uk.jsonl` and +`.codex-work/consumer_facts_uk_manifest.json`. Do not commit either +file. + +Verify both SHA-256 digests and the manifest's `facts_sha256`, row count, and +schema version. Update `_LEDGER_FACT_FEED_PIN` in +`uk_runtime/local_target_census.py`, the local validation-level pin, and their +tests together. Regenerate the local census with +`uv run --no-sync python tools/census_uk_local_targets.py`. + +Regenerate the national and local reference surfaces from the same fact file +with `tools/generate_uk_target_references.py` and +`tools/generate_uk_local_target_references.py`, then rebuild the signed compile +parity receipts with +`tools/build_uk_ledger_compile_parity_signed_differences.py`. The hermetic +regeneration test accepts either the default `.codex-work` files or a +`CHRONICLE_UK_FACTS` override and skips only when neither is present. + +The calibration runner refuses a feed whose facts digest differs from the +committed pin. `--allow-unpinned-feed` is an explicit diagnostic override and +is recorded in the run manifest; it is not a re-pin procedure. diff --git a/experiments/834-childcare-tfc-receipts.md b/experiments/834-childcare-tfc-receipts.md new file mode 100644 index 000000000..0c30e6668 --- /dev/null +++ b/experiments/834-childcare-tfc-receipts.md @@ -0,0 +1,93 @@ +# #834 / #789 receipts — childcare and Tax-Free Childcare port, Chronicle re-pin, bus targets + +Plan: `repos/uk-834-childcare-tfc-port-plan.md` (canonical, María's rulings A0–A20). Licensed +evidence lives under `data/ukds/acceptance/834-childcare-tfc/` (SDC-safe aggregates, minimum +cell count 3); this file carries the committed, digest-pinned receipts the PR's signed entries +anchor to. + +## Part A — Chronicle feed re-pin (increment I0) + +Feed rebuilt from Chronicle `PolicyEngine/chronicle` main `6fb700e` (2026-09-04; carries #220 +childcare, #231 the recovered #202, #239 the UC crosses / Child Benefit / census composition) +with `chronicle build-bundle --suite uk` → `build-consumer-artifact`: + +| | value | +|---|---| +| `consumer_facts.jsonl` sha256 | `6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f` | +| `manifest.json` sha256 | `dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0` | +| rows / schema | 128 717 / `policyengine_ledger.consumer_artifact.v2` | +| previous pin | `33ca98a` / `4395a4e7…`, 108 112 rows (local census); the national surface had been generated on `226358e7…`, 107 550 rows | + +### Why the re-pin had to repair the contract (plan §5c) + +On the previously pinned feed the committed national surface did not compile: 19 references +unsupported (`compile_uk_target_registry`), which `tools/calibrate_uk_national_dataset.py` +refuses. On the rebuilt feed, 12 were unsupported before the I0 corrections. After I0: + +| surface | before (committed) | after I0 on `6ae49d7d…` | +|---|---|---| +| national membership | active 408, multi_fact 1, no_fact 7, signed_excluded 1 | **active 408**, no_fact 7, signed_excluded 2 | +| national runtime compile | 389 compiled / 19 unsupported on the pinned feed | **408 compiled / 0 unsupported** | +| local membership | active 19 618, no_fact_at_or_before_period 314, no_fact_for_area 1 586, compile_error 1 | **active 19 932**, no_fact_for_area 1 586, compile_error 1 (the signed `E14001416` SPI mean) | + +Corrections (each a declaration, verified by the regeneration test and the runtime compile): + +- UC composition rows (`dwp.uc.households_{single,couple}_{no,with}_children`, + `_children_{1..5_or_more}`): exact dimension-key pins (`dimensions: [family_type]` / + `[number_of_children]`), so the #239 child-entitlement and payment-indicator crosses no + longer match; the generator's sum inference no longer treats a `dimensions` list as a sum. +- Caseload `dwp.uc.households`: `source_measure_id: total_units` + + `groupby_dimension: dwp.uc_deductions_month` → binds DWP UC deductions statistics Table 1 + only; calendar-year average over April–December 2025 = **6 758 889** (the #735 value), + 1.45% below the Stat-Xplore family-type sum 6 858 287 (chronicle#247 asks for the + cube's Total row). +- CGT totals: `groupby_dimension: hmrc.cgt_table1_line` (Table 5's UK rows carried the same + concepts and values, £127.316bn gains at TY2024). +- One temporal basis for `dwp_universal_credit`: every row is a calendar-year average; the 100 + payment-band rows move from the May-2025 snapshot to the 2025 mean; the Scotland + youngest-child row is re-bound at benefit-unit grain (`youngest_child_age < 1`). +- `ons.population.scotland_households_3plus_children` signed-excluded (its selector reaches + person-level mid-year population rows; #736). +- Local `ons.rent.private_rent`: the stale deferral `private_rent_pipr_after_target_period` + retired; 314 rows bind the calendar-year average of the 2025 PIPR months (12 members each). +- Feed guard: the calibration runner refuses a feed whose facts digest differs from the + committed pin (`--allow-unpinned-feed` is a recorded diagnostic override); a hermetic test + regenerates the surfaces from the pinned identity and skips only when the feed is absent. + +## Part B — Licensed before-receipts (L0, L1) + +All at design weights on full-scale spines (52 846 households, 113 626 persons, 61 234 benefit +units), engine policyengine-uk 2.94.0 for the receipts. + +### L0 — spine-n (main `47c74225` + #842 + #850, built at 2.92.1), read at 2.94.0 + +`l0_spine_n_childcare_receipt.json`. The routed share reads its engine default (1.0): the column +is absent from the spine. + +| row (model / fact) | 2024 basis (FY2024-25 / Jan-2024; extended Jan-2025 ages 2–4) | 2025 basis (FY2025-26 / Jan-2025) | +|---|---|---| +| TFC spending (£0.6322bn / £0.5998bn) | 1.073× | 1.174× | +| TFC children (1 085 020 / 1 151 515) | 1.020× | 0.951× | +| Working-parent children ages 2–4, England (621 482) | 1.283× | 1.261× | +| Early learning 2-year-olds, England (115 852 / 95 031) | 0.596× | 0.738× | +| Universal-only children, England (416 537 / 396 965) | 1.104× | 1.177× | + +### L1 — engine-only twin (branch `eb8abcdd`: floor ≥2.93, lock 2.94.0; no new column) + +`l1-engine-twin/l1-engine.h5`, 28 stages, spine battery 15/15. Payload against spine-n +(`l1_vs_spine_n_payload.json`): benunit and time_period tables byte-equal; person differs only +in `student_loan_balance` (26 rows); household differs in 37 columns — the WAS, LCFS, ETB, +property and consumption outputs of the QRF stages whose predictors include +`household_net_income` (which carries `tax_free_childcare`, moved by 2.92.2's gross-rate +arithmetic). No income, benefit or childcare input column moves. The childcare receipt on L1 +(`l1_engine_childcare_receipt.json`) is identical to L0. + +## Part C — column twin (L2), release round trip (L3), re-fit (L5), composition (L4) + +Pending the Lane A/B increments. + +## Part D — bus (#789) + +E9's Part D (`experiments/685-net-new-stages-receipts.md`) is the sizing evidence: at design +weights England fares 0.56× BUS05ai and net support 0.71× BUS05bi; London 0.28×; England outside +London 0.74× / 0.97×; the LCFS fare gradient runs against NTS0705a (#790's disposition). diff --git a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py index 7629404be..64543c053 100644 --- a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py +++ b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py @@ -99,6 +99,9 @@ class AreaTargetReferenceAuthoringConfig: selector_pins_by_target_id: Mapping[str, Mapping[str, Any]] = field( default_factory=dict ) + reference_metadata_by_target_id: Mapping[str, Mapping[str, str]] = field( + default_factory=dict + ) binding_vocabulary: frozenset[str] = frozenset() source_fact_feed: str = "" @@ -538,6 +541,7 @@ def _area_reference_row( "measure_kind": "prepared_column", "geography_level": geography_level, "geography_id": area_id, + **dict(config.reference_metadata_by_target_id.get(target_id, {})), }, } assertion_policy = target.get("assertion_policy") 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 ab237d33e..3bfe535bc 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -1,11 +1,11 @@ { "compiled_count": 408, "counts_by_kind": { - "calibration_drift": 170, + "calibration_drift": 172, "fixture_only": 267, "ledger_only": 38 }, - "difference_count": 475, + "difference_count": 477, "differences": [ { "fixture_value": 1608000.0, @@ -2161,7 +2161,7 @@ { "fixture_value": 1222944.0, "kind": "calibration_drift", - "ledger_value": 1269512.0, + "ledger_value": 1278537.0, "name": "dwp.uc.households_children_1", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2169,7 +2169,7 @@ { "fixture_value": 1058967.0, "kind": "calibration_drift", - "ledger_value": 1103880.0, + "ledger_value": 1100617.5555555555, "name": "dwp.uc.households_children_2", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2177,7 +2177,7 @@ { "fixture_value": 473500.0, "kind": "calibration_drift", - "ledger_value": 497665.0, + "ledger_value": 494553.22222222225, "name": "dwp.uc.households_children_3", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2185,7 +2185,7 @@ { "fixture_value": 166790.0, "kind": "calibration_drift", - "ledger_value": 176202.0, + "ledger_value": 174668.88888888888, "name": "dwp.uc.households_children_4", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2193,7 +2193,7 @@ { "fixture_value": 75910.0, "kind": "calibration_drift", - "ledger_value": 77894.0, + "ledger_value": 77376.77777777778, "name": "dwp.uc.households_children_5_or_more", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2201,7 +2201,7 @@ { "fixture_value": 231368.0, "kind": "calibration_drift", - "ledger_value": 266160.0, + "ledger_value": 284345.55555555556, "name": "dwp.uc.households_couple_no_children", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2209,7 +2209,7 @@ { "fixture_value": 839379.0, "kind": "calibration_drift", - "ledger_value": 911392.0, + "ledger_value": 899534.6666666666, "name": "dwp.uc.households_couple_with_children", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2217,7 +2217,7 @@ { "fixture_value": 2868011.0, "kind": "calibration_drift", - "ledger_value": 3191316.0, + "ledger_value": 3446962.0, "name": "dwp.uc.households_single_no_children", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2225,7 +2225,7 @@ { "fixture_value": 2156879.0, "kind": "calibration_drift", - "ledger_value": 2213760.0, + "ledger_value": 2226220.0, "name": "dwp.uc.households_single_with_children", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2233,7 +2233,7 @@ { "fixture_value": 14000.0, "kind": "calibration_drift", - "ledger_value": 14412.0, + "ledger_value": 14333.222222222223, "name": "dwp.uc.scotland_households_child_under_1", "period": 2025, "reason": "Ledger-compiled value differs from the fixture value at this comparison period." @@ -2241,7 +2241,7 @@ { "fixture_value": 7610.0, "kind": "calibration_drift", - "ledger_value": 7553.0, + "ledger_value": 7506.333333333333, "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." @@ -2249,7 +2249,7 @@ { "fixture_value": 12370.0, "kind": "calibration_drift", - "ledger_value": 12318.0, + "ledger_value": 13313.333333333334, "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." @@ -2257,7 +2257,7 @@ { "fixture_value": 15175.0, "kind": "calibration_drift", - "ledger_value": 15096.0, + "ledger_value": 16121.444444444445, "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." @@ -2265,7 +2265,7 @@ { "fixture_value": 12297.0, "kind": "calibration_drift", - "ledger_value": 12422.0, + "ledger_value": 13317.333333333334, "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." @@ -2273,7 +2273,7 @@ { "fixture_value": 17828.0, "kind": "calibration_drift", - "ledger_value": 17851.0, + "ledger_value": 19657.333333333332, "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." @@ -2281,7 +2281,7 @@ { "fixture_value": 14427.0, "kind": "calibration_drift", - "ledger_value": 14493.0, + "ledger_value": 16443.222222222223, "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." @@ -2289,7 +2289,7 @@ { "fixture_value": 11892.0, "kind": "calibration_drift", - "ledger_value": 11914.0, + "ledger_value": 13441.111111111111, "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." @@ -2297,7 +2297,7 @@ { "fixture_value": 9463.0, "kind": "calibration_drift", - "ledger_value": 9478.0, + "ledger_value": 10728.555555555555, "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." @@ -2305,7 +2305,7 @@ { "fixture_value": 8443.0, "kind": "calibration_drift", - "ledger_value": 8479.0, + "ledger_value": 9653.222222222223, "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." @@ -2313,7 +2313,7 @@ { "fixture_value": 8906.0, "kind": "calibration_drift", - "ledger_value": 8732.0, + "ledger_value": 8797.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." @@ -2321,7 +2321,7 @@ { "fixture_value": 5770.0, "kind": "calibration_drift", - "ledger_value": 5764.0, + "ledger_value": 6486.888888888889, "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." @@ -2329,7 +2329,7 @@ { "fixture_value": 3485.0, "kind": "calibration_drift", - "ledger_value": 3525.0, + "ledger_value": 3981.8888888888887, "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." @@ -2337,7 +2337,7 @@ { "fixture_value": 2360.0, "kind": "calibration_drift", - "ledger_value": 2356.0, + "ledger_value": 2761.4444444444443, "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." @@ -2345,7 +2345,7 @@ { "fixture_value": 1815.0, "kind": "calibration_drift", - "ledger_value": 1797.0, + "ledger_value": 2131.222222222222, "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." @@ -2353,7 +2353,7 @@ { "fixture_value": 1186.0, "kind": "calibration_drift", - "ledger_value": 1214.0, + "ledger_value": 1475.3333333333333, "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." @@ -2361,7 +2361,7 @@ { "fixture_value": 935.0, "kind": "calibration_drift", - "ledger_value": 958.0, + "ledger_value": 1073.7777777777778, "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." @@ -2369,7 +2369,7 @@ { "fixture_value": 632.0, "kind": "calibration_drift", - "ledger_value": 654.0, + "ledger_value": 746.3333333333334, "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." @@ -2377,7 +2377,7 @@ { "fixture_value": 580.0, "kind": "calibration_drift", - "ledger_value": 578.0, + "ledger_value": 605.7777777777778, "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." @@ -2385,7 +2385,7 @@ { "fixture_value": 11750.0, "kind": "calibration_drift", - "ledger_value": 11606.0, + "ledger_value": 12256.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." @@ -2393,7 +2393,7 @@ { "fixture_value": 10802.0, "kind": "calibration_drift", - "ledger_value": 10672.0, + "ledger_value": 10945.444444444445, "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." @@ -2401,7 +2401,7 @@ { "fixture_value": 12168.0, "kind": "calibration_drift", - "ledger_value": 12199.0, + "ledger_value": 12492.444444444445, "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." @@ -2409,7 +2409,7 @@ { "fixture_value": 12461.0, "kind": "calibration_drift", - "ledger_value": 12405.0, + "ledger_value": 12979.666666666666, "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." @@ -2417,7 +2417,7 @@ { "fixture_value": 15787.0, "kind": "calibration_drift", - "ledger_value": 15632.0, + "ledger_value": 16484.444444444445, "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." @@ -2425,7 +2425,7 @@ { "fixture_value": 14248.0, "kind": "calibration_drift", - "ledger_value": 14298.0, + "ledger_value": 15272.444444444445, "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." @@ -2433,7 +2433,7 @@ { "fixture_value": 17559.0, "kind": "calibration_drift", - "ledger_value": 17626.0, + "ledger_value": 19142.333333333332, "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." @@ -2441,7 +2441,7 @@ { "fixture_value": 18714.0, "kind": "calibration_drift", - "ledger_value": 18896.0, + "ledger_value": 19073.555555555555, "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." @@ -2449,7 +2449,7 @@ { "fixture_value": 42188.0, "kind": "calibration_drift", - "ledger_value": 41858.0, + "ledger_value": 40805.444444444445, "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." @@ -2457,7 +2457,7 @@ { "fixture_value": 41520.0, "kind": "calibration_drift", - "ledger_value": 41349.0, + "ledger_value": 40009.555555555555, "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." @@ -2465,7 +2465,7 @@ { "fixture_value": 41159.0, "kind": "calibration_drift", - "ledger_value": 40850.0, + "ledger_value": 39972.555555555555, "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." @@ -2473,7 +2473,7 @@ { "fixture_value": 42515.0, "kind": "calibration_drift", - "ledger_value": 42101.0, + "ledger_value": 40518.77777777778, "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." @@ -2481,7 +2481,7 @@ { "fixture_value": 38527.0, "kind": "calibration_drift", - "ledger_value": 38379.0, + "ledger_value": 37118.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." @@ -2489,7 +2489,7 @@ { "fixture_value": 38894.0, "kind": "calibration_drift", - "ledger_value": 38725.0, + "ledger_value": 37177.77777777778, "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." @@ -2497,7 +2497,7 @@ { "fixture_value": 38659.0, "kind": "calibration_drift", - "ledger_value": 38124.0, + "ledger_value": 37164.555555555555, "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." @@ -2505,7 +2505,7 @@ { "fixture_value": 34318.0, "kind": "calibration_drift", - "ledger_value": 33871.0, + "ledger_value": 33309.555555555555, "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." @@ -2513,7 +2513,7 @@ { "fixture_value": 22489.0, "kind": "calibration_drift", - "ledger_value": 22614.0, + "ledger_value": 22775.777777777777, "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." @@ -2521,7 +2521,7 @@ { "fixture_value": 30116.0, "kind": "calibration_drift", - "ledger_value": 29950.0, + "ledger_value": 29102.555555555555, "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." @@ -2529,7 +2529,7 @@ { "fixture_value": 28519.0, "kind": "calibration_drift", - "ledger_value": 28186.0, + "ledger_value": 27534.666666666668, "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." @@ -2537,7 +2537,7 @@ { "fixture_value": 26014.0, "kind": "calibration_drift", - "ledger_value": 25960.0, + "ledger_value": 25584.777777777777, "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." @@ -2545,7 +2545,7 @@ { "fixture_value": 23159.0, "kind": "calibration_drift", - "ledger_value": 23231.0, + "ledger_value": 22927.777777777777, "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." @@ -2553,7 +2553,7 @@ { "fixture_value": 20618.0, "kind": "calibration_drift", - "ledger_value": 20598.0, + "ledger_value": 20334.666666666668, "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." @@ -2561,7 +2561,7 @@ { "fixture_value": 17493.0, "kind": "calibration_drift", - "ledger_value": 17650.0, + "ledger_value": 17535.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." @@ -2569,7 +2569,7 @@ { "fixture_value": 15437.0, "kind": "calibration_drift", - "ledger_value": 15499.0, + "ledger_value": 15399.888888888889, "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." @@ -2577,7 +2577,7 @@ { "fixture_value": 12836.0, "kind": "calibration_drift", - "ledger_value": 12912.0, + "ledger_value": 12836.222222222223, "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." @@ -2585,7 +2585,7 @@ { "fixture_value": 26734.0, "kind": "calibration_drift", - "ledger_value": 26768.0, + "ledger_value": 26502.666666666668, "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." @@ -2593,7 +2593,7 @@ { "fixture_value": 29189.0, "kind": "calibration_drift", - "ledger_value": 29288.0, + "ledger_value": 29027.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." @@ -2601,15 +2601,23 @@ { "fixture_value": 33137.0, "kind": "calibration_drift", - "ledger_value": 33072.0, + "ledger_value": 32427.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": 35834.0, + "kind": "calibration_drift", + "ledger_value": 34956.88888888889, + "name": "dwp/uc_payment_dist/COUPLE_WITH_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": 38338.0, "kind": "calibration_drift", - "ledger_value": 38337.0, + "ledger_value": 37410.77777777778, "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." @@ -2617,7 +2625,7 @@ { "fixture_value": 40685.0, "kind": "calibration_drift", - "ledger_value": 40556.0, + "ledger_value": 39910.333333333336, "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." @@ -2625,7 +2633,7 @@ { "fixture_value": 40564.0, "kind": "calibration_drift", - "ledger_value": 40399.0, + "ledger_value": 39368.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." @@ -2633,7 +2641,7 @@ { "fixture_value": 24639.0, "kind": "calibration_drift", - "ledger_value": 24828.0, + "ledger_value": 26670.222222222223, "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." @@ -2641,7 +2649,7 @@ { "fixture_value": 126949.0, "kind": "calibration_drift", - "ledger_value": 125466.0, + "ledger_value": 123718.11111111111, "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." @@ -2649,7 +2657,7 @@ { "fixture_value": 131129.0, "kind": "calibration_drift", - "ledger_value": 129699.0, + "ledger_value": 125798.44444444444, "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." @@ -2657,7 +2665,7 @@ { "fixture_value": 131289.0, "kind": "calibration_drift", - "ledger_value": 129699.0, + "ledger_value": 129133.66666666667, "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." @@ -2665,7 +2673,7 @@ { "fixture_value": 119355.0, "kind": "calibration_drift", - "ledger_value": 117812.0, + "ledger_value": 115856.66666666667, "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." @@ -2673,7 +2681,7 @@ { "fixture_value": 130802.0, "kind": "calibration_drift", - "ledger_value": 128991.0, + "ledger_value": 125660.22222222222, "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." @@ -2681,7 +2689,7 @@ { "fixture_value": 141848.0, "kind": "calibration_drift", - "ledger_value": 139675.0, + "ledger_value": 135836.77777777778, "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." @@ -2689,7 +2697,7 @@ { "fixture_value": 136835.0, "kind": "calibration_drift", - "ledger_value": 134650.0, + "ledger_value": 135444.88888888888, "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." @@ -2697,7 +2705,7 @@ { "fixture_value": 107556.0, "kind": "calibration_drift", - "ledger_value": 106818.0, + "ledger_value": 106341.88888888889, "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." @@ -2705,7 +2713,7 @@ { "fixture_value": 34670.0, "kind": "calibration_drift", - "ledger_value": 34587.0, + "ledger_value": 36208.11111111111, "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." @@ -2713,7 +2721,7 @@ { "fixture_value": 86616.0, "kind": "calibration_drift", - "ledger_value": 86255.0, + "ledger_value": 85490.44444444444, "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." @@ -2721,7 +2729,7 @@ { "fixture_value": 80294.0, "kind": "calibration_drift", - "ledger_value": 80273.0, + "ledger_value": 80226.88888888889, "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." @@ -2729,7 +2737,7 @@ { "fixture_value": 70309.0, "kind": "calibration_drift", - "ledger_value": 70319.0, + "ledger_value": 71259.55555555556, "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." @@ -2737,7 +2745,7 @@ { "fixture_value": 50510.0, "kind": "calibration_drift", - "ledger_value": 50805.0, + "ledger_value": 51301.666666666664, "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." @@ -2745,7 +2753,7 @@ { "fixture_value": 42522.0, "kind": "calibration_drift", - "ledger_value": 43132.0, + "ledger_value": 43305.22222222222, "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." @@ -2753,7 +2761,7 @@ { "fixture_value": 33508.0, "kind": "calibration_drift", - "ledger_value": 34342.0, + "ledger_value": 34910.555555555555, "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." @@ -2761,7 +2769,7 @@ { "fixture_value": 27063.0, "kind": "calibration_drift", - "ledger_value": 27650.0, + "ledger_value": 28513.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." @@ -2769,7 +2777,7 @@ { "fixture_value": 21663.0, "kind": "calibration_drift", - "ledger_value": 22058.0, + "ledger_value": 22593.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." @@ -2777,7 +2785,7 @@ { "fixture_value": 43623.0, "kind": "calibration_drift", - "ledger_value": 43550.0, + "ledger_value": 46312.77777777778, "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." @@ -2785,7 +2793,7 @@ { "fixture_value": 55622.0, "kind": "calibration_drift", - "ledger_value": 55560.0, + "ledger_value": 60310.11111111111, "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." @@ -2793,7 +2801,7 @@ { "fixture_value": 67901.0, "kind": "calibration_drift", - "ledger_value": 68058.0, + "ledger_value": 67858.66666666667, "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." @@ -2801,7 +2809,7 @@ { "fixture_value": 89314.0, "kind": "calibration_drift", - "ledger_value": 89174.0, + "ledger_value": 89577.44444444444, "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." @@ -2809,7 +2817,7 @@ { "fixture_value": 118641.0, "kind": "calibration_drift", - "ledger_value": 117236.0, + "ledger_value": 116076.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." @@ -2817,7 +2825,7 @@ { "fixture_value": 99069.0, "kind": "calibration_drift", - "ledger_value": 98877.0, + "ledger_value": 97511.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." @@ -2825,7 +2833,7 @@ { "fixture_value": 102251.0, "kind": "calibration_drift", - "ledger_value": 102069.0, + "ledger_value": 102343.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." @@ -2833,7 +2841,7 @@ { "fixture_value": 102312.0, "kind": "calibration_drift", - "ledger_value": 101189.0, + "ledger_value": 89479.33333333333, "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." @@ -2841,7 +2849,7 @@ { "fixture_value": 95698.0, "kind": "calibration_drift", - "ledger_value": 94296.0, + "ledger_value": 104891.11111111111, "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." @@ -2849,7 +2857,7 @@ { "fixture_value": 106663.0, "kind": "calibration_drift", - "ledger_value": 106102.0, + "ledger_value": 122035.55555555556, "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." @@ -2857,7 +2865,7 @@ { "fixture_value": 181180.0, "kind": "calibration_drift", - "ledger_value": 182183.0, + "ledger_value": 197163.22222222222, "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." @@ -2865,7 +2873,7 @@ { "fixture_value": 189861.0, "kind": "calibration_drift", - "ledger_value": 191730.0, + "ledger_value": 209497.33333333334, "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." @@ -2873,7 +2881,7 @@ { "fixture_value": 129174.0, "kind": "calibration_drift", - "ledger_value": 130302.0, + "ledger_value": 149963.22222222222, "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." @@ -2881,7 +2889,7 @@ { "fixture_value": 84690.0, "kind": "calibration_drift", - "ledger_value": 86110.0, + "ledger_value": 108689.66666666667, "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." @@ -2889,7 +2897,7 @@ { "fixture_value": 46244.0, "kind": "calibration_drift", - "ledger_value": 47330.0, + "ledger_value": 61718.666666666664, "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." @@ -2897,7 +2905,7 @@ { "fixture_value": 26481.0, "kind": "calibration_drift", - "ledger_value": 27065.0, + "ledger_value": 34050.444444444445, "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." @@ -2905,7 +2913,7 @@ { "fixture_value": 120819.0, "kind": "calibration_drift", - "ledger_value": 121018.0, + "ledger_value": 127403.22222222222, "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." @@ -2913,7 +2921,7 @@ { "fixture_value": 18143.0, "kind": "calibration_drift", - "ledger_value": 18536.0, + "ledger_value": 22338.333333333332, "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." @@ -2921,7 +2929,7 @@ { "fixture_value": 12325.0, "kind": "calibration_drift", - "ledger_value": 12726.0, + "ledger_value": 14685.777777777777, "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." @@ -2929,7 +2937,7 @@ { "fixture_value": 9555.0, "kind": "calibration_drift", - "ledger_value": 9793.0, + "ledger_value": 11133.666666666666, "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." @@ -2937,7 +2945,7 @@ { "fixture_value": 6230.0, "kind": "calibration_drift", - "ledger_value": 6398.0, + "ledger_value": 6951.222222222223, "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." @@ -2945,7 +2953,7 @@ { "fixture_value": 5884.0, "kind": "calibration_drift", - "ledger_value": 6020.0, + "ledger_value": 6508.222222222223, "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." @@ -2953,7 +2961,7 @@ { "fixture_value": 5362.0, "kind": "calibration_drift", - "ledger_value": 5488.0, + "ledger_value": 5913.444444444444, "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." @@ -2961,7 +2969,7 @@ { "fixture_value": 1786.0, "kind": "calibration_drift", - "ledger_value": 1829.0, + "ledger_value": 1884.111111111111, "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." @@ -2969,7 +2977,7 @@ { "fixture_value": 1491.0, "kind": "calibration_drift", - "ledger_value": 1543.0, + "ledger_value": 1653.7777777777778, "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." @@ -2977,7 +2985,7 @@ { "fixture_value": 173925.0, "kind": "calibration_drift", - "ledger_value": 173855.0, + "ledger_value": 197136.66666666666, "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." @@ -2985,7 +2993,7 @@ { "fixture_value": 375706.0, "kind": "calibration_drift", - "ledger_value": 369404.0, + "ledger_value": 377063.1111111111, "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." @@ -2993,7 +3001,7 @@ { "fixture_value": 200713.0, "kind": "calibration_drift", - "ledger_value": 197717.0, + "ledger_value": 195983.22222222222, "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." @@ -3001,7 +3009,7 @@ { "fixture_value": 107860.0, "kind": "calibration_drift", - "ledger_value": 106706.0, + "ledger_value": 114033.33333333333, "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." @@ -3009,7 +3017,7 @@ { "fixture_value": 144036.0, "kind": "calibration_drift", - "ledger_value": 143277.0, + "ledger_value": 149043.77777777778, "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." @@ -3017,7 +3025,7 @@ { "fixture_value": 377221.0, "kind": "calibration_drift", - "ledger_value": 379652.0, + "ledger_value": 399750.22222222225, "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." @@ -3025,7 +3033,7 @@ { "fixture_value": 341138.0, "kind": "calibration_drift", - "ledger_value": 341457.0, + "ledger_value": 386411.6666666667, "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." @@ -3033,11 +3041,19 @@ { "fixture_value": 67727478991.59665, "kind": "calibration_drift", - "ledger_value": 65937000000.0, + "ledger_value": 127316000000.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": 378000.0, + "kind": "calibration_drift", + "ledger_value": 584000.0, + "name": "hmrc.cgt.taxpayers_total", + "period": 2025, + "reason": "Ledger-compiled value differs from the fixture value at this comparison period." + }, { "fixture_value": 1236000000.0, "kind": "calibration_drift", diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json index efe5675ca..a34a5e228 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -884,14 +884,14 @@ }, { "kind": "ledger_only", - "ledger_value": 65937000000.0, + "ledger_value": 69861000000.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, + "ledger_value": 403000.0, "name": "hmrc.cgt.taxpayers_total", "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json index 558420794..f18c8786a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_target_reference_membership.json @@ -3,10 +3,9 @@ "target_period": 2025, "candidate_count": 21519, "contract_target_count": 33, - "active_reference_count": 19618, + "active_reference_count": 19932, "status_counts": { - "active": 19618, - "no_fact_at_or_before_period": 314, + "active": 19932, "no_fact_for_area": 1586, "signed_deferral_compile_error": 1 }, @@ -2824,333 +2823,11 @@ "W06000024" ] }, - { - "target_id": "ons.rent.private_rent", - "geography_level": "local_authority", - "reason_id": "private_rent_pipr_after_target_period", - "rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred.", - "area_ids": [ - "E06000001", - "E06000002", - "E06000003", - "E06000004", - "E06000005", - "E06000006", - "E06000007", - "E06000008", - "E06000009", - "E06000010", - "E06000011", - "E06000012", - "E06000013", - "E06000014", - "E06000015", - "E06000016", - "E06000017", - "E06000018", - "E06000019", - "E06000020", - "E06000021", - "E06000022", - "E06000023", - "E06000024", - "E06000025", - "E06000026", - "E06000027", - "E06000030", - "E06000031", - "E06000032", - "E06000033", - "E06000034", - "E06000035", - "E06000036", - "E06000037", - "E06000038", - "E06000039", - "E06000040", - "E06000041", - "E06000042", - "E06000043", - "E06000044", - "E06000045", - "E06000046", - "E06000047", - "E06000049", - "E06000050", - "E06000051", - "E06000052", - "E06000054", - "E06000055", - "E06000056", - "E06000057", - "E06000058", - "E06000059", - "E06000060", - "E06000061", - "E06000062", - "E06000063", - "E06000064", - "E06000065", - "E06000066", - "E07000008", - "E07000009", - "E07000010", - "E07000011", - "E07000012", - "E07000032", - "E07000033", - "E07000034", - "E07000035", - "E07000036", - "E07000037", - "E07000038", - "E07000039", - "E07000040", - "E07000041", - "E07000042", - "E07000043", - "E07000044", - "E07000045", - "E07000046", - "E07000047", - "E07000061", - "E07000062", - "E07000063", - "E07000064", - "E07000065", - "E07000066", - "E07000067", - "E07000068", - "E07000069", - "E07000070", - "E07000071", - "E07000072", - "E07000073", - "E07000074", - "E07000075", - "E07000076", - "E07000077", - "E07000078", - "E07000079", - "E07000080", - "E07000081", - "E07000082", - "E07000083", - "E07000084", - "E07000085", - "E07000086", - "E07000087", - "E07000088", - "E07000089", - "E07000090", - "E07000091", - "E07000092", - "E07000093", - "E07000094", - "E07000095", - "E07000096", - "E07000098", - "E07000099", - "E07000102", - "E07000103", - "E07000105", - "E07000106", - "E07000107", - "E07000108", - "E07000109", - "E07000110", - "E07000111", - "E07000112", - "E07000113", - "E07000114", - "E07000115", - "E07000116", - "E07000117", - "E07000118", - "E07000119", - "E07000120", - "E07000121", - "E07000122", - "E07000123", - "E07000124", - "E07000125", - "E07000126", - "E07000127", - "E07000128", - "E07000129", - "E07000130", - "E07000131", - "E07000132", - "E07000133", - "E07000134", - "E07000135", - "E07000136", - "E07000137", - "E07000138", - "E07000139", - "E07000140", - "E07000141", - "E07000142", - "E07000143", - "E07000144", - "E07000145", - "E07000146", - "E07000147", - "E07000148", - "E07000149", - "E07000170", - "E07000171", - "E07000172", - "E07000173", - "E07000174", - "E07000175", - "E07000176", - "E07000177", - "E07000178", - "E07000179", - "E07000180", - "E07000181", - "E07000192", - "E07000193", - "E07000194", - "E07000195", - "E07000196", - "E07000197", - "E07000198", - "E07000199", - "E07000200", - "E07000202", - "E07000203", - "E07000207", - "E07000208", - "E07000209", - "E07000210", - "E07000211", - "E07000212", - "E07000213", - "E07000214", - "E07000215", - "E07000216", - "E07000217", - "E07000218", - "E07000219", - "E07000220", - "E07000221", - "E07000222", - "E07000223", - "E07000224", - "E07000225", - "E07000226", - "E07000227", - "E07000228", - "E07000229", - "E07000234", - "E07000235", - "E07000236", - "E07000237", - "E07000238", - "E07000239", - "E07000240", - "E07000241", - "E07000242", - "E07000243", - "E07000244", - "E07000245", - "E08000001", - "E08000002", - "E08000003", - "E08000004", - "E08000005", - "E08000006", - "E08000007", - "E08000008", - "E08000009", - "E08000010", - "E08000011", - "E08000012", - "E08000013", - "E08000014", - "E08000015", - "E08000017", - "E08000018", - "E08000021", - "E08000022", - "E08000023", - "E08000024", - "E08000025", - "E08000026", - "E08000027", - "E08000028", - "E08000029", - "E08000030", - "E08000031", - "E08000032", - "E08000033", - "E08000034", - "E08000035", - "E08000036", - "E08000037", - "E09000002", - "E09000003", - "E09000004", - "E09000005", - "E09000006", - "E09000007", - "E09000008", - "E09000009", - "E09000010", - "E09000011", - "E09000012", - "E09000013", - "E09000014", - "E09000015", - "E09000016", - "E09000017", - "E09000018", - "E09000019", - "E09000020", - "E09000021", - "E09000022", - "E09000023", - "E09000024", - "E09000025", - "E09000026", - "E09000027", - "E09000028", - "E09000029", - "E09000030", - "E09000031", - "E09000032", - "E09000033", - "W06000001", - "W06000002", - "W06000003", - "W06000004", - "W06000005", - "W06000006", - "W06000008", - "W06000009", - "W06000010", - "W06000011", - "W06000012", - "W06000013", - "W06000014", - "W06000015", - "W06000016", - "W06000018", - "W06000019", - "W06000020", - "W06000021", - "W06000022", - "W06000023", - "W06000024" - ] - }, { "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "reason_id": "private_rent_pipr_english_lad_absent", - "rationale": "The pinned feed's sole PIPR period (2026-06) carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001.", + "rationale": "The pinned PIPR monthly series carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001.", "area_ids": [ "E06000053", "E08000016", @@ -3162,7 +2839,7 @@ "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "reason_id": "private_rent_pipr_scotland_brma_grain", - "rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred.", + "rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred.", "area_ids": [ "S12000005", "S12000006", @@ -3202,7 +2879,7 @@ "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "reason_id": "private_rent_pipr_ni_absent", - "rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent.", + "rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent.", "area_ids": [ "N09000001", "N09000002", @@ -139834,6 +139511,2518 @@ "geography_id": "W06000024", "from": "2021", "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000001", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000001", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000002", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000002", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000003", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000003", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000004", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000004", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000005", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000005", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000006", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000006", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000007", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000007", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000008", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000008", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000009", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000009", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000010", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000010", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000011", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000011", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000012", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000012", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000013", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000013", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000014", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000014", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000015", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000015", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000016", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000016", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000017", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000017", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000018", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000018", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000019", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000019", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000020", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000020", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000021", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000021", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000022", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000022", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000023", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000023", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000024", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000024", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000025", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000025", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000026", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000026", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000027", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000027", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000030", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000030", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000031", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000031", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000032", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000032", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000033", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000033", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000034", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000034", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000035", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000035", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000036", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000036", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000037", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000037", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000038", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000038", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000039", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000039", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000040", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000040", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000041", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000041", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000042", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000042", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000043", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000043", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000044", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000044", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000045", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000045", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000046", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000046", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000047", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000047", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000049", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000049", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000050", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000050", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000051", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000051", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000052", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000052", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000054", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000054", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000055", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000055", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000056", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000056", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000057", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000057", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000058", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000058", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000059", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000059", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000060", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000060", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000061", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000061", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000062", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000062", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000063", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000063", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000064", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000064", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000065", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000065", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E06000066", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E06000066", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000008", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000008", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000009", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000009", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000010", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000010", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000011", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000011", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000012", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000012", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000032", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000032", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000033", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000033", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000034", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000034", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000035", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000035", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000036", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000036", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000037", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000037", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000038", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000038", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000039", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000039", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000040", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000040", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000041", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000041", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000042", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000042", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000043", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000043", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000044", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000044", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000045", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000045", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000046", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000046", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000047", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000047", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000061", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000061", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000062", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000062", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000063", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000063", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000064", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000064", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000065", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000065", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000066", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000066", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000067", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000067", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000068", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000068", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000069", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000069", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000070", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000070", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000071", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000071", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000072", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000072", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000073", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000073", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000074", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000074", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000075", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000075", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000076", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000076", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000077", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000077", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000078", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000078", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000079", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000079", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000080", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000080", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000081", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000081", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000082", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000082", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000083", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000083", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000084", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000084", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000085", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000085", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000086", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000086", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000087", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000087", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000088", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000088", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000089", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000089", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000090", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000090", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000091", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000091", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000092", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000092", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000093", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000093", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000094", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000094", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000095", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000095", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000096", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000096", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000098", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000098", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000099", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000099", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000102", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000102", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000103", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000103", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000105", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000105", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000106", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000106", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000107", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000107", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000108", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000108", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000109", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000109", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000110", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000110", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000111", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000111", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000112", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000112", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000113", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000113", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000114", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000114", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000115", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000115", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000116", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000116", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000117", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000117", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000118", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000118", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000119", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000119", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000120", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000120", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000121", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000121", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000122", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000122", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000123", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000123", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000124", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000124", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000125", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000125", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000126", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000126", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000127", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000127", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000128", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000128", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000129", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000129", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000130", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000130", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000131", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000131", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000132", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000132", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000133", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000133", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000134", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000134", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000135", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000135", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000136", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000136", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000137", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000137", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000138", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000138", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000139", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000139", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000140", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000140", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000141", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000141", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000142", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000142", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000143", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000143", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000144", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000144", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000145", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000145", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000146", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000146", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000147", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000147", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000148", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000148", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000149", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000149", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000170", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000170", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000171", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000171", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000172", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000172", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000173", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000173", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000174", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000174", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000175", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000175", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000176", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000176", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000177", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000177", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000178", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000178", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000179", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000179", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000180", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000180", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000181", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000181", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000192", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000192", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000193", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000193", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000194", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000194", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000195", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000195", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000196", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000196", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000197", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000197", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000198", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000198", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000199", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000199", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000200", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000200", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000202", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000202", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000203", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000203", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000207", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000207", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000208", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000208", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000209", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000209", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000210", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000210", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000211", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000211", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000212", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000212", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000213", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000213", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000214", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000214", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000215", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000215", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000216", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000216", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000217", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000217", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000218", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000218", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000219", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000219", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000220", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000220", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000221", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000221", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000222", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000222", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000223", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000223", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000224", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000224", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000225", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000225", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000226", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000226", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000227", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000227", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000228", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000228", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000229", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000229", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000234", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000234", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000235", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000235", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000236", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000236", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000237", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000237", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000238", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000238", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000239", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000239", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000240", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000240", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000241", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000241", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000242", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000242", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000243", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000243", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000244", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000244", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E07000245", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E07000245", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000001", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000001", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000002", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000002", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000003", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000003", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000004", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000004", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000005", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000005", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000006", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000006", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000007", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000007", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000008", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000008", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000009", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000009", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000010", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000010", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000011", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000011", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000012", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000012", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000013", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000013", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000014", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000014", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000015", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000015", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000017", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000017", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000018", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000018", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000021", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000021", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000022", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000022", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000023", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000023", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000024", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000024", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000025", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000025", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000026", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000026", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000027", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000027", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000028", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000028", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000029", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000029", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000030", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000030", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000031", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000031", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000032", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000032", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000033", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000033", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000034", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000034", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000035", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000035", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000036", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000036", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E08000037", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E08000037", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000002", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000002", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000003", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000003", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000004", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000004", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000005", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000005", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000006", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000006", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000007", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000007", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000008", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000008", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000009", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000009", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000010", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000010", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000011", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000011", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000012", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000012", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000013", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000013", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000014", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000014", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000015", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000015", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000016", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000016", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000017", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000017", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000018", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000018", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000019", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000019", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000020", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000020", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000021", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000021", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000022", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000022", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000023", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000023", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000024", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000024", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000025", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000025", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000026", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000026", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000027", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000027", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000028", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000028", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000029", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000029", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000030", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000030", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000031", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000031", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000032", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000032", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@E09000033", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "E09000033", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000001", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000001", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000002", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000002", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000003", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000003", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000004", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000004", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000005", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000005", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000006", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000006", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000008", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000008", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000009", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000009", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000010", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000010", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000011", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000011", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000012", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000012", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000013", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000013", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000014", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000014", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000015", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000015", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000016", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000016", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000018", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000018", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000019", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000019", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000020", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000020", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000021", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000021", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000022", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000022", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000023", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000023", + "from": "2025-12", + "to": "2025" + }, + { + "name": "ons.rent.private_rent@W06000024", + "target_id": "ons.rent.private_rent", + "geography_level": "local_authority", + "geography_id": "W06000024", + "from": "2025-12", + "to": "2025" } ], "holds_by_target": { @@ -139854,6 +142043,7 @@ "ons.age.50_60": 1011, "ons.age.60_70": 1011, "ons.age.70_80": 1011, + "ons.rent.private_rent": 314, "ons.tenure.owned_mortgage": 361, "ons.tenure.owned_outright": 361, "ons.tenure.private_rent": 361, @@ -376520,10 +378710,10 @@ } }, "ons.rent.private_rent": { - "status": "multiple_deferrals", + "status": "partially_active", "geography_levels": { "local_authority": { - "status": "multiple_deferrals", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -376531,588 +378721,637 @@ "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000001", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 551.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_810204c1d20803046f0b0e85" }, { "name": "ons.rent.private_rent@E06000002", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000002", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 665.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_271d7b655bec1a9c0c83561d" }, { "name": "ons.rent.private_rent@E06000003", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000003", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 624.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6ac6d9e904a5619acd8ccdb6" }, { "name": "ons.rent.private_rent@E06000004", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000004", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 705.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2c472c6ccad870107938350f" }, { "name": "ons.rent.private_rent@E06000005", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000005", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 641.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_83540ce72ca002172a2bb9b7" }, { "name": "ons.rent.private_rent@E06000006", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000006", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 698.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4a90543b7740232645f2ccea" }, { "name": "ons.rent.private_rent@E06000007", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000007", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 849.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3c1480a320c56ec1fa6ef108" }, { "name": "ons.rent.private_rent@E06000008", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000008", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 676.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a6931fe3736e16d874703d11" }, { "name": "ons.rent.private_rent@E06000009", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000009", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 665.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6454309306b9e0d99c61919f" }, { "name": "ons.rent.private_rent@E06000010", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000010", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 645.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f668ac3be0340547971e223a" }, { "name": "ons.rent.private_rent@E06000011", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000011", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 686.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_24f7b798b27e0a2e941fd029" }, { "name": "ons.rent.private_rent@E06000012", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000012", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 598.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b2e3628fa9cc881526a358cc" }, { "name": "ons.rent.private_rent@E06000013", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000013", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 612.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_18038fb4505d7b66d0aa573c" }, { "name": "ons.rent.private_rent@E06000014", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000014", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1126.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f0bb784c3f78a682dfacd077" }, { "name": "ons.rent.private_rent@E06000015", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000015", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 831.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_85e76449be5afd13fcffab38" }, { "name": "ons.rent.private_rent@E06000016", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000016", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 999.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f8f8980bb372345a3bf3b869" }, { "name": "ons.rent.private_rent@E06000017", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000017", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 933.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f4a8a6b95cb1ddac3841125c" }, { "name": "ons.rent.private_rent@E06000018", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000018", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 981.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7e30fb92f37eb60929bebe53" }, { "name": "ons.rent.private_rent@E06000019", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000019", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 797.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_19376586811ea805374e101d" }, { "name": "ons.rent.private_rent@E06000020", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000020", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 801.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b05f3bd28f2465d69d1ebb11" }, { "name": "ons.rent.private_rent@E06000021", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000021", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 674.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0b61fb9d53ad6161b4854855" }, { "name": "ons.rent.private_rent@E06000022", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000022", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1750.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7cd601c3b01cbed71a37d00a" }, { "name": "ons.rent.private_rent@E06000023", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000023", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1785.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_19441274e85cfbf2a53a19f6" }, { "name": "ons.rent.private_rent@E06000024", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000024", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1166.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bb6f89d9b6d2a99e5a7958a9" }, { "name": "ons.rent.private_rent@E06000025", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000025", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1401.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e8b56e1ca0dc8e8fcd91cf41" }, { "name": "ons.rent.private_rent@E06000026", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000026", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 954.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dccb64528decb2ee04ee3df1" }, { "name": "ons.rent.private_rent@E06000027", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000027", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 876.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4ef1c1ebe4c5342ed14c3bb4" }, { "name": "ons.rent.private_rent@E06000030", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000030", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1052.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5d90b1e2611a261bab055083" }, { "name": "ons.rent.private_rent@E06000031", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000031", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 964.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a24df2d888c26d7dfca75cc4" }, { "name": "ons.rent.private_rent@E06000032", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000032", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1183.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a72a214b5e5dc070873915c9" }, { "name": "ons.rent.private_rent@E06000033", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000033", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1234.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9b5f614e81c986af0c7a6d4d" }, { "name": "ons.rent.private_rent@E06000034", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000034", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1296.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_854fde2346e363b3a4135752" }, { "name": "ons.rent.private_rent@E06000035", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000035", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1201.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_fd725845f9da1eb08e20b7e4" }, { "name": "ons.rent.private_rent@E06000036", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000036", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1431.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0d94e75a4f46be98adc0ee13" }, { "name": "ons.rent.private_rent@E06000037", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000037", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1261.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_202a66601337fa82c0df62e7" }, { "name": "ons.rent.private_rent@E06000038", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000038", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1548.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f52ab4c5dc2d6f6811c443de" }, { "name": "ons.rent.private_rent@E06000039", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000039", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1526.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_fd3afc14952b0a2c54922107" }, { "name": "ons.rent.private_rent@E06000040", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000040", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1772.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1777eaca3f429c6b982005b8" }, { "name": "ons.rent.private_rent@E06000041", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000041", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1445.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9bef4717cb09ac86b19a7cec" }, { "name": "ons.rent.private_rent@E06000042", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000042", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1293.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_15a06adfc9743d2ec0e450db" }, { "name": "ons.rent.private_rent@E06000043", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000043", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1821.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3e56e15e5e65786e6c017918" }, { "name": "ons.rent.private_rent@E06000044", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000044", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1331.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_21b90c3155f8978f3a037666" }, { "name": "ons.rent.private_rent@E06000045", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000045", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1212.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9bb2a43817b8bc2e31525d0a" }, { "name": "ons.rent.private_rent@E06000046", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000046", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 881.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_21609a0980bc2e9280f3dab9" }, { "name": "ons.rent.private_rent@E06000047", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000047", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 605.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_919ec320bebe3720fbe957b2" }, { "name": "ons.rent.private_rent@E06000049", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000049", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 920.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_58511ba8e787ea6978982b9c" }, { "name": "ons.rent.private_rent@E06000050", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000050", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 925.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_861940ed2c9354fee89022b0" }, { "name": "ons.rent.private_rent@E06000051", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000051", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 785.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_54ce4c1d92283c4e5ba43b53" }, { "name": "ons.rent.private_rent@E06000052", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000052", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 970.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_37d3a4fafd10e861fe355932" }, { "name": "ons.rent.private_rent@E06000053", @@ -377124,2311 +379363,2503 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_english_lad_absent", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." + "signed_rationale": "The pinned PIPR monthly series carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." }, { "name": "ons.rent.private_rent@E06000054", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000054", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1013.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_35b672d614d0c6192b959c7c" }, { "name": "ons.rent.private_rent@E06000055", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000055", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1128.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a1ee97d70262a62a3eefaf18" }, { "name": "ons.rent.private_rent@E06000056", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000056", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1194.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b9c14ed42bcae1e33f262aa0" }, { "name": "ons.rent.private_rent@E06000057", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000057", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 644.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_59c5b92be7d7371c19df03de" }, { "name": "ons.rent.private_rent@E06000058", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000058", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1362.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c1d1bdc7a55df37d02d0f111" }, { "name": "ons.rent.private_rent@E06000059", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000059", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1010.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3f3b70b49342b289a9d9c229" }, { "name": "ons.rent.private_rent@E06000060", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000060", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1413.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_40ca0f68c317c814c621b48b" }, { "name": "ons.rent.private_rent@E06000061", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000061", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 928.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7cdbd2c6663b7f305a01c4a1" }, { "name": "ons.rent.private_rent@E06000062", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000062", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1042.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6deec46f69f3745da5cc6bc7" }, { "name": "ons.rent.private_rent@E06000063", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000063", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 629.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_029910e8a6230dd4b86cb3fc" }, { "name": "ons.rent.private_rent@E06000064", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000064", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 761.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_01ee3934c30c4dcf165910c0" }, { "name": "ons.rent.private_rent@E06000065", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000065", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 824.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3aa869be8b4e6ba9c05d39e1" }, { "name": "ons.rent.private_rent@E06000066", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E06000066", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 956.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_01d31fe20a6c371cf64afe7b" }, { "name": "ons.rent.private_rent@E07000008", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000008", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1771.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f0ce90f2621ffee4684f4c9d" }, { "name": "ons.rent.private_rent@E07000009", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000009", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1026.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_efb076e62d30b36b51293985" }, { "name": "ons.rent.private_rent@E07000010", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000010", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 807.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2c2af2e059ae6ef7a0fd992e" }, { "name": "ons.rent.private_rent@E07000011", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000011", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1016.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7bf5c9614351c29dc17a3b47" }, { "name": "ons.rent.private_rent@E07000012", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000012", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1358.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bfca2cbd7d42512a91d9b046" }, { "name": "ons.rent.private_rent@E07000032", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000032", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 762.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c0ac4942949cba67dfda3884" }, { "name": "ons.rent.private_rent@E07000033", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000033", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 666.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_af317b500ebabd62b26c6e93" }, { "name": "ons.rent.private_rent@E07000034", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000034", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 725.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b9168ebbc5eea5ee846d5c2c" }, { "name": "ons.rent.private_rent@E07000035", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000035", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 755.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4a3bfe8f7887f534072c8200" }, { "name": "ons.rent.private_rent@E07000036", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000036", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 814.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5b8bd6d763dc5f4bf9651cea" }, { "name": "ons.rent.private_rent@E07000037", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000037", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 875.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d442b07e33926d9730203f5e" }, { "name": "ons.rent.private_rent@E07000038", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000038", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 752.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_626655bd71ca77f65f00faa7" }, { "name": "ons.rent.private_rent@E07000039", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000039", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 842.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9ac6a2e01f81e24a948a0f80" }, { "name": "ons.rent.private_rent@E07000040", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000040", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 909.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_30a126e8cb493814c7c7f351" }, { "name": "ons.rent.private_rent@E07000041", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000041", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1300.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9cae5b799f91549f74e539eb" }, { "name": "ons.rent.private_rent@E07000042", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000042", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 860.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c0c653de04a05d201a9aa99e" }, { "name": "ons.rent.private_rent@E07000043", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000043", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 838.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bb81827272921c6cd7c73548" }, { "name": "ons.rent.private_rent@E07000044", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000044", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 976.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dba28ad7de1f59368dbfba47" }, { "name": "ons.rent.private_rent@E07000045", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000045", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 920.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_359c2ca2ba505e363b9a7aa6" }, { "name": "ons.rent.private_rent@E07000046", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000046", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 770.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2ed26fdaefb5f2775c420057" }, { "name": "ons.rent.private_rent@E07000047", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000047", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 823.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a33d622e6db5d1c13fb9f149" }, { "name": "ons.rent.private_rent@E07000061", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000061", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1151.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e4e985938b593cccae73681a" }, { "name": "ons.rent.private_rent@E07000062", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000062", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 989.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_38a47ebfd9616337e301a0b0" }, { "name": "ons.rent.private_rent@E07000063", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000063", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1260.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_198b274daad90574ada45d94" }, { "name": "ons.rent.private_rent@E07000064", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000064", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1152.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_eaa17e6f6b1d42882a4d0405" }, { "name": "ons.rent.private_rent@E07000065", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000065", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1240.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5aeb5cf5a846e34eb0186c3b" }, { "name": "ons.rent.private_rent@E07000066", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000066", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1344.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d6f27dfe6e32948ffce1e92c" }, { "name": "ons.rent.private_rent@E07000067", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000067", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1185.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e2f99b02a25c6a5cd1039cb2" }, { "name": "ons.rent.private_rent@E07000068", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000068", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1586.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3af031d1dd97504761e6d0a5" }, { "name": "ons.rent.private_rent@E07000069", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000069", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1194.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_604b11df7183a128acfbbc63" }, { "name": "ons.rent.private_rent@E07000070", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000070", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1382.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7f407eb84b88714db47aff3f" }, { "name": "ons.rent.private_rent@E07000071", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000071", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1168.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_49df4648b9ca34345cfd3ffc" }, { "name": "ons.rent.private_rent@E07000072", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000072", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1738.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b7841c7c3f8682361ca057cd" }, { "name": "ons.rent.private_rent@E07000073", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000073", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1447.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b05e957bf06be944ca43cedc" }, { "name": "ons.rent.private_rent@E07000074", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000074", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1090.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_024a229b9a221acd197ce618" }, { "name": "ons.rent.private_rent@E07000075", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000075", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1234.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f65219c703af0c2f9a8a36b4" }, { "name": "ons.rent.private_rent@E07000076", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000076", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1002.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c0ef52f9a0c19ed6651a16aa" }, { "name": "ons.rent.private_rent@E07000077", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000077", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1275.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4c1a3bf8ea3efe5b61f5f1c6" }, { "name": "ons.rent.private_rent@E07000078", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000078", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1207.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_27883935b7a2701c46d0f337" }, { "name": "ons.rent.private_rent@E07000079", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000079", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1184.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_699de35c991f74599415c82b" }, { "name": "ons.rent.private_rent@E07000080", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000080", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 818.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8004fa5bbc5bb30de53f65d9" }, { "name": "ons.rent.private_rent@E07000081", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000081", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1036.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a99b9bd8ea3851354c2e41be" }, { "name": "ons.rent.private_rent@E07000082", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000082", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 978.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dd9595e678845e93338643fe" }, { "name": "ons.rent.private_rent@E07000083", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000083", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 962.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_df839cdfa506d6bc5f529581" }, { "name": "ons.rent.private_rent@E07000084", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000084", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1279.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1333b24eb2bc2a37ba6023ae" }, { "name": "ons.rent.private_rent@E07000085", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000085", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1237.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_49d37da58a456f651bd3ecd5" }, { "name": "ons.rent.private_rent@E07000086", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000086", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1170.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dbecedbae6a74ed10d890bc2" }, { "name": "ons.rent.private_rent@E07000087", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000087", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1163.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ab6d758b152f05f718cf0c34" }, { "name": "ons.rent.private_rent@E07000088", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000088", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1098.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d33ff9e9030b3fc1df020fc3" }, { "name": "ons.rent.private_rent@E07000089", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000089", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1363.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d13114b94dda4081808ab5d1" }, { "name": "ons.rent.private_rent@E07000090", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000090", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1111.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9422b15ecc4369a639054549" }, { "name": "ons.rent.private_rent@E07000091", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000091", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1216.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_12f3286ec234cc019107b27f" }, { "name": "ons.rent.private_rent@E07000092", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000092", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1305.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bc19fa809fbcb7a79df69931" }, { "name": "ons.rent.private_rent@E07000093", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000093", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1153.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d444280dbf290eb7fd4b6bb2" }, { "name": "ons.rent.private_rent@E07000094", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000094", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1445.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_14d0dd786f2df04b852e5e23" }, { "name": "ons.rent.private_rent@E07000095", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000095", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1618.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d94d5c7b57d90eed5baad181" }, { "name": "ons.rent.private_rent@E07000096", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000096", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1558.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bca2d06548c881791cc675fb" }, { "name": "ons.rent.private_rent@E07000098", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000098", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1760.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_41cc19e44248a4854ad1d5ab" }, { "name": "ons.rent.private_rent@E07000099", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000099", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1358.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ecba66695e08825cecc7462a" }, { "name": "ons.rent.private_rent@E07000102", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000102", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1772.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_537385ad428a88d2798d557e" }, { "name": "ons.rent.private_rent@E07000103", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000103", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1766.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dec0bd357653032e74429e9e" }, { "name": "ons.rent.private_rent@E07000105", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000105", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1199.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ccfa5f938fc75aacc4a5472e" }, { "name": "ons.rent.private_rent@E07000106", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000106", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1210.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e15f95b4f0f75a0a1502dcdf" }, { "name": "ons.rent.private_rent@E07000107", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000107", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1517.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5eb22e86431c1f5bd6a3651e" }, { "name": "ons.rent.private_rent@E07000108", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000108", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 930.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_983c270d2bfcc3af94f6d9ed" }, { "name": "ons.rent.private_rent@E07000109", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000109", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1260.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0a28a5319ff4b0f5b6c22c01" }, { "name": "ons.rent.private_rent@E07000110", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000110", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1249.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0b2abf43801f71090095c848" }, { "name": "ons.rent.private_rent@E07000111", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000111", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1726.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_19d903c06d7eff120748316a" }, { "name": "ons.rent.private_rent@E07000112", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000112", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1068.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_00fda033140b7c2f36a951be" }, { "name": "ons.rent.private_rent@E07000113", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000113", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1090.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_094f23fb0b64bd2d178d3b37" }, { "name": "ons.rent.private_rent@E07000114", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000114", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1064.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6449e295c8d3691f00101609" }, { "name": "ons.rent.private_rent@E07000115", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000115", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1431.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ef3095126683bfc6fdd39104" }, { "name": "ons.rent.private_rent@E07000116", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000116", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1450.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7154b7962ca250fc24e868e7" }, { "name": "ons.rent.private_rent@E07000117", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000117", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 605.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bfce22bc0b6559b4c54bb1d6" }, { "name": "ons.rent.private_rent@E07000118", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000118", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 739.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_058e77788fe14ab478de6a0a" }, { "name": "ons.rent.private_rent@E07000119", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000119", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 816.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6a41d7fa0f0ed2295b7b747e" }, { "name": "ons.rent.private_rent@E07000120", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000120", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 619.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_10c07b95168cfd38991a7caa" }, { "name": "ons.rent.private_rent@E07000121", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000121", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 768.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_958d9c99d305ad3a8600486a" }, { "name": "ons.rent.private_rent@E07000122", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000122", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 622.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_09700ff82cdea650c016ee86" }, { "name": "ons.rent.private_rent@E07000123", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000123", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 738.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b781872fea4d6d933d6cad05" }, { "name": "ons.rent.private_rent@E07000124", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000124", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 772.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_220c2f0113a1871defbab5e8" }, { "name": "ons.rent.private_rent@E07000125", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000125", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 767.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f4ea19267d324edefa1d6871" }, { "name": "ons.rent.private_rent@E07000126", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000126", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 758.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d09919573a65b4bf4ca0e175" }, { "name": "ons.rent.private_rent@E07000127", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000127", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 750.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_03a2e4db13a80d93377cb42b" }, { "name": "ons.rent.private_rent@E07000128", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000128", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 688.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e7d7eb9b53defa48deb7cfc9" }, { "name": "ons.rent.private_rent@E07000129", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000129", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 936.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_cd8288192f3aa74c1ef5dac6" }, { "name": "ons.rent.private_rent@E07000130", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000130", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 914.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7bc61af5a2366569d36515f7" }, { "name": "ons.rent.private_rent@E07000131", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000131", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 940.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0f224d9d1b9038cb10b37c47" }, { "name": "ons.rent.private_rent@E07000132", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000132", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 894.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5386181d54b6cb5f79cdae58" }, { "name": "ons.rent.private_rent@E07000133", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000133", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 751.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_35272b85a9896bea1a1fb2f5" }, { "name": "ons.rent.private_rent@E07000134", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000134", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 842.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a5aafd241583adaa06b8ab44" }, { "name": "ons.rent.private_rent@E07000135", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000135", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 983.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_eff789e5488fde838b4c9304" }, { "name": "ons.rent.private_rent@E07000136", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000136", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 782.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_213df6008ba9ca1d291efb1d" }, { "name": "ons.rent.private_rent@E07000137", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000137", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 658.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e1a00576cae9087bef1f3029" }, { "name": "ons.rent.private_rent@E07000138", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000138", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 901.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_55b27f47be22ef6b217bdbcc" }, { "name": "ons.rent.private_rent@E07000139", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000139", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 777.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_17530785930886c0f6f7f9b4" }, { "name": "ons.rent.private_rent@E07000140", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000140", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 739.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d1d3086d96f841dda79a1243" }, { "name": "ons.rent.private_rent@E07000141", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000141", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 831.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3ab087dc0406eb472db2ea37" }, { "name": "ons.rent.private_rent@E07000142", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000142", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 674.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_14c58dbfe62bca1202ee7d9e" }, { "name": "ons.rent.private_rent@E07000143", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000143", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 881.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ca13784039e7fbb9d7e35600" }, { "name": "ons.rent.private_rent@E07000144", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000144", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 894.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_514cdbf0b8951d92e82439c9" }, { "name": "ons.rent.private_rent@E07000145", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000145", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 779.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3a4a085bacfc62d74bb3ea19" }, { "name": "ons.rent.private_rent@E07000146", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000146", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 900.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d97bd5aeb72d8273472a4cf3" }, { "name": "ons.rent.private_rent@E07000147", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000147", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 822.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_aed2589671654a1f76b3a844" }, { "name": "ons.rent.private_rent@E07000148", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000148", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1129.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a8645f57bbbb2fbc331114f0" }, { "name": "ons.rent.private_rent@E07000149", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000149", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 943.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_73c4750f48a8a08b3be0be8f" }, { "name": "ons.rent.private_rent@E07000170", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000170", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 754.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_341f1c835b133418b9ca147c" }, { "name": "ons.rent.private_rent@E07000171", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000171", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 697.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_27787a20c9ca64933d0848b8" }, { "name": "ons.rent.private_rent@E07000172", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000172", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 947.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c9c6dea684a2baeafa4fe450" }, { "name": "ons.rent.private_rent@E07000173", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000173", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 870.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c39e7d09e8289926db0d149c" }, { "name": "ons.rent.private_rent@E07000174", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000174", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 752.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5b147274ca75158310aad992" }, { "name": "ons.rent.private_rent@E07000175", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000175", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 772.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_84e6c093ed4d04ad6543a3cb" }, { "name": "ons.rent.private_rent@E07000176", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000176", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1008.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c30d97eef50384f9a02d2550" }, { "name": "ons.rent.private_rent@E07000177", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000177", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1261.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_92a06b499b17ba32b5828943" }, { "name": "ons.rent.private_rent@E07000178", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000178", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1866.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_eea758f2ea09dfbe0910ce6c" }, { "name": "ons.rent.private_rent@E07000179", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000179", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1365.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_51b4bf93c1c39d361ff05097" }, { "name": "ons.rent.private_rent@E07000180", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000180", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1312.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c232557318acf1a543f088a6" }, { "name": "ons.rent.private_rent@E07000181", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000181", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1277.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_17d817f51981b62278817fc6" }, { "name": "ons.rent.private_rent@E07000192", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000192", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 809.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c7cd446794f733fb5bb1a55b" }, { "name": "ons.rent.private_rent@E07000193", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000193", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 806.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c3bdf27a376b8c2cd5705e88" }, { "name": "ons.rent.private_rent@E07000194", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000194", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1018.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_697b995d183f5f45e6ea25a6" }, { "name": "ons.rent.private_rent@E07000195", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000195", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 770.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2f36d88cd2bb80d99be8b862" }, { "name": "ons.rent.private_rent@E07000196", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000196", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 902.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f90a206389db72898316ad34" }, { "name": "ons.rent.private_rent@E07000197", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000197", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 843.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6e3b44fe022050fb56e6e40b" }, { "name": "ons.rent.private_rent@E07000198", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000198", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 675.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_19b3227bd2eec7d39d5a3594" }, { "name": "ons.rent.private_rent@E07000199", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000199", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 915.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b5eef7a4aea52bcd1521a32b" }, { "name": "ons.rent.private_rent@E07000200", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000200", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 936.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a813769cd3215e69c2f5a238" }, { "name": "ons.rent.private_rent@E07000202", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000202", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 957.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e3aaa7050fd74c09d2546a41" }, { "name": "ons.rent.private_rent@E07000203", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000203", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 940.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_972573b0265bcbe35615570c" }, { "name": "ons.rent.private_rent@E07000207", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000207", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1856.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_fb64295877a6b9d4751154ba" }, { "name": "ons.rent.private_rent@E07000208", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000208", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1669.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c8e932871793fe33d5570a1a" }, { "name": "ons.rent.private_rent@E07000209", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000209", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1644.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_eb24aaf6f1ddd10c887312cf" }, { "name": "ons.rent.private_rent@E07000210", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000210", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1511.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_42dd5cb207900dd2202bb8b3" }, { "name": "ons.rent.private_rent@E07000211", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000211", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1595.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5f9c28fba18287898f823930" }, { "name": "ons.rent.private_rent@E07000212", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000212", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1605.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5cfe7068e0d78b4393b25ac2" }, { "name": "ons.rent.private_rent@E07000213", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000213", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1612.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_04466c256096f7699ff1258f" }, { "name": "ons.rent.private_rent@E07000214", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000214", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1473.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3f6f6f3241094b397ca7f00d" }, { "name": "ons.rent.private_rent@E07000215", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000215", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1557.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_28e803c629ff54749181a4c0" }, { "name": "ons.rent.private_rent@E07000216", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000216", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1478.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_267e5ed263dcdfac0ac547ed" }, { "name": "ons.rent.private_rent@E07000217", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000217", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1641.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5556956c4f8d50e28e6eac86" }, { "name": "ons.rent.private_rent@E07000218", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000218", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 922.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ab14bfaf20df227fb132a3e1" }, { "name": "ons.rent.private_rent@E07000219", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000219", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 870.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b60e0bacfef026336702cbf" }, { "name": "ons.rent.private_rent@E07000220", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000220", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 991.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_79abacf194185113ea514a6a" }, { "name": "ons.rent.private_rent@E07000221", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000221", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1080.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_517b9993cc1bf9f604e288fa" }, { "name": "ons.rent.private_rent@E07000222", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000222", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1216.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_30fc53090dc6c0abef8dfebe" }, { "name": "ons.rent.private_rent@E07000223", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000223", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1351.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_155efc60bc5b7f7bf0bacd7e" }, { "name": "ons.rent.private_rent@E07000224", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000224", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1187.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7205ba4b23ff26aa39a41758" }, { "name": "ons.rent.private_rent@E07000225", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000225", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1288.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e6672436c08a7268a2e7c24a" }, { "name": "ons.rent.private_rent@E07000226", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000226", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1434.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_017f0c8837c191104dd15517" }, { "name": "ons.rent.private_rent@E07000227", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000227", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1410.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a7ec8dfa4909e2ad75a03220" }, { "name": "ons.rent.private_rent@E07000228", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000228", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1372.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_51bb55033b5440338e146f34" }, { "name": "ons.rent.private_rent@E07000229", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000229", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1292.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bc0c3de1efc104088a5d81b9" }, { "name": "ons.rent.private_rent@E07000234", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000234", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 965.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_23b20571a6349636587789f0" }, { "name": "ons.rent.private_rent@E07000235", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000235", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 883.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f7bb7a0172a7bd7e3f65bbfd" }, { "name": "ons.rent.private_rent@E07000236", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000236", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 885.9166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_902fc8783480f6ae7e08c6cc" }, { "name": "ons.rent.private_rent@E07000237", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000237", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 922.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5b5c936cf32c5332e190ca94" }, { "name": "ons.rent.private_rent@E07000238", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000238", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 915.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0995f1d911b1c98e2f0be7b1" }, { "name": "ons.rent.private_rent@E07000239", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000239", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 833.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_46a791af9c05132f8cb185ab" }, { "name": "ons.rent.private_rent@E07000240", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000240", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1872.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8acfb8f1377d3c6d10e6763a" }, { "name": "ons.rent.private_rent@E07000241", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000241", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1440.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_80a8751658e970d3df525fba" }, { "name": "ons.rent.private_rent@E07000242", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000242", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1458.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f431447d4ea8c52965208fee" }, { "name": "ons.rent.private_rent@E07000243", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000243", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1371.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5fe11cd170f21e789fd267d0" }, { "name": "ons.rent.private_rent@E07000244", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000244", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 799.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_13f713d616d394e24d5c7926" }, { "name": "ons.rent.private_rent@E07000245", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E07000245", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1132.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b51893cb171baae17adc97d0" }, { "name": "ons.rent.private_rent@E08000001", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000001", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 816.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6ad19cbf9ba670cabb2fd330" }, { "name": "ons.rent.private_rent@E08000002", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000002", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 939.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5a20dd61769f3c062dfc9a3a" }, { "name": "ons.rent.private_rent@E08000003", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000003", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1316.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1b98d36c90dbcd49e2b411d9" }, { "name": "ons.rent.private_rent@E08000004", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000004", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 832.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d40f81fef744ebb5b02d6191" }, { "name": "ons.rent.private_rent@E08000005", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000005", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 774.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d6166544434140fb115a543e" }, { "name": "ons.rent.private_rent@E08000006", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000006", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1125.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_428f6d951b389ee6c21a328b" }, { "name": "ons.rent.private_rent@E08000007", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000007", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1054.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_80ba2950ee9b86b52c9f3dee" }, { "name": "ons.rent.private_rent@E08000008", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000008", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 873.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8a1afea7a499c9317cb2a9f7" }, { "name": "ons.rent.private_rent@E08000009", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000009", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1330.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ad5b1050fdd3e3d093b460d9" }, { "name": "ons.rent.private_rent@E08000010", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000010", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 695.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7a1fc63383ab5623a95a7818" }, { "name": "ons.rent.private_rent@E08000011", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000011", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 773.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9e3054db2df2338fcc075b6f" }, { "name": "ons.rent.private_rent@E08000012", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000012", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 855.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3360e7a852070e097fb8c319" }, { "name": "ons.rent.private_rent@E08000013", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000013", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 751.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4f146a6a3789fd099bdba357" }, { "name": "ons.rent.private_rent@E08000014", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000014", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 883.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_05f6853f9ffa9ee2915dfa5c" }, { "name": "ons.rent.private_rent@E08000015", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000015", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 796.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8ef1d94c585e5e3cc2a05e06" }, { "name": "ons.rent.private_rent@E08000016", @@ -379440,31 +381871,33 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_english_lad_absent", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." + "signed_rationale": "The pinned PIPR monthly series carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." }, { "name": "ons.rent.private_rent@E08000017", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000017", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 656.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_36fe7415dde7966e99d1865d" }, { "name": "ons.rent.private_rent@E08000018", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000018", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 657.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_60282c8064b55c4aa24b76a1" }, { "name": "ons.rent.private_rent@E08000019", @@ -379476,211 +381909,228 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_english_lad_absent", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." + "signed_rationale": "The pinned PIPR monthly series carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." }, { "name": "ons.rent.private_rent@E08000021", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000021", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1102.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_60f60efbf9fd26fa63bd0bde" }, { "name": "ons.rent.private_rent@E08000022", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000022", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 798.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4f6d7b84b262ffea0b43c260" }, { "name": "ons.rent.private_rent@E08000023", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000023", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 688.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b8b75649506b713367db4463" }, { "name": "ons.rent.private_rent@E08000024", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000024", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 676.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d1bc71d0bbeb957b6ad5d69d" }, { "name": "ons.rent.private_rent@E08000025", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000025", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1061.9166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_11105c7391f8a1b8093ab570" }, { "name": "ons.rent.private_rent@E08000026", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000026", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 998.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7f2f23b9b987fceb73787048" }, { "name": "ons.rent.private_rent@E08000027", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000027", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 814.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_876c0b9dadfd9d102a386da7" }, { "name": "ons.rent.private_rent@E08000028", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000028", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 877.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bae4ea69c1858d54a1e99aec" }, { "name": "ons.rent.private_rent@E08000029", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000029", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1243.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_228af30fbc76163afaaf197d" }, { "name": "ons.rent.private_rent@E08000030", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000030", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 851.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9042477d8aca6421138ad150" }, { "name": "ons.rent.private_rent@E08000031", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000031", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 851.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_246163d20c48b855fd01c8aa" }, { "name": "ons.rent.private_rent@E08000032", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000032", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 718.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6fb9eb4cdbe5e6583b4a1f67" }, { "name": "ons.rent.private_rent@E08000033", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000033", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 723.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7987c949cdfb7bb1c2948366" }, { "name": "ons.rent.private_rent@E08000034", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000034", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 697.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_90e685f8021eeed56afdcc9a" }, { "name": "ons.rent.private_rent@E08000035", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000035", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1102.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8110de1607cb39fcd73ab028" }, { "name": "ons.rent.private_rent@E08000036", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000036", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 758.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_002b0bed452c07d2436d0f72" }, { "name": "ons.rent.private_rent@E08000037", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E08000037", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 757.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1fc05963f81173af16d51f63" }, { "name": "ons.rent.private_rent@E09000001", @@ -379692,391 +382142,423 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_english_lad_absent", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." + "signed_rationale": "The pinned PIPR monthly series carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001." }, { "name": "ons.rent.private_rent@E09000002", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000002", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1621.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2eff6c5d9bf72e1c88d8a8e5" }, { "name": "ons.rent.private_rent@E09000003", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000003", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1872.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4e93e47d0c7604d3c9a115e8" }, { "name": "ons.rent.private_rent@E09000004", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000004", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1476.8333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2e0488eac604b43d2f8c492c" }, { "name": "ons.rent.private_rent@E09000005", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000005", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2003.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_53b3033189dcd5a2651e2464" }, { "name": "ons.rent.private_rent@E09000006", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000006", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1629.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_744a892f0301c66a3d57fa32" }, { "name": "ons.rent.private_rent@E09000007", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000007", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2797.5833333333335, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5e02a3b27cc1376727035f0c" }, { "name": "ons.rent.private_rent@E09000008", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000008", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1521.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ddde27b676fe29efbe291cf9" }, { "name": "ons.rent.private_rent@E09000009", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000009", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2040.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9c6487a9022e5cd2c8c17aa9" }, { "name": "ons.rent.private_rent@E09000010", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000010", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1720.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8c97523e809bee946ac5f8e6" }, { "name": "ons.rent.private_rent@E09000011", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000011", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1880.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ca80df101f5211ac6f424364" }, { "name": "ons.rent.private_rent@E09000012", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000012", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2550.6666666666665, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8f1e568bbaf555cb40a97b4a" }, { "name": "ons.rent.private_rent@E09000013", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000013", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2733.0833333333335, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9c1d663cf422392effe54bca" }, { "name": "ons.rent.private_rent@E09000014", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000014", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2174.5833333333335, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f5d5f35335f3dc2755e559f3" }, { "name": "ons.rent.private_rent@E09000015", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000015", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1719.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_806c66ff47f0779e0f25f296" }, { "name": "ons.rent.private_rent@E09000016", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000016", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1519.4166666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_cb70efa2581fcdd43aaddefb" }, { "name": "ons.rent.private_rent@E09000017", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000017", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1529.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_69d74ce0b45e4c589ae20b79" }, { "name": "ons.rent.private_rent@E09000018", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000018", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1884.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_08bc190b6486f68ca023ba06" }, { "name": "ons.rent.private_rent@E09000019", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000019", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2701.1666666666665, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7a5689367870f51e54e63cb9" }, { "name": "ons.rent.private_rent@E09000020", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000020", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 3632.6666666666665, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a523725a3702237d48bf40c2" }, { "name": "ons.rent.private_rent@E09000021", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000021", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1793.5833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7642b619c81005cd3f5f6de7" }, { "name": "ons.rent.private_rent@E09000022", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000022", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2417.8333333333335, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ad4a754a4986bfc97ef556a1" }, { "name": "ons.rent.private_rent@E09000023", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000023", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1780.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1a568e90b396a3416b2eeaf6" }, { "name": "ons.rent.private_rent@E09000024", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000024", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2058.3333333333335, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b2df9658bdcc8e5badfb96fb" }, { "name": "ons.rent.private_rent@E09000025", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000025", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1838.0833333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3d4934af5b47cb7a0b7f7739" }, { "name": "ons.rent.private_rent@E09000026", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000026", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1681.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_566e63c6084482ca1e6852d7" }, { "name": "ons.rent.private_rent@E09000027", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000027", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2203.9166666666665, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_665c2a949f19a979f95337e7" }, { "name": "ons.rent.private_rent@E09000028", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000028", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2353.1666666666665, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_211d107b1d00a6bb6c365147" }, { "name": "ons.rent.private_rent@E09000029", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000029", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1518.6666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_30870fa3e73e1fac0b632054" }, { "name": "ons.rent.private_rent@E09000030", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000030", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2365.1666666666665, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_eafa0c64675bd0eba3c48b0e" }, { "name": "ons.rent.private_rent@E09000031", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000031", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1732.25, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ea3c6c976dc19f3ce48b4e15" }, { "name": "ons.rent.private_rent@E09000032", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000032", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 2523.8333333333335, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c7f03bd74056f487282b5ffc" }, { "name": "ons.rent.private_rent@E09000033", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "E09000033", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 3252.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_feaddada827cf46349712f62" }, { "name": "ons.rent.private_rent@N09000001", @@ -380088,7 +382570,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000002", @@ -380100,7 +382582,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000003", @@ -380112,7 +382594,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000004", @@ -380124,7 +382606,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000005", @@ -380136,7 +382618,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000006", @@ -380148,7 +382630,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000007", @@ -380160,7 +382642,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000008", @@ -380172,7 +382654,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000009", @@ -380184,7 +382666,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000010", @@ -380196,7 +382678,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@N09000011", @@ -380208,7 +382690,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_ni_absent", - "signed_rationale": "The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." + "signed_rationale": "The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent." }, { "name": "ons.rent.private_rent@S12000005", @@ -380220,7 +382702,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000006", @@ -380232,7 +382714,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000008", @@ -380244,7 +382726,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000010", @@ -380256,7 +382738,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000011", @@ -380268,7 +382750,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000013", @@ -380280,7 +382762,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000014", @@ -380292,7 +382774,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000017", @@ -380304,7 +382786,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000018", @@ -380316,7 +382798,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000019", @@ -380328,7 +382810,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000020", @@ -380340,7 +382822,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000021", @@ -380352,7 +382834,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000023", @@ -380364,7 +382846,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000026", @@ -380376,7 +382858,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000027", @@ -380388,7 +382870,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000028", @@ -380400,7 +382882,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000029", @@ -380412,7 +382894,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000030", @@ -380424,7 +382906,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000033", @@ -380436,7 +382918,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000034", @@ -380448,7 +382930,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000035", @@ -380460,7 +382942,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000036", @@ -380472,7 +382954,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000038", @@ -380484,7 +382966,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000039", @@ -380496,7 +382978,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000040", @@ -380508,7 +382990,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000041", @@ -380520,7 +383002,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000042", @@ -380532,7 +383014,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000045", @@ -380544,7 +383026,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000047", @@ -380556,7 +383038,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000048", @@ -380568,7 +383050,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000049", @@ -380580,7 +383062,7 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@S12000050", @@ -380592,271 +383074,293 @@ "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", "signed_reason_id": "private_rent_pipr_scotland_brma_grain", - "signed_rationale": "The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." + "signed_rationale": "The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred." }, { "name": "ons.rent.private_rent@W06000001", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 682.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dc7a62369ddede38df4e9b1d" }, { "name": "ons.rent.private_rent@W06000002", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 674.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_11ba0bb33fba6b4a063c7dae" }, { "name": "ons.rent.private_rent@W06000003", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 770.6666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3f567e075db4197f94ba4143" }, { "name": "ons.rent.private_rent@W06000004", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 672.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5302492bf3b89069d0d7cecb" }, { "name": "ons.rent.private_rent@W06000005", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 754.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_86112330c38bdc02705d7f96" }, { "name": "ons.rent.private_rent@W06000006", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 739.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_9cbd083bc4d2e76a32839a9d" }, { "name": "ons.rent.private_rent@W06000008", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 687.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e52de09d439ebcb3a0bf3d64" }, { "name": "ons.rent.private_rent@W06000009", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 659.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ca40d2e1711f0944c672a3e8" }, { "name": "ons.rent.private_rent@W06000010", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 642.5833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c52b22bd901baf0d49a87ba1" }, { "name": "ons.rent.private_rent@W06000011", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 798.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6a1c0bec954a9f643f82d5f6" }, { "name": "ons.rent.private_rent@W06000012", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 634.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_edc8ce50fb3d940d6ac35c7d" }, { "name": "ons.rent.private_rent@W06000013", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 699.4166666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a87cf8ee15311eb525e4e862" }, { "name": "ons.rent.private_rent@W06000014", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 940.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2e112c0f8460bdd922b2c28f" }, { "name": "ons.rent.private_rent@W06000015", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 1124.1666666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_28e4f2f3aac802802e0e7c8d" }, { "name": "ons.rent.private_rent@W06000016", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 726.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1f0d8d88a184fd7cfd47a40b" }, { "name": "ons.rent.private_rent@W06000018", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 693.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7744cf7e6ce6a2a565b4ed8f" }, { "name": "ons.rent.private_rent@W06000019", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 635.0833333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_444428f84430ff131a6f6585" }, { "name": "ons.rent.private_rent@W06000020", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 840.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bf7780ab37a59e925e18759c" }, { "name": "ons.rent.private_rent@W06000021", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 965.1666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2b8116bb08a3d45c5136d8ab" }, { "name": "ons.rent.private_rent@W06000022", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 926.75, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5e52fd6947bbe1d137259434" }, { "name": "ons.rent.private_rent@W06000023", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 572.8333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_be196496709c3f8cbeb55284" }, { "name": "ons.rent.private_rent@W06000024", "target_id": "ons.rent.private_rent", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "no_fact_at_or_before_period", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 0, - "error": "ledger_reference_compile_status_no_fact_at_or_before_period", - "signed_reason_id": "private_rent_pipr_after_target_period", - "signed_rationale": "The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred." + "status": "active", + "matched_fact_count_overall": 42, + "matched_fact_count_at_or_before_period": 36, + "resolved_period": 2025, + "resolved_value": 749.5, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1e0b6ba855ae49031bb692e8" } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json b/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json index b31a0179b..ee618142e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json @@ -398732,6 +398732,7856 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, + { + "name": "ons.rent.private_rent@E06000001", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000001" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000001", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000002", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000002" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000002", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000003", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000003" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000003", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000004", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000004" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000004", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000005", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000005" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000005", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000006", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000006" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000006", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000007", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000007" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000007", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000008", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000008" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000008", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000009", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000009" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000009", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000010", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000010" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000010", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000011", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000011" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000011", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000012", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000012" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000012", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000013", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000013" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000013", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000014", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000014" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000014", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000015", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000015" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000015", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000016", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000016" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000016", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000017", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000017" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000017", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000018", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000018" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000018", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000019", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000019" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000019", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000020", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000020" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000020", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000021", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000021" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000021", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000022", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000022" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000022", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000023", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000023" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000023", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000024", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000024" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000024", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000025", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000025" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000025", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000026", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000026" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000026", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000027", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000027" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000027", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000030", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000030" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000030", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000031", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000031" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000031", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000032", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000032" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000032", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000033", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000033" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000033", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000034", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000034" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000034", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000035", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000035" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000035", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000036", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000036" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000036", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000037", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000037" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000037", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000038", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000038" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000038", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000039", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000039" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000039", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000040", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000040" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000040", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000041", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000041" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000041", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000042", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000042" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000042", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000043", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000043" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000043", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000044", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000044" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000044", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000045", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000045" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000045", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000046", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000046" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000046", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000047", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000047" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000047", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000049", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000049" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000049", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000050", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000050" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000050", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000051", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000051" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000051", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000052", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000052" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000052", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000054", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000054" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000054", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000055", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000055" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000055", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000056", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000056" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000056", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000057", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000057" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000057", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000058", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000058" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000058", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000059", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000059" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000059", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000060", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000060" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000060", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000061", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000061" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000061", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000062", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000062" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000062", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000063", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000063" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000063", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000064", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000064" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000064", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000065", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000065" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000065", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E06000066", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E06000066" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E06000066", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000008", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000008" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000008", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000009", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000009" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000009", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000010", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000010" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000010", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000011", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000011" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000011", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000012", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000012" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000012", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000032", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000032" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000032", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000033", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000033" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000033", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000034", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000034" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000034", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000035", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000035" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000035", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000036", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000036" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000036", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000037", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000037" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000037", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000038", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000038" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000038", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000039", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000039" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000039", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000040", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000040" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000040", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000041", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000041" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000041", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000042", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000042" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000042", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000043", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000043" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000043", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000044", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000044" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000044", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000045", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000045" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000045", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000046", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000046" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000046", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000047", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000047" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000047", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000061", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000061" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000061", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000062", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000062" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000062", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000063", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000063" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000063", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000064", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000064" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000064", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000065", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000065" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000065", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000066", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000066" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000066", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000067", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000067" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000067", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000068", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000068" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000068", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000069", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000069" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000069", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000070", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000070" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000070", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000071", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000071" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000071", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000072", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000072" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000072", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000073", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000073" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000073", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000074", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000074" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000074", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000075", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000075" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000075", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000076", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000076" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000076", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000077", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000077" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000077", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000078", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000078" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000078", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000079", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000079" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000079", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000080", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000080" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000080", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000081", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000081" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000081", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000082", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000082" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000082", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000083", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000083" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000083", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000084", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000084" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000084", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000085", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000085" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000085", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000086", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000086" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000086", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000087", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000087" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000087", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000088", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000088" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000088", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000089", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000089" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000089", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000090", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000090" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000090", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000091", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000091" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000091", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000092", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000092" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000092", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000093", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000093" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000093", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000094", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000094" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000094", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000095", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000095" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000095", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000096", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000096" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000096", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000098", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000098" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000098", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000099", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000099" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000099", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000102", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000102" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000102", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000103", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000103" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000103", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000105", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000105" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000105", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000106", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000106" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000106", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000107", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000107" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000107", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000108", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000108" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000108", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000109", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000109" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000109", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000110", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000110" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000110", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000111", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000111" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000111", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000112", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000112" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000112", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000113", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000113" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000113", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000114", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000114" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000114", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000115", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000115" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000115", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000116", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000116" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000116", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000117", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000117" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000117", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000118", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000118" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000118", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000119", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000119" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000119", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000120", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000120" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000120", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000121", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000121" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000121", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000122", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000122" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000122", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000123", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000123" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000123", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000124", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000124" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000124", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000125", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000125" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000125", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000126", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000126" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000126", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000127", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000127" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000127", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000128", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000128" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000128", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000129", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000129" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000129", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000130", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000130" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000130", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000131", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000131" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000131", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000132", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000132" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000132", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000133", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000133" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000133", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000134", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000134" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000134", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000135", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000135" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000135", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000136", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000136" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000136", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000137", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000137" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000137", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000138", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000138" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000138", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000139", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000139" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000139", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000140", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000140" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000140", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000141", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000141" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000141", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000142", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000142" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000142", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000143", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000143" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000143", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000144", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000144" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000144", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000145", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000145" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000145", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000146", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000146" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000146", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000147", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000147" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000147", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000148", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000148" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000148", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000149", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000149" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000149", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000170", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000170" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000170", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000171", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000171" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000171", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000172", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000172" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000172", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000173", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000173" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000173", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000174", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000174" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000174", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000175", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000175" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000175", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000176", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000176" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000176", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000177", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000177" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000177", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000178", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000178" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000178", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000179", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000179" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000179", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000180", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000180" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000180", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000181", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000181" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000181", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000192", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000192" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000192", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000193", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000193" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000193", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000194", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000194" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000194", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000195", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000195" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000195", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000196", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000196" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000196", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000197", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000197" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000197", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000198", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000198" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000198", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000199", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000199" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000199", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000200", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000200" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000200", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000202", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000202" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000202", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000203", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000203" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000203", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000207", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000207" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000207", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000208", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000208" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000208", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000209", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000209" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000209", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000210", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000210" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000210", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000211", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000211" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000211", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000212", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000212" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000212", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000213", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000213" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000213", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000214", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000214" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000214", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000215", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000215" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000215", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000216", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000216" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000216", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000217", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000217" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000217", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000218", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000218" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000218", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000219", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000219" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000219", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000220", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000220" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000220", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000221", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000221" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000221", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000222", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000222" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000222", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000223", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000223" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000223", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000224", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000224" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000224", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000225", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000225" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000225", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000226", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000226" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000226", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000227", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000227" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000227", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000228", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000228" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000228", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000229", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000229" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000229", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000234", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000234" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000234", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000235", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000235" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000235", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000236", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000236" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000236", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000237", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000237" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000237", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000238", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000238" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000238", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000239", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000239" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000239", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000240", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000240" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000240", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000241", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000241" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000241", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000242", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000242" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000242", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000243", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000243" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000243", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000244", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000244" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000244", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E07000245", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E07000245" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E07000245", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000001", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000001" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000001", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000002", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000002" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000002", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000003", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000003" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000003", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000004", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000004" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000004", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000005", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000005" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000005", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000006", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000006" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000006", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000007", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000007" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000007", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000008", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000008" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000008", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000009", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000009" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000009", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000010", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000010" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000010", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000011", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000011" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000011", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000012", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000012" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000012", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000013", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000013" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000013", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000014", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000014" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000014", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000015", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000015" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000015", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000017", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000017" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000017", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000018", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000018" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000018", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000021", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000021" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000021", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000022", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000022" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000022", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000023", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000023" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000023", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000024", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000024" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000024", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000025", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000025" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000025", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000026", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000026" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000026", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000027", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000027" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000027", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000028", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000028" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000028", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000029", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000029" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000029", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000030", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000030" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000030", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000031", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000031" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000031", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000032", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000032" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000032", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000033", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000033" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000033", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000034", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000034" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000034", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000035", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000035" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000035", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000036", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000036" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000036", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E08000037", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E08000037" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E08000037", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000002", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000002" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000002", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000003", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000003" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000003", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000004", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000004" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000004", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000005", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000005" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000005", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000006", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000006" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000006", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000007", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000007" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000007", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000008", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000008" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000008", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000009", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000009" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000009", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000010", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000010" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000010", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000011", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000011" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000011", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000012", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000012" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000012", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000013", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000013" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000013", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000014", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000014" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000014", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000015", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000015" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000015", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000016", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000016" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000016", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000017", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000017" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000017", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000018", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000018" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000018", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000019", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000019" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000019", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000020", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000020" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000020", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000021", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000021" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000021", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000022", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000022" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000022", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000023", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000023" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000023", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000024", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000024" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000024", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000025", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000025" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000025", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000026", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000026" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000026", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000027", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000027" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000027", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000028", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000028" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000028", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000029", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000029" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000029", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000030", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000030" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000030", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000031", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000031" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000031", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000032", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000032" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000032", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@E09000033", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "E09000033" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "E09000033", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000001", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000001" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000001", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000002", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000002" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000002", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000003", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000003" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000003", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000004", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000004" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000004", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000005", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000005" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000005", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000006", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000006" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000006", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000008", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000008" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000008", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000009", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000009" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000009", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000010", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000010" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000010", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000011", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000011" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000011", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000012", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000012" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000012", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000013", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000013" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000013", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000014", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000014" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000014", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000015", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000015" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000015", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000016", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000016" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000016", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000018", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000018" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000018", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000019", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000019" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000019", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000020", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000020" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000020", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000021", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000021" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000021", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000022", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000022" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000022", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000023", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000023" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000023", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, + { + "name": "ons.rent.private_rent@W06000024", + "ledger_selector": { + "source_name": "ons", + "source_measure_id": "private_rent", + "record_set_spec_id": "uk.local_geography.private_rent.average_by_area.v1", + "geography_level": "local_authority", + "geography_id": "W06000024" + }, + "entity": "benunit", + "measure": "rent/private_rent", + "family": "ons_housing", + "period": 2025, + "metadata": { + "contract_target_id": "ons.rent.private_rent", + "measure_kind": "prepared_column", + "geography_level": "local_authority", + "geography_id": "W06000024", + "fact_aggregation": "time_mean", + "period_basis_note": "Calendar-year average of the available 2025 PIPR monthly area price levels; approved by Mar\u00eda on 2026-09-05." + }, + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", + "uprating_to_period": 2025 + }, { "name": "voa.council_tax_stock.by_area.band_a@E06000001", "ledger_selector": { diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json b/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json index 5b0304fa0..f5518fd77 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_validation_levels.json @@ -4,8 +4,11 @@ "description": "Report-only external levels for post-solve UK local validation. No row is wired into calibration or release scoring in this increment.", "source_feed": { "artifact": ".codex-work/consumer_facts_uk.jsonl", - "sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", - "source_commit": "33ca98a" + "manifest": ".codex-work/consumer_facts_uk_manifest.json", + "sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_repo": "PolicyEngine/chronicle", + "source_commit": "6fb700e" }, "rows": [ { 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 ec507a413..4ea45d035 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 @@ -6,9 +6,8 @@ "active_reference_count": 408, "status_counts": { "active": 408, - "multi_fact": 1, "no_fact_at_or_before_period": 7, - "signed_excluded": 1 + "signed_excluded": 2 }, "geography_pins": { "obr.income_tax": { @@ -1574,12 +1573,12 @@ }, { "name": "hmrc.cgt.taxpayers_total", - "from": "2023", + "from": "2024", "to": "2025" }, { "name": "hmrc.cgt.gains_total", - "from": "2023", + "from": "2024", "to": "2025" }, { @@ -1609,552 +1608,552 @@ }, { "name": "dwp.uc.households_children_1", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_children_2", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_children_3", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_children_4", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_children_5_or_more", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_single_no_children", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_single_with_children", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_couple_no_children", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.households_couple_with_children", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_13_200_to_14_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_14_400_to_15_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_21_600_to_22_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_8_400_to_9_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_9_600_to_10_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_12_000_to_13_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_13_200_to_14_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_14_400_to_15_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_15_600_to_16_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_16_800_to_18_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_18_000_to_19_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_19_200_to_20_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_21_600_to_22_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { "name": "dwp.uc.scotland_households_child_under_1", - "from": "2025-05", + "from": "2025-12", "to": "2025" }, { @@ -4700,12 +4699,12 @@ { "name": "hmrc.cgt.taxpayers_total", "status": "active", - "matched_fact_count_overall": 37, - "matched_fact_count_at_or_before_period": 37, + "matched_fact_count_overall": 38, + "matched_fact_count_at_or_before_period": 38, "resolved_period": 2025, - "resolved_value": 378000.0, - "resolved_fact_period": "2023", - "resolved_fact_key": "ledger_aggregate_fact_v2_78fb64bd2e9774df4b2f2d56" + "resolved_value": 584000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_ec8cf88ffb8304ce72228e8b" } ] }, @@ -4715,12 +4714,12 @@ { "name": "hmrc.cgt.gains_total", "status": "active", - "matched_fact_count_overall": 37, - "matched_fact_count_at_or_before_period": 37, + "matched_fact_count_overall": 38, + "matched_fact_count_at_or_before_period": 38, "resolved_period": 2025, - "resolved_value": 65937000000.0, - "resolved_fact_period": "2023", - "resolved_fact_key": "ledger_aggregate_fact_v2_1b082e386beee3c6900e9dfa" + "resolved_value": 127316000000.0, + "resolved_fact_period": "2024", + "resolved_fact_key": "ledger_aggregate_fact_v2_a9969c2a306f713f6bb203fc" } ] }, @@ -4829,12 +4828,12 @@ { "name": "dwp.uc.households_children_1", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 1269512.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_644c4f00ec93656261edcf42" + "resolved_value": 1278537.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_75d899ad408d26f0c2a0b4b2" } ] }, @@ -4844,12 +4843,12 @@ { "name": "dwp.uc.households_children_2", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 1103880.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_9ab84c46af8587c44e728bf3" + "resolved_value": 1100617.5555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_970b3f74426e7a9ca57d4f3f" } ] }, @@ -4859,12 +4858,12 @@ { "name": "dwp.uc.households_children_3", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 497665.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_6dcdc6d11cf3afee5beeffa6" + "resolved_value": 494553.22222222225, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8d071172a1212492c8895356" } ] }, @@ -4874,12 +4873,12 @@ { "name": "dwp.uc.households_children_4", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 176202.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_615b1a43ca3d51a46d4f46a6" + "resolved_value": 174668.88888888888, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d46a42194825aa8ac424c18d" } ] }, @@ -4889,12 +4888,12 @@ { "name": "dwp.uc.households_children_5_or_more", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 77894.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_d0e380e6527f49dd3585c634" + "resolved_value": 77376.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c672eb5959db157315a3a3e6" } ] }, @@ -4904,12 +4903,12 @@ { "name": "dwp.uc.households_single_no_children", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 3191316.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_459c91f3fc3a98a523da443f" + "resolved_value": 3446962.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8f37a13228973c48fc995636" } ] }, @@ -4919,12 +4918,12 @@ { "name": "dwp.uc.households_single_with_children", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 2213760.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_41f5ed85cf8b0bb1e30ed3c0" + "resolved_value": 2226220.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0e4512db88ae6dfb508d365d" } ] }, @@ -4934,12 +4933,12 @@ { "name": "dwp.uc.households_couple_no_children", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 266160.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_db1b0c763265b66903558f63" + "resolved_value": 284345.55555555556, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5d1c98b108eaac7236138260" } ] }, @@ -4949,12 +4948,12 @@ { "name": "dwp.uc.households_couple_with_children", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 911392.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_d4b90e6010117d5593724efa" + "resolved_value": 899534.6666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_388f703e509e490c85497a81" } ] }, @@ -4964,252 +4963,252 @@ { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 101189.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_7c22cffc1a38778c7c43ed3c" + "resolved_value": 89479.33333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2ab0a2ad4fff5a73eb430af0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 121018.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_d3e756c93a3c0143508d1266" + "resolved_value": 127403.22222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4da96f3f87204e3b63a7197e" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 106102.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_7403d7adc181e8d2f6c832d0" + "resolved_value": 122035.55555555556, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_100f173ee4233f5ed3616bbc" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 182183.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_b7e5703a6a7e90d9384d821e" + "resolved_value": 197163.22222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_263205affbfb94c0a87b7834" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 191730.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_40ccf757e12c655dde7c28a9" + "resolved_value": 209497.33333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f4e51bd6399c4a72f10e625f" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 130302.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_5495d957950548ee5265e578" + "resolved_value": 149963.22222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_746aa1e8d116c4543251b137" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 86110.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_7f32751b273236019d0798b0" + "resolved_value": 108689.66666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0dc82a9ba1ce7a8ea1855991" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 47330.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_52effa75479c574acf4134d9" + "resolved_value": 61718.666666666664, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4399ab26a944d2d46a12311d" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 27065.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_073ef8770019305805c7074e" + "resolved_value": 34050.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b8ab0a63fbef46e02aa34d37" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 18536.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_05d7866882726d294cb2b698" + "resolved_value": 22338.333333333332, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d22d996cd3edb838030ab0dc" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 12726.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_ed6eafde744f64d26d82dbf2" + "resolved_value": 14685.777777777777, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_404ce9f1ea3e17ec602a1de9" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 9793.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_16597c41c14d5cebd04c4378" + "resolved_value": 11133.666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_d2268373d3e5894e10f3f004" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 173855.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_92ccc0cdeecc8d39c5addbbc" + "resolved_value": 197136.66666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_37e9e071fb187dab220f3876" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 6398.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_fd890e1b94309f81f9ec55bb" + "resolved_value": 6951.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8af773c191130cd03d9de884" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 6020.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_afeee8c7da377064d0933593" + "resolved_value": 6508.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f46b09c321cf98f8e0d12b89" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 5488.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_9745e30f3384edf22e35cded" + "resolved_value": 5913.444444444444, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a763ca2d87febd61de26d8b0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 1829.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_9327cf3a591e2df94e342811" + "resolved_value": 1884.111111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8b6d8894debcbda5e38c0923" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 1543.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_029a3e490eb607ddc8e6e0e8" + "resolved_value": 1653.7777777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_aa3077a36f37ae73562e57fc" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 369404.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_014f43c525c174241f9ae3f2" + "resolved_value": 377063.1111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_988e854b9584a36b1b62810f" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 197717.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_6f4d510b41bea88731dbad53" + "resolved_value": 195983.22222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7a3e7c9563c15ba28ffd3c3e" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 106706.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_7b0eac6a3e7fa0fdf30ae20b" + "resolved_value": 114033.33333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_294fdb23cc02a98334267137" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 143277.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_b956dc2e29d5cd357cfb526e" + "resolved_value": 149043.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_5d4a92d292c96a2f440dee5a" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 379652.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_b66198d395778d35ce86a34a" + "resolved_value": 399750.22222222225, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ad92f85c0ac85ea7bb6e8ca3" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 341457.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_3818f2d9e159770543dac328" + "resolved_value": 386411.6666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e2bbf1fe386cfcd8db712026" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 94296.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_1cf99ad91d162c4b4a10ba6d" + "resolved_value": 104891.11111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_de2719af6e4d5f9ffe65aaee" } ] }, @@ -5219,252 +5218,252 @@ { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 24828.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_4273e312b98b380662c03f93" + "resolved_value": 26670.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7b17c88cf49645b2d3ef44a6" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 34587.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_0694e810a066ab1790440425" + "resolved_value": 36208.11111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_765ace417ceafd524ffda4c0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 129699.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_b673f0ea23294b3fa927464d" + "resolved_value": 125798.44444444444, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_eaddee052a3861f259b93272" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 129699.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_960bd045472cf623c35cf664" + "resolved_value": 129133.66666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b8d66013c8a68e423f507be8" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 117812.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_210996567d5bf54f88063c27" + "resolved_value": 115856.66666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1bc84efe74c485d143caab7b" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 128991.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_222b9723363faf4129bbdf63" + "resolved_value": 125660.22222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e26d2d7e425a94fd9fde3d17" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 139675.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_3dd7c7c9e33c076b3d69bc58" + "resolved_value": 135836.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8fa2e062c33297530d458054" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 134650.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_0c94d038c83605df1791d447" + "resolved_value": 135444.88888888888, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_77cb72042ffb9b2b1af769e3" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 106818.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_5a7d3c0f71bf8db13f2a649a" + "resolved_value": 106341.88888888889, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_acb89a96425fd7af119e0c3b" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 86255.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_bea1b398332d1d61c0471393" + "resolved_value": 85490.44444444444, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3aa5825f5e5e8dbc570c0af1" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 80273.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_fd5aac9d266aee092d14bd76" + "resolved_value": 80226.88888888889, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c5a0ee450c3ad7f882dfb167" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 70319.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_44b81b3b7676500a87a60938" + "resolved_value": 71259.55555555556, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_13ffca0d11c038fc7d096ec9" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 43550.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_a316ad8358830ca46c06b8a3" + "resolved_value": 46312.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6619e26753d01d76247e1759" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 50805.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_bd5c3628d5556986948de1a5" + "resolved_value": 51301.666666666664, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_4a935006e5c346bfe0009055" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 43132.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_6a09ee4de44449dfc8c84307" + "resolved_value": 43305.22222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e64560bd9c14d083cd03c985" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 34342.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_44655134e1437b8245aadfd5" + "resolved_value": 34910.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8e16d0c97924701eb074c25d" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 27650.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_06c7d10a8b8ad631c14e5aa2" + "resolved_value": 28513.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_cf9757018b0d313f20342b59" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 22058.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_b138657095f80dfd0a4ba4dc" + "resolved_value": 22593.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6bede883f015e48e86c0a2de" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 55560.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_6d87d6eb32df7d87c29c57f7" + "resolved_value": 60310.11111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b0710535c8b6006db118eb3b" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 68058.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_54b83995b46b86deae16f2a3" + "resolved_value": 67858.66666666667, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b4008c8b22190b4ee185d4f6" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 89174.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_cc4b36a430821375a2ed82e0" + "resolved_value": 89577.44444444444, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_1d1fadffae053bf60d7fcd7e" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 117236.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_cf9c6c694bfbd98b7fb42670" + "resolved_value": 116076.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_fae65610a14d6c22f475d757" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 98877.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_397b502ee3e68b1b94361cd8" + "resolved_value": 97511.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_540c0869e23edc4a402166bf" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 102069.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_28de432bddc47503ed9234dc" + "resolved_value": 102343.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a170bf444a17ae88a80766b0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 125466.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_8a9d5f54da5f13cda4d7c879" + "resolved_value": 123718.11111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b7d0d6add859217e797a66ea" } ] }, @@ -5474,252 +5473,252 @@ { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 7553.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_822a65a1958c79035950ef6d" + "resolved_value": 7506.333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e8af6f4ef9d70ded4a4bf6b5" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 8732.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_8f96da01c8e98a3e520ad3af" + "resolved_value": 8797.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_28514ff922f7b00a4706e74b" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 15096.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_1320bfc5a74354fc0b932e45" + "resolved_value": 16121.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8b8e20276b7af9f670009f64" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 12422.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_266208dfcf14fec7202d3f81" + "resolved_value": 13317.333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_22e83b92481a8b2267a15309" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 17851.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_2ad978ed7754cd1bff3ec521" + "resolved_value": 19657.333333333332, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_42f1cbfe9fee5eb33f69088d" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 14493.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_703d368c208e2bbfdd0ee5f8" + "resolved_value": 16443.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_aed9bf66bdbc046ee991fcf5" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 11914.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_2326bacf548613787d0e5265" + "resolved_value": 13441.111111111111, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7ccb1420b8ca3e26048291b9" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 9478.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_3c8b4dcf3516206f4f91536f" + "resolved_value": 10728.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_a7057ddde3cd2ffaed246687" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 8479.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_64fc1a0b6ffa5d083131e00f" + "resolved_value": 9653.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3e228ab480713f15af6e847c" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 5764.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_61477c25c1bda2189013f5d8" + "resolved_value": 6486.888888888889, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ecfd0dfe25ebc098ade1e902" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 3525.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_1bfbe99d32b115fb101c16f3" + "resolved_value": 3981.8888888888887, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2bbf9ab64d9fde9025452375" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 2356.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_e7b1f279ad3f7193ae68fc74" + "resolved_value": 2761.4444444444443, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_f19a927835e2aa12a94f6279" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 11606.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_d4d9c99c13e5ffddf9807229" + "resolved_value": 12256.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_46ba331006269a96f7aee844" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 1797.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_64cb01bb1cff7752e7ac9fd6" + "resolved_value": 2131.222222222222, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_dd2ddbef54fc0ec48f61d7b0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 1214.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_c3cdf2a650039f3befb16629" + "resolved_value": 1475.3333333333333, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3ea2b4312343be8d41a37265" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 958.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_03928eb7a88eb005e4e749af" + "resolved_value": 1073.7777777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_55cf1a8742443b096e81b33e" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 654.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_4f7d04b28e459dfa105f04a2" + "resolved_value": 746.3333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6cd7a2f97a5e43ba25481719" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 578.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_d6b8079542fdf9ba694c65d4" + "resolved_value": 605.7777777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3f50c2d6d58a3a45681f0c5d" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 10672.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_58fdd30eacb059011b021576" + "resolved_value": 10945.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_0ead4e96f4e609a16cf1e53e" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 12199.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_47d90f6b52d026e685875309" + "resolved_value": 12492.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6823b2987ba44d1b85428d2b" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 12405.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_082b5365b7fdf6c1c7040844" + "resolved_value": 12979.666666666666, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3a3fc258bd18da8c60177380" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 15632.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_065a04ded463b0db36bc03f1" + "resolved_value": 16484.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_b75ef335d484f8dd9ae13a70" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 14298.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_398a20f6c941d7755751b050" + "resolved_value": 15272.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_fcd000da1af753b61c9ac5df" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 17626.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_3d6203f0f1f7d8a09fbbd123" + "resolved_value": 19142.333333333332, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3d38fa50aa9bf0e85549ec9a" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 12318.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_81b85753a70cc5e10a83f605" + "resolved_value": 13313.333333333334, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6697a9dc6c88a1a0b0472a1e" } ] }, @@ -5729,252 +5728,252 @@ { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 18896.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_e61e3d1fb68d75f854dd7925" + "resolved_value": 19073.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_8c1548028e499fa8399d1246" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 22614.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_8d35301acbeaea0ec16d784b" + "resolved_value": 22775.777777777777, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ff2fef9bd96e583203e111d6" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 41349.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_9d5313777ece292ab0076e87" + "resolved_value": 40009.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_fee1fd2227a87871edfe2bfa" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 40850.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_532aa299693f3fa7546b54ca" + "resolved_value": 39972.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3b0427c86dc3df13761ab5b0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 42101.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_1bc71ee7fea828fe2503e115" + "resolved_value": 40518.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_bfd9a57597b46f356ef9cfc9" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 38379.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_5975a3ac278b3656e0f56800" + "resolved_value": 37118.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_328ed88b561971d4ee47d852" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 38725.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_fa8e258f094fc3ec208b2813" + "resolved_value": 37177.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_c50c761ddfaab3cbfba62bfd" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 38124.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_031b8e5a3da66a77e7116170" + "resolved_value": 37164.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_74d32efc9f1984f60cbd9397" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 33871.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_287bb8dc3393d9ebe342c045" + "resolved_value": 33309.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_90b7e15c6554b1c74e7055f3" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 29950.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_9d97c8b17ae6e786901f969a" + "resolved_value": 29102.555555555555, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_96f9b06f2d2afb65af9a224a" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 28186.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_fa0e34a52ba5fb25f60b470c" + "resolved_value": 27534.666666666668, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e65a50de282324e8c188863a" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 25960.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_12f9a2c5aa63563eae9aef60" + "resolved_value": 25584.777777777777, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_16f48d435925ffa44f4d6871" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 26768.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_1df3a18d5e1e627972812530" + "resolved_value": 26502.666666666668, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_93fd0534df01d1dade53397e" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 23231.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_0c182b7ed2813f434c7faf96" + "resolved_value": 22927.777777777777, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_ffb787487a36c86f94d25a25" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 20598.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_89cd3e4f357479a172b9e1a4" + "resolved_value": 20334.666666666668, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_2f4d504be6f184b7834f2687" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 17650.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_1cfec0935e609d67288403ee" + "resolved_value": 17535.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_719022eef2836c069c4b02d0" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 15499.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_14e996afeb0a61b020c8e38a" + "resolved_value": 15399.888888888889, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_3b1d8f6516b32e39ecad3873" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 12912.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_59b6b903ae94ade8466c9f8f" + "resolved_value": 12836.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_115a9ea1e35d76db13756149" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 29288.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_0bedfcd27e528d6ad1ede930" + "resolved_value": 29027.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_255e8c862df5351282c29809" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 33072.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_53248eeb98cd236f5f3474d3" + "resolved_value": 32427.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_32261034f242507c0a7337b3" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 35834.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_e5dd88072bae31da148f1987" + "resolved_value": 34956.88888888889, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_6f40664df124c4dca50524b8" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 38337.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_f9ceb07914176c0c6e3b7306" + "resolved_value": 37410.77777777778, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_27b091b1a00bc33ab68139f8" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 40556.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_f010d0b94b60241806a2ccac" + "resolved_value": 39910.333333333336, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_22b16b470c0b51499fb2f042" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 40399.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_359b4b0c64a9f950a630fd06" + "resolved_value": 39368.0, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_7dbca9e2f8508f1066399b73" }, { "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, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 41858.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_010fe13b9bcf93223a51f16b" + "resolved_value": 40805.444444444445, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_23cf62e7e58211e783c52d2e" } ] }, @@ -5984,12 +5983,12 @@ { "name": "dwp.uc.scotland_households_child_under_1", "status": "active", - "matched_fact_count_overall": 1, - "matched_fact_count_at_or_before_period": 1, + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, "resolved_period": 2025, - "resolved_value": 14412.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_a2cdcfc2cd3c4f56e33bfba2" + "resolved_value": 14333.222222222223, + "resolved_fact_period": "2025-12", + "resolved_fact_key": "ledger_aggregate_fact_v2_e88b27e010e08ac8d36d0d30" } ] }, @@ -6969,14 +6968,14 @@ ] }, "ons.population.scotland_households_3plus_children": { - "status": "multi_fact", + "status": "signed_excluded", "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" + "name": "ons.population.scotland_households_3plus_children", + "status": "signed_excluded", + "matched_fact_count_overall": 552, + "matched_fact_count_at_or_before_period": 552, + "signed_rationale": "Signed out pending a Scotland household-composition fact: the current selector reaches person-level ONS mid-year population age rows, not households with three or more children. microcosm#736 tracks the missing declaration." } ] }, @@ -6991,7 +6990,7 @@ "resolved_period": 2025, "resolved_value": 4316000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c9c67fe2978eaa513a44a926" + "resolved_fact_key": "ledger_aggregate_fact_v2_b2ee6bff131571b7dcd4c33c" } ] }, @@ -7006,7 +7005,7 @@ "resolved_period": 2025, "resolved_value": 4254000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e6c50ddf29ed1ab77864b6a2" + "resolved_fact_key": "ledger_aggregate_fact_v2_4178a72ada0e0b5b53fd62b3" } ] }, @@ -7021,7 +7020,7 @@ "resolved_period": 2025, "resolved_value": 813000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3ec0cf9defbe2ab83ab41571" + "resolved_fact_key": "ledger_aggregate_fact_v2_191e954854307c61fca2d539" } ] }, @@ -7036,7 +7035,7 @@ "resolved_period": 2025, "resolved_value": 8119000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b11f5e90017de17e52604807" + "resolved_fact_key": "ledger_aggregate_fact_v2_861314257d00193080069624" } ] }, @@ -7051,7 +7050,7 @@ "resolved_period": 2025, "resolved_value": 5439000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_12ff8cdd70354a89e79666d2" + "resolved_fact_key": "ledger_aggregate_fact_v2_04ac3660df720d6f8effbdb2" } ] }, @@ -7066,7 +7065,7 @@ "resolved_period": 2025, "resolved_value": 931000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b7f864011603a30bf3d9a36d" + "resolved_fact_key": "ledger_aggregate_fact_v2_3432d322cadb6a40f0c3ebc8" } ] }, @@ -7081,7 +7080,7 @@ "resolved_period": 2025, "resolved_value": 1848000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a14d855449d9c8dc5e885d7e" + "resolved_fact_key": "ledger_aggregate_fact_v2_4d36f952f4dd650bcab7ba7f" } ] }, @@ -7096,7 +7095,7 @@ "resolved_period": 2025, "resolved_value": 1835000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e71a9da14a3e6459fb4280b3" + "resolved_fact_key": "ledger_aggregate_fact_v2_e9746f29548db6f6047842cb" } ] }, @@ -7111,7 +7110,7 @@ "resolved_period": 2025, "resolved_value": 1204000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5dabc71ee334f3c3246258bf" + "resolved_fact_key": "ledger_aggregate_fact_v2_9c7f117f90bc24f073f4e14f" } ] }, @@ -7126,7 +7125,7 @@ "resolved_period": 2025, "resolved_value": 244000.0, "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b4156d9db1a22d31bfaa20ff" + "resolved_fact_key": "ledger_aggregate_fact_v2_a0cd8874e5334242ce7b8ce0" } ] }, @@ -7738,7 +7737,7 @@ "resolved_period": 2025, "resolved_value": 6758888.888888889, "resolved_fact_period": "2025-12", - "resolved_fact_key": "ledger_aggregate_fact_v2_f1f95c868e686f543d161ff0" + "resolved_fact_key": "ledger_aggregate_fact_v2_3270b0f656838ddd01b1ac5f" } ] } @@ -7770,15 +7769,13 @@ "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." + "status": "signed_excluded", + "signed_rationale": "Signed out pending a Scotland household-composition fact: the current selector reaches person-level ONS mid-year population age rows, not households with three or more children. microcosm#736 tracks the missing declaration." } - ] + ], + "multi_fact_rationales": [] } 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 d7cdb07f0..b256be72d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -5,7 +5,8 @@ "identity", "sum", "calendar_year_average", - "latest_plateau" + "latest_plateau", + "count_x_mean" ], "target_references": [ { @@ -3909,6 +3910,7 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.cgt_taxpayers_total", + "groupby_dimension": "hmrc.cgt_table1_line", "geography_level": "country", "geography_id": "K02000001" }, @@ -3920,7 +3922,7 @@ "contract_target_id": "hmrc.cgt.taxpayers_total", "measure_kind": "prepared_column" }, - "uprating_from_period": "2023", + "uprating_from_period": "2024", "uprating_to_period": 2025 }, { @@ -3928,6 +3930,7 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.cgt_gains_total", + "groupby_dimension": "hmrc.cgt_table1_line", "geography_level": "country", "geography_id": "K02000001" }, @@ -3939,7 +3942,7 @@ "contract_target_id": "hmrc.cgt.gains_total", "measure_kind": "prepared_column" }, - "uprating_from_period": "2023", + "uprating_from_period": "2024", "uprating_to_period": 2025 }, { @@ -4052,6 +4055,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 1 }, @@ -4066,7 +4072,8 @@ "contract_target_id": "dwp.uc.households_children_1", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4075,6 +4082,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 2 }, @@ -4089,7 +4099,8 @@ "contract_target_id": "dwp.uc.households_children_2", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4098,6 +4109,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 3 }, @@ -4112,7 +4126,8 @@ "contract_target_id": "dwp.uc.households_children_3", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4121,6 +4136,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 4 }, @@ -4135,7 +4153,8 @@ "contract_target_id": "dwp.uc.households_children_4", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4144,6 +4163,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": "5 or more" }, @@ -4158,7 +4180,8 @@ "contract_target_id": "dwp.uc.households_children_5_or_more", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4167,6 +4190,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Single, no children" }, @@ -4181,7 +4207,8 @@ "contract_target_id": "dwp.uc.households_single_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4190,6 +4217,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Single, with children" }, @@ -4204,7 +4234,8 @@ "contract_target_id": "dwp.uc.households_single_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4213,6 +4244,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Couple, no children" }, @@ -4227,7 +4261,8 @@ "contract_target_id": "dwp.uc.households_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4236,6 +4271,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Couple, with children" }, @@ -4250,7 +4288,8 @@ "contract_target_id": "dwp.uc.households_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4259,6 +4298,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" @@ -4274,7 +4317,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4283,6 +4327,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" @@ -4298,7 +4346,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4307,6 +4356,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" @@ -4322,7 +4375,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4331,6 +4385,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" @@ -4346,7 +4404,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4355,6 +4414,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" @@ -4370,7 +4433,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4379,6 +4443,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" @@ -4394,7 +4462,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4403,6 +4472,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" @@ -4418,7 +4491,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4427,6 +4501,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" @@ -4442,7 +4520,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4451,6 +4530,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" @@ -4466,7 +4549,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4475,6 +4559,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" @@ -4490,7 +4578,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4499,6 +4588,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" @@ -4514,7 +4607,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4523,6 +4617,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" @@ -4538,7 +4636,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4547,6 +4646,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" @@ -4562,7 +4665,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4571,6 +4675,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" @@ -4586,7 +4694,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4595,6 +4704,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" @@ -4610,7 +4723,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4619,6 +4733,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" @@ -4634,7 +4752,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4643,6 +4762,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" @@ -4658,7 +4781,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4667,6 +4791,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" @@ -4682,7 +4810,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4691,6 +4820,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" @@ -4706,7 +4839,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4715,6 +4849,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" @@ -4730,7 +4868,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4739,6 +4878,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" @@ -4754,7 +4897,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4763,6 +4907,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" @@ -4778,7 +4926,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4787,6 +4936,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" @@ -4802,7 +4955,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4811,6 +4965,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" @@ -4826,7 +4984,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4835,6 +4994,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children", "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" @@ -4850,7 +5013,8 @@ "contract_target_id": "dwp.uc.payment_distribution_single", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4859,6 +5023,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" @@ -4874,7 +5042,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4883,6 +5052,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" @@ -4898,7 +5071,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4907,6 +5081,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" @@ -4922,7 +5100,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4931,6 +5110,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" @@ -4946,7 +5129,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4955,6 +5139,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" @@ -4970,7 +5158,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -4979,6 +5168,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" @@ -4994,7 +5187,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5003,6 +5197,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" @@ -5018,7 +5216,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5027,6 +5226,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" @@ -5042,7 +5245,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5051,6 +5255,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" @@ -5066,7 +5274,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5075,6 +5284,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" @@ -5090,7 +5303,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5099,6 +5313,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" @@ -5114,7 +5332,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5123,6 +5342,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" @@ -5138,7 +5361,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5147,6 +5371,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" @@ -5162,7 +5390,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5171,6 +5400,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" @@ -5186,7 +5419,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5195,6 +5429,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" @@ -5210,7 +5448,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5219,6 +5458,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" @@ -5234,7 +5477,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5243,6 +5487,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" @@ -5258,7 +5506,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5267,6 +5516,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" @@ -5282,7 +5535,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5291,6 +5545,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" @@ -5306,7 +5564,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5315,6 +5574,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" @@ -5330,7 +5593,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5339,6 +5603,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" @@ -5354,7 +5622,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5363,6 +5632,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" @@ -5378,7 +5651,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5387,6 +5661,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" @@ -5402,7 +5680,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5411,6 +5690,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" @@ -5426,7 +5709,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5435,6 +5719,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children", "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" @@ -5450,7 +5738,8 @@ "contract_target_id": "dwp.uc.payment_distribution_lone_parent", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5459,6 +5748,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" @@ -5474,7 +5767,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5483,6 +5777,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" @@ -5498,7 +5796,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5507,6 +5806,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" @@ -5522,7 +5825,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5531,6 +5835,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" @@ -5546,7 +5854,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5555,6 +5864,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" @@ -5570,7 +5883,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5579,6 +5893,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" @@ -5594,7 +5912,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5603,6 +5922,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" @@ -5618,7 +5941,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5627,6 +5951,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" @@ -5642,7 +5970,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5651,6 +5980,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" @@ -5666,7 +5999,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5675,6 +6009,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" @@ -5690,7 +6028,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5699,6 +6038,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" @@ -5714,7 +6057,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5723,6 +6067,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" @@ -5738,7 +6086,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5747,6 +6096,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" @@ -5762,7 +6115,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5771,6 +6125,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" @@ -5786,7 +6144,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5795,6 +6154,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" @@ -5810,7 +6173,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5819,6 +6183,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" @@ -5834,7 +6202,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5843,6 +6212,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" @@ -5858,7 +6231,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5867,6 +6241,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" @@ -5882,7 +6260,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5891,6 +6270,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" @@ -5906,7 +6289,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5915,6 +6299,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" @@ -5930,7 +6318,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5939,6 +6328,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" @@ -5954,7 +6347,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5963,6 +6357,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" @@ -5978,7 +6376,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -5987,6 +6386,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" @@ -6002,7 +6405,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6011,6 +6415,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" @@ -6026,7 +6434,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6035,6 +6444,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children", "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" @@ -6050,7 +6463,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_no_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6059,6 +6473,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a30.01 to \u00a3100.00" @@ -6074,7 +6492,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6083,6 +6502,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3100.01 to \u00a3200.00" @@ -6098,7 +6521,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6107,6 +6531,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31000.01 to \u00a31100.00" @@ -6122,7 +6550,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6131,6 +6560,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31100.01 to \u00a31200.00" @@ -6146,7 +6579,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6155,6 +6589,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31200.01 to \u00a31300.00" @@ -6170,7 +6608,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6179,6 +6618,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31300.01 to \u00a31400.00" @@ -6194,7 +6637,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6203,6 +6647,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31400.01 to \u00a31500.00" @@ -6218,7 +6666,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6227,6 +6676,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31500.01 to \u00a31600.00" @@ -6242,7 +6695,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6251,6 +6705,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31600.01 to \u00a31700.00" @@ -6266,7 +6724,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6275,6 +6734,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31700.01 to \u00a31800.00" @@ -6290,7 +6753,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6299,6 +6763,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31800.01 to \u00a31900.00" @@ -6314,7 +6782,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6323,6 +6792,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a31900.01 to \u00a32000.00" @@ -6338,7 +6811,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6347,6 +6821,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3200.01 to \u00a3300.00" @@ -6362,7 +6840,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6371,6 +6850,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a32000.01 to \u00a32100.00" @@ -6386,7 +6869,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6395,6 +6879,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a32100.01 to \u00a32200.00" @@ -6410,7 +6898,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6419,6 +6908,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a32200.01 to \u00a32300.00" @@ -6434,7 +6927,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6443,6 +6937,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a32300.01 to \u00a32400.00" @@ -6458,7 +6956,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6467,6 +6966,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a32400.01 to \u00a32500.00" @@ -6482,7 +6985,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6491,6 +6995,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3300.01 to \u00a3400.00" @@ -6506,7 +7014,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6515,6 +7024,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3400.01 to \u00a3500.00" @@ -6530,7 +7043,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6539,6 +7053,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3500.01 to \u00a3600.00" @@ -6554,7 +7072,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6563,6 +7082,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3600.01 to \u00a3700.00" @@ -6578,7 +7101,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6587,6 +7111,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3700.01 to \u00a3800.00" @@ -6602,7 +7130,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6611,6 +7140,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3800.01 to \u00a3900.00" @@ -6626,7 +7159,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6635,6 +7169,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children", "monthly_award_amount_bands": "\u00a3900.01 to \u00a31000.00" @@ -6650,7 +7188,8 @@ "contract_target_id": "dwp.uc.payment_distribution_couple_with_children", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -6659,13 +7198,16 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_youngest_child_age", + "dimensions": [ + "age_of_youngest_child_bands_and_single_year" + ], "dimension_values": { "age_of_youngest_child_bands_and_single_year": 0 }, "geography_level": "country", "geography_id": "S92000003" }, - "entity": "household", + "entity": "benunit", "measure": "dwp/scotland_uc_households_child_under_1", "family": "dwp_universal_credit", "period": 2025, @@ -6673,7 +7215,8 @@ "contract_target_id": "dwp.uc.scotland_households_child_under_1", "measure_kind": "prepared_column" }, - "uprating_from_period": "2025-05", + "value_operation": "calendar_year_average", + "uprating_from_period": "2025-12", "uprating_to_period": 2025 }, { @@ -9772,6 +10315,8 @@ "ledger_selector": { "source_name": "dwp", "source_concept": "dwp.uc_benefit_units", + "source_measure_id": "total_units", + "groupby_dimension": "dwp.uc_deductions_month", "geography_level": "country", "geography_id": "K03000001" }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json b/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json index 82ca13545..5e7b238ec 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_local_target_census.json @@ -524,9 +524,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "Unbanded area statistics in the pinned Ledger fact feed supply the local HMRC count targets directly and the amount targets via the signed count_x_mean construction. The feed publishes SPI target count/mean measures for 650/650 constituencies except self_employment_income_mean at E14001416 (so that one amount row is signed deferred), and for 359/361 crosswalk local authorities; E06000027 has only median SPI measures and E06000053 has no SPI local-authority target-measure rows. This remains a different surface from the 208 banded Total Income facts held fenced by the national adjudication.", @@ -545,9 +546,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries the PCON24 constituency population age specs for all 650 constituencies across the ONS, NRS, and NISRA publisher legs. Mid-year estimates cover the total usual-resident population \u2014 see the population_universe_private_households adjudication.", @@ -566,9 +568,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries local-authority population age specs for all 361 crosswalk local authorities. Covers the total usual-resident population \u2014 see the population_universe_private_households adjudication.", @@ -630,9 +633,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries DWP Stat-Xplore UC household facts for 632/650 constituencies and 350/361 local authorities, plus the four constituency child-bucket specs. DWP UC official statistics in this feed cover Great Britain; the 18 Northern Ireland constituencies and 11 Northern Ireland local authorities are signed deferred. DWP counts UC claim households \u2014 see the uc_unit_vs_household_grain adjudication.", @@ -651,9 +655,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "Model-based estimates built from the Family Resources Survey \u2014 see the frs_model_based_target_circularity adjudication. The BHC and AHC measures are independently modelled and not directly comparable \u2014 see the ons_bhc_ahc_noncomparable adjudication. MSOA-to-local-authority aggregation is signed deferred for this run; England and Wales only.", @@ -675,9 +680,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned Ledger fact feed carries tenure specs for all 361 crosswalk local authorities across ONS Census 2021, NRS Census 2022, and NISRA Census 2021 publisher legs. Private-rent and social-rent tenure rows are additive over publisher-native subclasses and compile through the signed sum operation.", @@ -696,9 +702,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "PIPR publishes average rent price levels, not additive rent totals. All 361 local-authority cells remain signed deferred for the 2025 compile: 314 are after-period, four English cells have no matching LA id, 32 Scottish cells are represented only at BRMA grain without a signed translation, and 11 Northern Ireland cells are absent.", @@ -719,9 +726,10 @@ "ledger_fact_pin": { "artifact": ".codex-work/consumer_facts_uk.jsonl", "build": "build-bundle --suite uk -> build-consumer-artifact", - "facts_sha256": "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48", + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", "manifest": ".codex-work/consumer_facts_uk_manifest.json", - "source_commit": "33ca98a", + "manifest_sha256": "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0", + "source_commit": "6fb700e", "source_repo": "PolicyEngine/chronicle" }, "notes": "The pinned feed record-set spec uk.local_geography.council_tax_stock.by_local_authority.v1 supplies 2,541 active band cells: bands B-G cover all 318 England/Wales crosswalk authorities, band A covers 317 because E09000001 is suppressed, and band H covers 316 because W06000019 and W06000024 are absent. Scotland's 32 authorities have no VOA band-count rows and Northern Ireland's 11 LGDs use domestic rates; all 347 absent cells are signed deferrals. The feed has no comparable 2025 LA net series across the roster, so council_tax/net is not declared.", diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 1a17ff7e4..90c9739c9 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -3080,7 +3080,8 @@ }, "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_taxpayers_total" + "source_concept": "hmrc.cgt_taxpayers_total", + "groupby_dimension": "hmrc.cgt_table1_line" } }, { @@ -3121,7 +3122,8 @@ }, "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_gains_total" + "source_concept": "hmrc.cgt_gains_total", + "groupby_dimension": "hmrc.cgt_table1_line" } }, { @@ -3464,6 +3466,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 1 } @@ -3520,6 +3525,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 2 } @@ -3576,6 +3584,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 3 } @@ -3632,6 +3643,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": 4 } @@ -3688,6 +3702,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_number_of_children", + "dimensions": [ + "number_of_children" + ], "dimension_values": { "number_of_children": "5 or more" } @@ -3739,6 +3756,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Single, no children" } @@ -3790,6 +3810,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Single, with children" } @@ -3841,6 +3864,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Couple, no children" } @@ -3892,6 +3918,9 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_family_type", + "dimensions": [ + "family_type" + ], "dimension_values": { "family_type": "Couple, with children" } @@ -3943,6 +3972,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, no children" } @@ -3994,6 +4027,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Single, with children" } @@ -4045,6 +4082,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, no children" } @@ -4096,6 +4137,10 @@ "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_monthly_award_band", + "dimensions": [ + "family_type", + "monthly_award_amount_bands" + ], "dimension_values": { "family_type": "Couple, with children" } @@ -4108,8 +4153,8 @@ "country" ], "measurement": { - "entity": "household", - "concept": "uk.household.count", + "entity": "benunit", + "concept": "uk.benefit_unit.count", "filters": [ { "concept": "uk.geography.region", @@ -4130,8 +4175,9 @@ "bindings": { "policyengine": { "metric_name": "dwp/scotland_uc_households_child_under_1", - "reduce": "any", - "household_conditions": [ + "value_variable": "benunit_count", + "from_entity": "benunit", + "filters": [ { "variable": "region", "operator": "==", @@ -4139,32 +4185,30 @@ }, { "variable": "universal_credit", - "entity": "benunit", - "reduce": "any", "operator": ">", "value": 0 }, { - "variable": "age", - "entity": "person", - "reduce": "any_child_under", + "variable": "youngest_child_age", "operator": "<", "value": 1 } ], - "value_variable": "household_count", - "notes": "Scottish UC households with a child under 1 (compute/benefits.py:24-30)." + "notes": "Prepared benefit-unit count for Scottish UC units whose youngest child is under 1. The Chronicle monthly series is averaged over April-December 2025, matching the rest of the DWP Universal Credit family." }, "axiom": { "metric_name": "dwp/scotland_uc_households_child_under_1", "status": "pending", - "value_rule": "uk.household.count" + "value_rule": "uk.benefit_unit.count" } }, "ledger_selector": { "source_name": "dwp", "source_concept": "dwp.uc_households", "groupby_dimension": "dwp.uc_youngest_child_age", + "dimensions": [ + "age_of_youngest_child_bands_and_single_year" + ], "dimension_values": { "age_of_youngest_child_bands_and_single_year": 0 } @@ -10618,7 +10662,7 @@ "value": 0 } ], - "notes": "Prepared benefit-unit indicator for receipt of Universal Credit; DWP household means the UC unit of assessment, not an ONS household." + "notes": "Prepared benefit-unit indicator for receipt of Universal Credit; DWP household means the UC unit of assessment, not an ONS household. This row binds DWP UC deductions statistics Table 1 total units. Its April-December 2025 calendar-year average is 6,758,889, 1.45% below the Stat-Xplore family-type sum of 6,858,287; chronicle#247 tracks a common-cube total." }, "axiom": { "metric_name": "dwp/uc/households", @@ -10628,7 +10672,9 @@ }, "ledger_selector": { "source_name": "dwp", - "source_concept": "dwp.uc_benefit_units" + "source_concept": "dwp.uc_benefit_units", + "source_measure_id": "total_units", + "groupby_dimension": "dwp.uc_deductions_month" } }, { diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_target_census.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_target_census.py index 32e6ddd6d..5923b14d4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_target_census.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_target_census.py @@ -83,10 +83,13 @@ "artifact": ".codex-work/consumer_facts_uk.jsonl", "manifest": ".codex-work/consumer_facts_uk_manifest.json", "facts_sha256": ( - "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48" + "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f" + ), + "manifest_sha256": ( + "dcda51d6496aea67f768a284e7955c7520e7c8b91e2bed3569f247567b7153f0" ), "source_repo": "PolicyEngine/chronicle", - "source_commit": "33ca98a", + "source_commit": "6fb700e", "build": "build-bundle --suite uk -> build-consumer-artifact", } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_validation_levels.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_validation_levels.py index 1e8fbd7ef..93d6b9de1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_validation_levels.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_validation_levels.py @@ -30,7 +30,7 @@ def _validate(payload: Any) -> None: raise ValueError("UK local validation-level register_kind is invalid.") feed = payload.get("source_feed") if not isinstance(feed, dict) or feed.get("sha256") != ( - "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48" + "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f" ): raise ValueError("UK local validation-level feed pin is missing or stale.") rows = payload.get("rows") 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 54781fa5c..da610a263 100644 --- a/packages/microcosm-build/tests/fixtures/uk_target_reference_feed_rows.jsonl +++ b/packages/microcosm-build/tests/fixtures/uk_target_reference_feed_rows.jsonl @@ -7,3 +7,16 @@ {"aggregate_fact_key": "ledger.aggregate_fact.v2:882329821c90dc683aa778d8", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "slc", "canonical_concept": "slc.student_loan_net_repayments_plan_2_full_time", "concept_alignment_key": "ledger.concept_alignment.v2:5a6738918c70cab40798a5ed", "evidence_notes": "Student loans in England FY2024-25 (corrected tables, slcsp012025_Corrected), Table 1A ICR balance sheet, row 'Net repayments posted during the financial year', financial year 2024-25 column block, column: Plan 2 Full-time. GBP million.", "evidence_url": "https://www.gov.uk/government/statistics/student-loans-in-england-2024-to-2025", "relation": "source_label", "source_concept": "slc.student_loan_net_repayments_plan_2_full_time"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "student_loan_borrower"}, "geography": {"id": "E92000001", "level": "country", "vintage": "current"}, "label": "England 2024 fiscal year sum slc student loan net repayments plan 2 full time for person [slc Student loans in England, financial year 2024-25 (corrected tables), Table 1A slcsp012025_Corrected.xlsx slcsp01_2025_corrected]", "layout": {"groupby_dimension": "slc.repayment_plan", "groupby_ordinal": 0, "groupby_value_id": "net_repayments", "groupby_value_label": "Net repayments posted during the financial year", "measure_id": "plan_2_full_time", "measure_label": "Net repayments FY2024-25, Plan 2 Full-time", "measure_ordinal": 1, "record_set_id": "slc.repayments_2025.table_1a.fy2024", "record_set_spec_hash": "b748f6aeb2b7ad68bfb560a9", "record_set_spec_id": "slc.repayments_2025.table_1a.fy2024.v1", "source_column_id": "plan_2_full_time", "source_row_id": "net_repayments", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:a959c4f2a5576cd283af852a", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:0f682109e58dfad1ad28acd6", "ledger.source_cell.v1:60e6539baafd94e56648671a", "ledger.source_cell.v1:446cc4b0c7a9f20af575ec37", "ledger.source_cell.v1:b3d5f4758ba698ba4a4578d4"], "source_record_id": "slc.repayments_2025.table_1a.fy2024.net_repayments.plan_2_full_time", "source_row_keys": []}, "observed_measure": {"source_concept": "slc.student_loan_net_repayments_plan_2_full_time", "source_measure_id": "plan_2_full_time", "source_name": "slc", "source_table": "Student loans in England, financial year 2024-25 (corrected tables), Table 1A", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:ea46f749cb24645a1742ac79", "period": {"type": "fiscal_year", "value": 2024}, "provenance_class": "administrative", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:61a154dcb37f426f85982478", "source": {"extracted_at": "2026-08-08", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/slc/slc-student-loan-repayments-england-2025/2025/a9ee065ba2d6af4be8584022ac50302f22f7229919e4171cf132039b0ca26aac/slcsp012025_Corrected.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/slc/slc-student-loan-repayments-england-2025/2025/a9ee065ba2d6af4be8584022ac50302f22f7229919e4171cf132039b0ca26aac/slcsp012025_Corrected.xlsx", "source_file": "slcsp012025_Corrected.xlsx", "source_name": "slc", "source_sha256": "a9ee065ba2d6af4be8584022ac50302f22f7229919e4171cf132039b0ca26aac", "source_size_bytes": 332185, "source_table": "Student loans in England, financial year 2024-25 (corrected tables), Table 1A", "url": "https://assets.publishing.service.gov.uk/media/6943ee619273c48f554cf5c5/slcsp012025_Corrected.xlsx", "vintage": "slcsp01_2025_corrected"}, "source_release_key": "ledger.source_release.v2:91e47f96684950159cb0210d", "source_series_key": "ledger.source_series.v2:513fa8b0e1881aafe14a47bf", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:02442c1ef61cbc68cc27ca5c", "universe_constraints": {"domain": "student_loans"}, "value": 2683104312.0299997, "value_type": "number"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:a82c84f67b40867564d2c847", "aggregation": {"method": "sum"}, "assertion": "observation", "concept_alignment": {"authority": "hmrc", "canonical_concept": "hmrc.spi_employment_income_amount", "concept_alignment_key": "ledger.concept_alignment.v2:954e6c895535b23e4c7805cb", "evidence_notes": "SPI collated tables 2023-24, Table_3_6, column: Employment income (Amount); taxpayers in thousands, amounts GBP million.", "evidence_url": "https://www.gov.uk/government/statistics/personal-incomes-statistics-for-the-tax-year-2023-to-2024", "relation": "source_label", "source_concept": "hmrc.spi_employment_income_amount"}, "dimension_set_key": "ledger.dimension_set.v2:2abee80869ae40d61ee490c3", "dimensions": {"total_income_lower_bound": 12570}, "entity": {"name": "person", "role": "taxpayer"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2023 tax year sum hmrc spi employment income amount for person (total income lower bound=12570) [hmrc SPI collated Tables 3.1 to 3.11, tax year 2023-24: income by range of total income Collated_Tables_3_1_to_3_11_2324.ods spi_2023_24]", "layout": {"groupby_dimension": "hmrc.total_income_band", "groupby_ordinal": 0, "groupby_value_id": "band_12570", "groupby_value_label": "Total income from GBP 12 570", "measure_id": "employment_amount", "measure_label": "Employment (amount)", "measure_ordinal": 3, "record_set_id": "hmrc.spi_2324.table_3_6", "record_set_spec_hash": "5d819678ed0074660bcee770", "record_set_spec_id": "hmrc.spi_2324.table_3_6.v1", "source_column_id": "employment_amount", "source_row_id": "band_12570", "table_record_kind": "detail"}, "legacy_fact_key": "ledger.fact.v1:18e235114b5444256783fd7a", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:cfbcf3282db1fcb71a277b00", "ledger.source_cell.v1:057369c1997d122b69f47027"], "source_record_id": "hmrc.spi_2324.table_3_6.band_12570.employment_amount", "source_row_keys": []}, "observed_measure": {"source_concept": "hmrc.spi_employment_income_amount", "source_measure_id": "employment_amount", "source_name": "hmrc", "source_table": "SPI collated Tables 3.1 to 3.11, tax year 2023-24: income by range of total income", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:631d0596c3c14bb4621a9da2", "period": {"type": "tax_year", "value": 2023}, "provenance_class": "survey_aggregate", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:debc6506b4121d8c968f8b4b", "source": {"extracted_at": "2026-08-06", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/hmrc/hmrc-spi-income-bands-2023-24/2024/ad063b06b2bdeef8600dbbb09d48153337a4966f8c7eea50df7a2e0304ebd73e/Collated_Tables_3_1_to_3_11_2324.ods", "raw_r2_uri": "r2://ledger-raw/raw/hmrc/hmrc-spi-income-bands-2023-24/2024/ad063b06b2bdeef8600dbbb09d48153337a4966f8c7eea50df7a2e0304ebd73e/Collated_Tables_3_1_to_3_11_2324.ods", "source_file": "Collated_Tables_3_1_to_3_11_2324.ods", "source_name": "hmrc", "source_sha256": "ad063b06b2bdeef8600dbbb09d48153337a4966f8c7eea50df7a2e0304ebd73e", "source_size_bytes": 166693, "source_table": "SPI collated Tables 3.1 to 3.11, tax year 2023-24: income by range of total income", "url": "https://assets.publishing.service.gov.uk/media/69f1f12d2fae53a03709682f/Collated_Tables_3_1_to_3_11_2324.ods", "vintage": "spi_2023_24"}, "source_release_key": "ledger.source_release.v2:cf26a12e28615db0aa77c564", "source_series_key": "ledger.source_series.v2:90b4b7a93b4bedd73c4fd852", "survey_instrument": "Survey of Personal Incomes", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:1b19141149ccab3a1cc4207e", "universe_constraints": {"constraints": [{"operator": "==", "role": "filter", "value": 12570, "variable": "total_income_lower_bound"}], "domain": "personal_incomes"}, "value": 16900000000, "value_type": "integer"} {"aggregate_fact_key": "ledger.aggregate_fact.v2:d928e7da0fbfe088ca1a30d7", "aggregation": {"method": "sum"}, "assertion": "source_projection", "concept_alignment": {"authority": "obr", "canonical_concept": "obr.income_tax", "concept_alignment_key": "ledger.concept_alignment.v2:c6c41e9a05252a482bf75215", "evidence_notes": "OBR EFO March 2026 detailed forecast tables, sheet 3.4, row 6 ('Income tax (gross of tax credits)'), GBP billion.", "evidence_url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", "relation": "source_label", "source_concept": "obr.income_tax"}, "dimension_set_key": "ledger.dimension_set.v2:44136fa355b3678a1146ad16", "dimensions": {}, "entity": {"name": "person", "role": "resident_population"}, "geography": {"id": "K02000001", "level": "country", "vintage": "current"}, "label": "United Kingdom 2025 fiscal year projected sum obr income tax for person [obr EFO March 2026 detailed forecast tables: receipts efo_receipts.xlsx efo_march_2026]", "layout": {"groupby_dimension": "obr.efo_line", "groupby_ordinal": 0, "groupby_value_id": "income_tax", "groupby_value_label": "Income tax (gross of tax credits)", "measure_id": "amount", "measure_label": "Income tax (gross of tax credits), FY2025-26", "measure_ordinal": 0, "record_set_id": "obr.efo_2026_03.receipts.income_tax.fy2025", "record_set_spec_hash": "e2d3c601ace5447a5fe449bc", "record_set_spec_id": "obr.efo_2026_03.receipts.income_tax.fy2025.v1", "source_column_id": "amount", "source_row_id": "income_tax", "table_record_kind": "total"}, "legacy_fact_key": "ledger.fact.v1:ac779b21d033c2c724a112ca", "lineage": {"source_cell_keys": ["ledger.source_cell.v1:916eb6e55cfdecb1aaae6b03", "ledger.source_cell.v1:487ced430603f1287c1595a1"], "source_record_id": "obr.efo_2026_03.receipts.income_tax.fy2025.income_tax.amount", "source_row_keys": []}, "observed_measure": {"source_concept": "obr.income_tax", "source_measure_id": "amount", "source_name": "obr", "source_table": "EFO March 2026 detailed forecast tables: receipts", "unit": "gbp"}, "observed_measure_key": "ledger.observed_measure.v2:954247698e8178993728e76b", "period": {"type": "fiscal_year", "value": 2025}, "provenance_class": "model_output", "schema_version": "ledger.consumer_fact.v1", "semantic_fact_key": "ledger.semantic_fact.v2:1cda5b118cdb34e16de09a41", "source": {"extracted_at": "2026-08-06", "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", "raw_r2_bucket": "ledger-raw", "raw_r2_key": "raw/obr/obr-efo-receipts-march-2026/2026/f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28/efo_receipts.xlsx", "raw_r2_uri": "r2://ledger-raw/raw/obr/obr-efo-receipts-march-2026/2026/f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28/efo_receipts.xlsx", "source_file": "efo_receipts.xlsx", "source_name": "obr", "source_sha256": "f65b6cb7f96931d4abd85940794eb60f6f65afca8bbf16c74a4548bf92766a28", "source_size_bytes": 187899, "source_table": "EFO March 2026 detailed forecast tables: receipts", "url": "https://obr.uk/download/march-2026-economic-and-fiscal-outlook-detailed-forecast-tables-receipts/", "vintage": "efo_march_2026"}, "source_release_key": "ledger.source_release.v2:cd7332ed9168974f4875f7c7", "source_series_key": "ledger.source_series.v2:dae31655351be8d2e0736a5d", "universe_constraint_set_key": "ledger.universe_constraint_set.v2:ecb00e907376ba856934e4ad", "universe_constraints": {"domain": "public_sector_finances"}, "value": 331437583074.4429, "value_type": "number"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:a328029c7fdf199c7bb8ed72","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-04 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"April 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_04.total_units","record_set_spec_hash":"4b5a84f57f36e8654216696a","record_set_spec_id":"dwp.uc_deductions.month2025_04.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:460f79382edab88773973ef5","lineage":{"source_cell_keys":["ledger.source_cell.v1:dd1d91de62f0f227a5d2158c","ledger.source_cell.v1:43004e85396ce7be9004f6d1"],"source_record_id":"dwp.uc_deductions.month2025_04.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-04"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:e4d7cc18902f0908808e62ec","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:90803eebc1970c036317afd2","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6380000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:8166527e94709e1cf6f05d83","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-05 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"May 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_05.total_units","record_set_spec_hash":"0c949577abc5d27616f8349d","record_set_spec_id":"dwp.uc_deductions.month2025_05.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:9e623691a35d8e3b1bde5368","lineage":{"source_cell_keys":["ledger.source_cell.v1:7e171e5eb2301b4bb9fc3d1b","ledger.source_cell.v1:b181dacd39f539b014c2b1ff"],"source_record_id":"dwp.uc_deductions.month2025_05.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-05"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:8fd726b2e9e0a4f811e835e7","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:2b33c933b0135dfa7ed509e4","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:a90579c0ebd5dbf68afff710","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-06 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"June 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_06.total_units","record_set_spec_hash":"28c08eaae7fbb7ad17c1ac13","record_set_spec_id":"dwp.uc_deductions.month2025_06.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:422b2ea82994dae684f67b76","lineage":{"source_cell_keys":["ledger.source_cell.v1:187cc3e9db9f8b0be51eaf51","ledger.source_cell.v1:cfed2d23ccf618b5ab6aebe6"],"source_record_id":"dwp.uc_deductions.month2025_06.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-06"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:1c029a40f45e74ca403873b5","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:ae7cf0037f9e218e85e35c73","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:d941d4d411e201f422109b86","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-07 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"July 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_07.total_units","record_set_spec_hash":"340bf32fe9ab41eb16239dd6","record_set_spec_id":"dwp.uc_deductions.month2025_07.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:e487647ff402c5001b8073dc","lineage":{"source_cell_keys":["ledger.source_cell.v1:89a075156cfc8d032f47b86b","ledger.source_cell.v1:e550caea5042fa74aa2dec68"],"source_record_id":"dwp.uc_deductions.month2025_07.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-07"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:4c90cf3499b64cce5b22397d","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:91c69f13e601d44a6d06f319","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:ade75a0fb6b3ed6458572b31","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-08 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"August 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_08.total_units","record_set_spec_hash":"b9e0181d5c9445df25901f77","record_set_spec_id":"dwp.uc_deductions.month2025_08.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:963853d12edc803f7a330997","lineage":{"source_cell_keys":["ledger.source_cell.v1:f5ee3feedf046059caacb746","ledger.source_cell.v1:56677aaa6b0d4dfe8b94edf4"],"source_record_id":"dwp.uc_deductions.month2025_08.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-08"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:52bab6c2d4d29a967fd77aa1","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:12208a0616c70228706137fb","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6600000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:a9c3416e28feeef8e244bb05","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-09 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"September 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_09.total_units","record_set_spec_hash":"c0ed641837240192393c72fc","record_set_spec_id":"dwp.uc_deductions.month2025_09.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:0179c54da44d6faf702d48c6","lineage":{"source_cell_keys":["ledger.source_cell.v1:eb5385892a237a0f74d03fbd","ledger.source_cell.v1:29737e7d00ba6bee57052178"],"source_record_id":"dwp.uc_deductions.month2025_09.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-09"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:c0186e43ac2877c66fb53791","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:59c6763a019f8187de881a1f","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6960000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:e903b85f11e958e665e109ce","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-10 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"October 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_10.total_units","record_set_spec_hash":"e363a40ffe8ba5be1d5d1374","record_set_spec_id":"dwp.uc_deductions.month2025_10.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:08fa70b4c9a1e3c9786f3a07","lineage":{"source_cell_keys":["ledger.source_cell.v1:eb41b6281a4c461864a78e92","ledger.source_cell.v1:e24183b55c7b9706b6845c3f"],"source_record_id":"dwp.uc_deductions.month2025_10.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-10"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:7a65f23de0b76a649e66f052","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:368a9e8dbf1a2f98d4553d7a","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6960000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:3f7a2cac5cb15ff130737128","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-11 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"November 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_11.total_units","record_set_spec_hash":"4aad47485f95ab3d7d4d1c7b","record_set_spec_id":"dwp.uc_deductions.month2025_11.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:626e91b656d1641442c0f52b","lineage":{"source_cell_keys":["ledger.source_cell.v1:4c67a56211c72ee9c72e24b1","ledger.source_cell.v1:9d66ea77298496b49d57e5eb"],"source_record_id":"dwp.uc_deductions.month2025_11.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-11"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:95d829a31671e6c36f7dea1c","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:c56f7dc6f3c50e99ab7f9bef","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":6960000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:3270b0f656838ddd01b1ac5f","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:f926aa77f065d747d171dac7","evidence_notes":"Derived within Table 1 as households with a deduction divided by the published share, rounded to 10,000. DWP household means a UC benefit unit, not an ONS household; see policyengine-uk-data#457.","evidence_url":"https://www.gov.uk/government/statistics/universal-credit-quarterly-statistics-29-april-2013-to-12-february-2026/universal-credit-deductions-statistics-march-2025-to-february-2026","relation":"source_label","source_concept":"dwp.uc_benefit_units"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit [dwp Universal Credit deductions statistics March 2025 to February 2026, Table 1 universal-credit-deductions-march-2025-to-february-2026.ods uc_deductions_2026_05_12]","layout":{"groupby_dimension":"dwp.uc_deductions_month","groupby_ordinal":0,"groupby_value_id":"month","groupby_value_label":"December 2025","measure_id":"total_units","measure_label":"Total UC benefit units","measure_ordinal":0,"record_set_id":"dwp.uc_deductions.month2025_12.total_units","record_set_spec_hash":"16402b5f5a5582752fcbed2f","record_set_spec_id":"dwp.uc_deductions.month2025_12.total_units.v1","source_column_id":"total_units","source_row_id":"month","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:50f5e4ff94e17c8653a224d6","lineage":{"source_cell_keys":["ledger.source_cell.v1:f8d9331a5f2fdc078091e6d3","ledger.source_cell.v1:4e93cb84089e9349b2920ecb"],"source_record_id":"dwp.uc_deductions.month2025_12.total_units.month.total_units","source_row_keys":[]},"observed_measure":{"source_concept":"dwp.uc_benefit_units","source_measure_id":"total_units","source_name":"dwp","source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:33357036d21a31ac02d72984","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:64e68c0ee81b5671623a62da","source":{"extracted_at":"2026-08-19","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-deductions-march-2025-february-2026/2026/307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b/universal-credit-deductions-march-2025-to-february-2026.ods","source_file":"universal-credit-deductions-march-2025-to-february-2026.ods","source_name":"dwp","source_sha256":"307ec8fa49a1f1e23db3c59f1282e16609de03444e501824e204b4151e2e5c9b","source_size_bytes":148671,"source_table":"Universal Credit deductions statistics March 2025 to February 2026, Table 1","url":"https://assets.publishing.service.gov.uk/media/69fb3ea22a6137e93226b7ce/universal-credit-deductions-march-2025-to-february-2026.ods","vintage":"uc_deductions_2026_05_12"},"source_release_key":"ledger.source_release.v2:fbd0f132a18af51870b6097e","source_series_key":"ledger.source_series.v2:f6a6850862a484d6deda79cf","universe_constraint_set_key":"ledger.universe_constraint_set.v2:5de55a05f928b463a7699aa4","universe_constraints":{"domain":"universal_credit"},"value":7170000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:867e898d362e2ee81b1cc0e9","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:09dda486cf7db778ead24cee","evidence_notes":"Stat-Xplore 'Households on Universal Credit' dataset, April to December 2025, Great Britain, dimensioned by Family Type x Child Entitlement (Yes/No child element in the award); query echoed in the archived API response. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.","evidence_url":"https://stat-xplore.dwp.gov.uk/","relation":"source_label","source_concept":"dwp.uc_households"},"dimension_set_key":"ledger.dimension_set.v2:ae9c0d568952f7be7b3de1f9","dimensions":{"child_entitlement":"No","family_type":"Single, no children"},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=No, family type=Single, no children) [dwp Households on Universal Credit by family type and child entitlement, April to December 2025 uc_households_by_family_type_and_child_entitlement_april_december_2025.json stat_xplore_2026_09_03]","layout":{"groupby_dimension":"dwp.uc_family_type","groupby_ordinal":0,"groupby_value_id":"single_no_children__child_entitlement_no","groupby_value_label":"Single, no children, No","measure_id":"benefit_units","measure_label":"Universal Credit benefit units","measure_ordinal":0,"record_set_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12","record_set_spec_hash":"dab983bf1f93719dc9bae15f","record_set_spec_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.v1","source_column_id":"value","source_row_id":"single_no_children__child_entitlement_no","table_record_kind":"detail"},"legacy_fact_key":"ledger.fact.v1:fab9f35da80a56fdda84f8e6","lineage":{"source_cell_keys":["ledger.source_cell.v1:10a71527160c9d4a18317afe","ledger.source_cell.v1:0c41fe6b0bac0d72d333912b","ledger.source_cell.v1:824115f66eda83ea3c5ab675","ledger.source_cell.v1:00831bec4108708177b8fcc7"],"source_record_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.single_no_children__child_entitlement_no.benefit_units","source_row_keys":["ledger.source_row.v1:92309fe1032298725d412418"]},"observed_measure":{"source_concept":"dwp.uc_households","source_measure_id":"benefit_units","source_name":"dwp","source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:6558eead1d59f9127b44b69c","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:a770bf82683e66343b177403","source":{"extracted_at":"2026-09-03","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","raw_r2_uri":"r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_file":"uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_name":"dwp","source_sha256":"e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57","source_size_bytes":7982,"source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","url":"https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table","vintage":"stat_xplore_2026_09_03"},"source_release_key":"ledger.source_release.v2:53a9199f091f47dccea365ad","source_series_key":"ledger.source_series.v2:3dc492a8c67367b1a504f325","universe_constraint_set_key":"ledger.universe_constraint_set.v2:8d094e2ba14699028215a5f8","universe_constraints":{"constraints":[{"operator":"==","role":"filter","value":"No","variable":"child_entitlement"},{"operator":"==","role":"filter","value":"Single, no children","variable":"family_type"}],"domain":"universal_credit"},"value":3725304,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:85f76449349c19bb159a6c91","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:09dda486cf7db778ead24cee","evidence_notes":"Stat-Xplore 'Households on Universal Credit' dataset, April to December 2025, Great Britain, dimensioned by Family Type x Child Entitlement (Yes/No child element in the award); query echoed in the archived API response. DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.","evidence_url":"https://stat-xplore.dwp.gov.uk/","relation":"source_label","source_concept":"dwp.uc_households"},"dimension_set_key":"ledger.dimension_set.v2:495eb430d4b772790312eba1","dimensions":{"child_entitlement":"Yes","family_type":"Single, no children"},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit (child entitlement=Yes, family type=Single, no children) [dwp Households on Universal Credit by family type and child entitlement, April to December 2025 uc_households_by_family_type_and_child_entitlement_april_december_2025.json stat_xplore_2026_09_03]","layout":{"groupby_dimension":"dwp.uc_family_type","groupby_ordinal":1,"groupby_value_id":"single_no_children__child_entitlement_yes","groupby_value_label":"Single, no children, Yes","measure_id":"benefit_units","measure_label":"Universal Credit benefit units","measure_ordinal":0,"record_set_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12","record_set_spec_hash":"dab983bf1f93719dc9bae15f","record_set_spec_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.v1","source_column_id":"value","source_row_id":"single_no_children__child_entitlement_yes","table_record_kind":"detail"},"legacy_fact_key":"ledger.fact.v1:bc0d92df043c9f40a9effc06","lineage":{"source_cell_keys":["ledger.source_cell.v1:27b4e92b5513ed83d579d3ac","ledger.source_cell.v1:0c41fe6b0bac0d72d333912b","ledger.source_cell.v1:c3571d34e1e2c350b14a2207","ledger.source_cell.v1:c7f95e839229727bd51ec527"],"source_record_id":"dwp.statx.uc_benefit_units.family_type_child_entitlement.month2025_12.single_no_children__child_entitlement_yes.benefit_units","source_row_keys":["ledger.source_row.v1:082c4210d73f3e7e341900b6"]},"observed_measure":{"source_concept":"dwp.uc_households","source_measure_id":"benefit_units","source_name":"dwp","source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:6558eead1d59f9127b44b69c","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:01d64fbeac1b570c39341979","source":{"extracted_at":"2026-09-03","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","raw_r2_uri":"r2://ledger-raw/raw/uk/dwp/dwp-uc-households-family-type-child-entitlement-april-december-2025/2025/e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57/uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_file":"uc_households_by_family_type_and_child_entitlement_april_december_2025.json","source_name":"dwp","source_sha256":"e317eff1512d2d36e4064d5976be26ea950e3478e1c08122fd9ab35341fb5d57","source_size_bytes":7982,"source_table":"Households on Universal Credit by family type and child entitlement, April to December 2025","url":"https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table","vintage":"stat_xplore_2026_09_03"},"source_release_key":"ledger.source_release.v2:53a9199f091f47dccea365ad","source_series_key":"ledger.source_series.v2:3dc492a8c67367b1a504f325","universe_constraint_set_key":"ledger.universe_constraint_set.v2:2b63c9d7c2f0f41b9658107d","universe_constraints":{"constraints":[{"operator":"==","role":"filter","value":"Single, no children","variable":"family_type"},{"operator":"==","role":"filter","value":"Yes","variable":"child_entitlement"}],"domain":"universal_credit"},"value":0,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:5aa061e9646fbdc02bd4a085","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"hmrc","canonical_concept":"hmrc.cgt_gains_total","concept_alignment_key":"ledger.concept_alignment.v2:34d7a5f81f71c492efa47670","evidence_notes":"HMRC CGT statistics 2026, Table 5.2, 2023-24; counts are thousands and amounts are GBP millions. Totals may not sum due to rounding.","evidence_url":"https://www.gov.uk/government/statistics/capital-gains-tax-statistics","relation":"source_label","source_concept":"hmrc.cgt_gains_total"},"dimension_set_key":"ledger.dimension_set.v2:44136fa355b3678a1146ad16","dimensions":{},"entity":{"name":"tax_unit","role":"taxpayer"},"geography":{"id":"K02000001","level":"country","vintage":"current"},"label":"United Kingdom 2023 tax year sum hmrc cgt gains total for tax unit [hmrc Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region Table_5_2026_Regional_and_country_statistics.ods cgt_statistics_2026]","layout":{"groupby_dimension":"geography","groupby_ordinal":13,"groupby_value_id":"united_kingdom","groupby_value_label":"All","measure_id":"gains_total","measure_label":"Chargeable gains","measure_ordinal":1,"record_set_id":"hmrc.cgt_table5_2026.country_region.ty2023","record_set_spec_hash":"8833b02c01989c693a472337","record_set_spec_id":"hmrc.cgt_table5_2026.country_region.ty2023.v1","source_column_id":"gains_total","source_row_id":"united_kingdom","table_record_kind":"total"},"legacy_fact_key":"ledger.fact.v1:8407be8451e6db778f937a9c","lineage":{"source_cell_keys":["ledger.source_cell.v1:548faaf161cadaa95bace267","ledger.source_cell.v1:8c159702fdca46b498e490e0"],"source_record_id":"hmrc.cgt_table5_2026.country_region.ty2023.united_kingdom.gains_total","source_row_keys":[]},"observed_measure":{"source_concept":"hmrc.cgt_gains_total","source_measure_id":"gains_total","source_name":"hmrc","source_table":"Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region","unit":"gbp"},"observed_measure_key":"ledger.observed_measure.v2:43fb4aa41756b5bb790f9aea","period":{"type":"tax_year","value":2023},"period_coverage":{"basis":"tax","end_date":"2024-04-05","notes":"HMRC marks the 2023-24 statistics as provisional.","source_period_label":"2023 to 2024 tax year","start_date":"2023-04-06"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:6ad7e1343da03e00fadd6fcd","source":{"extracted_at":"2026-09-03","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/uk/hmrc/hmrc-cgt-country-region-2026/2026/dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509/Table_5_2026_Regional_and_country_statistics.ods","raw_r2_uri":"r2://ledger-raw/raw/uk/hmrc/hmrc-cgt-country-region-2026/2026/dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509/Table_5_2026_Regional_and_country_statistics.ods","source_file":"Table_5_2026_Regional_and_country_statistics.ods","source_name":"hmrc","source_sha256":"dd3efb61a06bd794e605fc3b4a18401bb51828ba8f6dcb44e67c8fc3f6037509","source_size_bytes":6754,"source_table":"Capital Gains Tax statistics Table 5: taxpayers, gains and liabilities by UK country and region","url":"https://assets.publishing.service.gov.uk/media/6a7b2444114277b327805c10/Table_5_2026_Regional_and_country_statistics.ods","vintage":"cgt_statistics_2026"},"source_release_key":"ledger.source_release.v2:d10fd3dc0ffe6f47c4a6b18f","source_series_key":"ledger.source_series.v2:9da935e197cb0f11c42670b5","universe_constraint_set_key":"ledger.universe_constraint_set.v2:31e69e018123fa4b604582eb","universe_constraints":{"domain":"capital_gains_tax"},"value":69861000000,"value_type":"integer"} +{"aggregate_fact_key":"ledger.aggregate_fact.v2:8f37a13228973c48fc995636","aggregation":{"method":"sum"},"assertion":"observation","concept_alignment":{"authority":"dwp","canonical_concept":"dwp.uc_benefit_units","concept_alignment_key":"ledger.concept_alignment.v2:860b334af7b847863e2a3cca","evidence_notes":"DWP defines a Universal Credit household as the UC unit of assessment; Chronicle normalizes that entity to benefit_unit.","evidence_url":"https://stat-xplore.dwp.gov.uk/","relation":"source_label","source_concept":"dwp.uc_households"},"dimension_set_key":"ledger.dimension_set.v2:5545826c91c747d11abed49d","dimensions":{"family_type":"Single, no children"},"entity":{"name":"benefit_unit","role":"universal_credit_unit_of_assessment"},"geography":{"id":"K03000001","level":"country","vintage":"current"},"label":"Great Britain 2025-12 month count dwp uc benefit units for benefit unit (family type=Single, no children) [dwp Households on Universal Credit by family type, April to December 2025 uc_households_by_family_type_april_december_2025.json stat_xplore_2026_08_21]","layout":{"groupby_dimension":"dwp.uc_family_type","groupby_ordinal":0,"groupby_value_id":"single_no_children","groupby_value_label":"Single, no children","measure_id":"benefit_units","measure_label":"Universal Credit benefit units","measure_ordinal":0,"record_set_id":"dwp.statx.uc_benefit_units.family_type.month2025_12","record_set_spec_hash":"357b86a76459eaa25b8e4970","record_set_spec_id":"dwp.statx.uc_benefit_units.family_type.month2025_12.v1","source_column_id":"value","source_row_id":"single_no_children","table_record_kind":"detail"},"legacy_fact_key":"ledger.fact.v1:a55361780162a5f037bb4269","lineage":{"source_cell_keys":["ledger.source_cell.v1:81dac94b4efac9d470df5212","ledger.source_cell.v1:75fe7cb0782ae4a1d4b2b998","ledger.source_cell.v1:a93f2173e0f33aec12a6f616"],"source_record_id":"dwp.statx.uc_benefit_units.family_type.month2025_12.single_no_children.benefit_units","source_row_keys":["ledger.source_row.v1:19555d267fc2d26a980bb8af"]},"observed_measure":{"source_concept":"dwp.uc_households","source_measure_id":"benefit_units","source_name":"dwp","source_table":"Households on Universal Credit by family type, April to December 2025","unit":"count"},"observed_measure_key":"ledger.observed_measure.v2:0b509058163e2c841aa5b37e","period":{"type":"month","value":"2025-12"},"provenance_class":"administrative","schema_version":"ledger.consumer_fact.v1","semantic_fact_key":"ledger.semantic_fact.v2:6c2b863ec0432f9ad07848de","source":{"extracted_at":"2026-08-21","extraction_method":"CellSelectorSpec and SourceRecordSpec resolved from cells","method_notes":"Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.","raw_r2_bucket":"ledger-raw","raw_r2_key":"raw/dwp/dwp-uc-households-family-type-april-december-2025/2025/44d67348da8c34465611ac00efdfcb80a69ad0f52e788d53f82517b34594377f/uc_households_by_family_type_april_december_2025.json","raw_r2_uri":"r2://ledger-raw/raw/dwp/dwp-uc-households-family-type-april-december-2025/2025/44d67348da8c34465611ac00efdfcb80a69ad0f52e788d53f82517b34594377f/uc_households_by_family_type_april_december_2025.json","source_file":"uc_households_by_family_type_april_december_2025.json","source_name":"dwp","source_sha256":"44d67348da8c34465611ac00efdfcb80a69ad0f52e788d53f82517b34594377f","source_size_bytes":6719,"source_table":"Households on Universal Credit by family type, April to December 2025","url":"https://stat-xplore.dwp.gov.uk/webapi/rest/v1/table","vintage":"stat_xplore_2026_08_21"},"source_release_key":"ledger.source_release.v2:9f8efed9887bd5a010eaade7","source_series_key":"ledger.source_series.v2:422a6a7d47249f00aab1204c","universe_constraint_set_key":"ledger.universe_constraint_set.v2:f3eacc541532777e223cccae","universe_constraints":{"constraints":[{"operator":"==","role":"filter","value":"Single, no children","variable":"family_type"}],"domain":"universal_credit"},"value":3725304,"value_type":"integer"} diff --git a/packages/microcosm-build/tests/test_uk_battery_bindings.py b/packages/microcosm-build/tests/test_uk_battery_bindings.py index ff0313fd5..71346837b 100644 --- a/packages/microcosm-build/tests/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/test_uk_battery_bindings.py @@ -1000,14 +1000,14 @@ def test_local_default_target_surface_uses_metric_names_and_signed_deferrals( ) assert result.passed is True - assert result.details["candidate_targets"] == 19_618 + assert result.details["candidate_targets"] == 19_932 assert result.details["reference_targets"] == 22_530 - # 1,901 signed area deferrals from the membership file plus the 1,011 + # 1,587 signed area deferrals from the membership file plus the 1,011 # ladder-derived households@area rows: census_households binds from the # OA-ladder artifact (microcosm#542), never from Chronicle facts, so the # in-code default surface excludes it by rule rather than by absence. exclusions = result.details["reviewed_exclusions"] - assert len(exclusions) == 1_901 + 1_011 + assert len(exclusions) == 1_587 + 1_011 households = [ name for name in exclusions if str(name).startswith("households@") ] diff --git a/packages/microcosm-build/tests/test_uk_calibration_seam_driver.py b/packages/microcosm-build/tests/test_uk_calibration_seam_driver.py index f8cf5b3ae..ac4d4dfa4 100644 --- a/packages/microcosm-build/tests/test_uk_calibration_seam_driver.py +++ b/packages/microcosm-build/tests/test_uk_calibration_seam_driver.py @@ -80,9 +80,7 @@ def test_driver_refuses_release_candidate_outright(tmp_path: Path): # The refusal is unconditional — an otherwise doctrine-clean invocation # is refused too, not just ones with override flags. with pytest.raises(SystemExit): - driver._parse_args( - _args(tmp_path) + ["--release-candidate", "--epochs", "128"] - ) + driver._parse_args(_args(tmp_path) + ["--release-candidate", "--epochs", "128"]) def test_driver_refuses_canonical_release_ids(tmp_path: Path): @@ -125,7 +123,24 @@ def test_driver_refuses_bad_sha_and_path_alias(tmp_path: Path): driver._parse_args(args) -def test_driver_threads_registry_exclusions_resolver_and_overrides(monkeypatch, tmp_path, capsys): +def test_driver_refuses_feed_outside_the_committed_pin_without_override(): + driver = _load_driver_module() + + with pytest.raises(SystemExit, match="committed UK feed pin"): + driver._check_committed_ledger_feed_pin( + "b" * 64, + allow_unpinned_feed=False, + ) + + driver._check_committed_ledger_feed_pin( + "b" * 64, + allow_unpinned_feed=True, + ) + + +def test_driver_threads_registry_exclusions_resolver_and_overrides( + monkeypatch, tmp_path, capsys +): driver = _load_driver_module() calls = [] registry = _registry() @@ -133,12 +148,14 @@ def test_driver_threads_registry_exclusions_resolver_and_overrides(monkeypatch, artifact = SimpleNamespace( path=tmp_path / "ledger", facts=({"fact": 1},), - facts_sha256="b" * 64, + facts_sha256=driver._LEDGER_FACT_FEED_PIN["facts_sha256"], manifest_sha256="c" * 64, ) artifact.path.mkdir() (artifact.path / "consumer_facts.jsonl").write_text("{}", encoding="utf-8") - monkeypatch.setattr(driver, "load_ledger_consumer_artifact", lambda *a, **k: artifact) + monkeypatch.setattr( + driver, "load_ledger_consumer_artifact", lambda *a, **k: artifact + ) monkeypatch.setattr( driver, "compile_uk_target_registry", @@ -149,7 +166,9 @@ def test_driver_threads_registry_exclusions_resolver_and_overrides(monkeypatch, "load_uk_frs_release", lambda: SimpleNamespace(calibration_year=2025), ) - monkeypatch.setattr(driver, "load_uk_calibration_measure_exclusions", lambda path: ()) + monkeypatch.setattr( + driver, "load_uk_calibration_measure_exclusions", lambda path: () + ) monkeypatch.setattr( driver, "apply_uk_calibration_measure_exclusions", @@ -191,8 +210,17 @@ def fake_run(**kwargs): assert call["doctrine"].epochs == 128 assert call["doctrine_overrides"] == {"epochs": {"default": 256, "effective": 128}} assert isinstance(call["measure_resolver"], FakeResolver) - assert call["measure_resolver"].kwargs["simulation_source"] == call["paths"].input_h5 - assert call["source_pins"]["ledger_facts"] == {"sha256": "b" * 64, "size_bytes": 2} + assert ( + call["measure_resolver"].kwargs["simulation_source"] == call["paths"].input_h5 + ) + assert call["source_pins"]["ledger_facts"] == { + "sha256": driver._LEDGER_FACT_FEED_PIN["facts_sha256"], + "size_bytes": 2, + } + assert call["run_config_extra"] == { + "calibration_year": 2025, + "allow_unpinned_feed": False, + } assert "uk_target_fit" in capsys.readouterr().out diff --git a/packages/microcosm-build/tests/test_uk_local_target_census.py b/packages/microcosm-build/tests/test_uk_local_target_census.py index 601d11bcf..a83b3c721 100644 --- a/packages/microcosm-build/tests/test_uk_local_target_census.py +++ b/packages/microcosm-build/tests/test_uk_local_target_census.py @@ -104,9 +104,10 @@ def test_census_source_rows_are_reviewed_pointers() -> None: if source["status"] == SOURCE_STATUS_PINNED_IN_LEDGER_FACTS: pin = source["ledger_fact_pin"] assert pin["facts_sha256"] == ( - "4395a4e76a75332cc77a7dc1ea5d3c49b36e0d268c8449474bc129aa24e38c48" + "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f" ) - assert pin["source_commit"] == "33ca98a" + assert pin["source_commit"] == "6fb700e" + assert pin["source_repo"] == "PolicyEngine/chronicle" if source["status"] == SOURCE_STATUS_SIGNED_DEFERRED: assert source["signed_reason_id"], source["source_id"] assert source["signed_rationale"], source["source_id"] diff --git a/packages/microcosm-build/tests/test_uk_national_calibration.py b/packages/microcosm-build/tests/test_uk_national_calibration.py index 58a0a8c2c..a259bd24e 100644 --- a/packages/microcosm-build/tests/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/test_uk_national_calibration.py @@ -228,6 +228,15 @@ def _fact_for_reference( ) -> dict: selector = dict(reference.ledger_selector) dimensions = dict(selector.get("dimension_values", {})) + layout = { + key: selector[key] + for key in ( + "groupby_dimension", + "groupby_value_id", + "record_set_spec_id", + ) + if key in selector + } return { "aggregate_fact_key": f"ledger.aggregate_fact.v2:{reference.name}", "aggregation": {"method": "sum"}, @@ -237,10 +246,11 @@ def _fact_for_reference( "level": selector.get("geography_level", "country"), "id": selector.get("geography_id", "K02000001"), }, + "layout": layout, "observed_measure": { "source_name": selector["source_name"], "source_concept": selector["source_concept"], - "source_measure_id": "value", + "source_measure_id": selector.get("source_measure_id", "value"), "unit": "gbp", }, "period": {"type": "month", "value": f"{reference.period}-12"}, @@ -342,7 +352,9 @@ def test_uc_calibration_stage_accepts_benunit_grain_reference_on_nested_frame() def test_stage_measure_resolver_injects_columns_then_restores_pristine_output() -> None: frame = _frame_without_uc_column() resolver = StubMeasureResolver() - original_columns = {entity: set(frame.table(entity).columns) for entity in frame.entities} + original_columns = { + entity: set(frame.table(entity).columns) for entity in frame.entities + } stage = UKNationalCalibrationStage( _registry(), band_edge_registry=_registry(), @@ -865,9 +877,7 @@ def test_measure_resolution_never_touches_the_source_frame() -> None: from microcosm.build.uk_runtime.ledger_targets import UKFrameTargetAdapter frame = _materialization_binding_frame() - before = { - entity: list(frame.table(entity).columns) for entity in frame.entities - } + before = {entity: list(frame.table(entity).columns) for entity in frame.entities} class ProbeResolver: contract_targets = { diff --git a/packages/microcosm-build/tests/test_uk_pipr_deferrals.py b/packages/microcosm-build/tests/test_uk_pipr_deferrals.py index 029e6f7d7..737891541 100644 --- a/packages/microcosm-build/tests/test_uk_pipr_deferrals.py +++ b/packages/microcosm-build/tests/test_uk_pipr_deferrals.py @@ -26,37 +26,48 @@ def _membership() -> dict: ) -def test_pipr_2025_surface_remains_fully_deferred_after_measurement() -> None: +def _references() -> list[dict]: + return json.loads( + importlib_resources.files("microcosm.build.uk") + .joinpath("local_target_references.json") + .read_text() + )["target_references"] + + +def test_pipr_2025_surface_activates_available_calendar_year_averages() -> None: target = _membership()["targets"]["ons.rent.private_rent"] candidates = target["geography_levels"]["local_authority"]["candidates"] assert len(candidates) == 361 - assert sum(row["status"] == "active" for row in candidates) == 0 + assert sum(row["status"] == "active" for row in candidates) == 314 assert ( - sum(row["status"] == "no_fact_at_or_before_period" for row in candidates) == 314 + sum(row["status"] == "no_fact_at_or_before_period" for row in candidates) == 0 ) assert sum(row["status"] == "no_fact_for_area" for row in candidates) == 47 + references = [ + row + for row in _references() + if row["metadata"]["contract_target_id"] == "ons.rent.private_rent" + ] + assert len(references) == 314 + assert {row["value_operation"] for row in references} == {"calendar_year_average"} + assert {row["metadata"]["fact_aggregation"] for row in references} == {"time_mean"} + assert all( + "Calendar-year average" in row["metadata"]["period_basis_note"] + for row in references + ) -def test_pipr_four_signed_reasons_pin_feed_and_crosswalk_measurements() -> None: +def test_pipr_three_signed_absence_reasons_pin_crosswalk_measurements() -> None: rows = { row["reason_id"]: row for row in _membership()["signed_deferrals"] if row["reason_id"].startswith("private_rent_pipr_") } assert set(rows) == { - "private_rent_pipr_after_target_period", "private_rent_pipr_english_lad_absent", "private_rent_pipr_scotland_brma_grain", "private_rent_pipr_ni_absent", } - assert len(rows["private_rent_pipr_after_target_period"]["area_ids"]) == 314 - assert ( - "348 facts total" in rows["private_rent_pipr_after_target_period"]["rationale"] - ) - assert ( - "E08000038 and E08000039" - in rows["private_rent_pipr_after_target_period"]["rationale"] - ) assert rows["private_rent_pipr_english_lad_absent"]["area_ids"] == [ "E06000053", "E08000016", diff --git a/packages/microcosm-build/tests/test_uk_population_targets.py b/packages/microcosm-build/tests/test_uk_population_targets.py index 51ce30079..d780b8c2d 100644 --- a/packages/microcosm-build/tests/test_uk_population_targets.py +++ b/packages/microcosm-build/tests/test_uk_population_targets.py @@ -522,7 +522,11 @@ def test_uk_population_uc_households_target_counts_benunits() -> None: assert target["ledger_selector"] == { "source_name": "dwp", "source_concept": "dwp.uc_benefit_units", + "source_measure_id": "total_units", + "groupby_dimension": "dwp.uc_deductions_month", } + assert "6,758,889" in target["bindings"]["policyengine"]["notes"] + assert "1.45%" in target["bindings"]["policyengine"]["notes"] def test_uk_uc_composition_and_disability_children_targets_are_rebound() -> None: diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index d9ee9d216..9c650e3e6 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -7,7 +7,11 @@ from __future__ import annotations +import hashlib import json +import os +import subprocess +import sys from importlib import resources as importlib_resources from pathlib import Path @@ -16,6 +20,7 @@ import pytest from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.ledger_targets import ( LedgerTargetReference, compile_ledger_target_references, @@ -24,12 +29,14 @@ TargetReferenceAuthoringConfig, author_target_references, ) +from microcosm.build.uk_runtime.local_target_census import _LEDGER_FACT_FEED_PIN 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, + _sum_target_ids, _value_operation_by_target_id, ) @@ -45,12 +52,16 @@ "obr.esa", "hmrc.cgt.gains_total", "hmrc.cgt.taxpayers_total", + "dwp.uc.households", + "dwp.uc.households_single_no_children", } FIXTURE_FEED_ROWS = ( Path(__file__).parent / "fixtures" / "uk_target_reference_feed_rows.jsonl" ) +STABLE_UK_FACT_FEED_NAME = ".codex-work/consumer_facts_uk.jsonl" + def _load_uk_resource(name: str) -> dict: return json.loads( @@ -58,6 +69,100 @@ def _load_uk_resource(name: str) -> dict: ) +def _sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def test_committed_surfaces_regenerate_from_pinned_feed(tmp_path: Path) -> None: + root = Path(__file__).resolve().parents[3] + configured = os.environ.get("CHRONICLE_UK_FACTS") + feed = Path(configured) if configured else root / STABLE_UK_FACT_FEED_NAME + if not feed.exists(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + + if feed.is_dir(): + artifact_path = feed + else: + default_manifest = root / ".codex-work/consumer_facts_uk_manifest.json" + manifest = ( + default_manifest if not configured else feed.with_name("manifest.json") + ) + if not manifest.is_file(): + pytest.skip("pinned UK Chronicle consumer manifest is not present") + artifact_path = tmp_path / "consumer-artifact" + artifact_path.mkdir() + (artifact_path / "consumer_facts.jsonl").symlink_to(feed.resolve()) + (artifact_path / "manifest.json").symlink_to(manifest.resolve()) + + artifact = load_ledger_consumer_artifact( + artifact_path, + expected_facts_sha256=_LEDGER_FACT_FEED_PIN["facts_sha256"], + expected_manifest_sha256=_LEDGER_FACT_FEED_PIN["manifest_sha256"], + ) + assert artifact.fact_row_count == 128_717 + facts_path = ( + artifact.path / "consumer_facts.jsonl" + if artifact.path.is_dir() + else artifact.path + ) + + package = root / "packages/microcosm-build/src/microcosm/build/uk" + generated = tmp_path / "generated" + generated.mkdir() + national = generated / "target_references.json" + national_membership = generated / "target_reference_membership.json" + local = generated / "local_target_references.json" + local_membership = generated / "local_target_reference_membership.json" + common = [sys.executable] + subprocess.run( + [ + *common, + str(root / "tools/generate_uk_target_references.py"), + "--contract", + str(package / "uk_population_targets.json"), + "--ledger-facts", + str(facts_path), + "--source-fact-feed", + STABLE_UK_FACT_FEED_NAME, + "--output", + str(national), + "--membership-report", + str(national_membership), + ], + cwd=root, + check=True, + ) + subprocess.run( + [ + *common, + str(root / "tools/generate_uk_local_target_references.py"), + "--contract", + str(package / "uk_population_targets.json"), + "--ledger-facts", + str(facts_path), + "--source-fact-feed", + STABLE_UK_FACT_FEED_NAME, + "--crosswalk", + str(package / "local_area_crosswalk.json"), + "--output", + str(local), + "--membership-report", + str(local_membership), + ], + cwd=root, + check=True, + ) + + for regenerated, committed_name in ( + (national, "target_references.json"), + (national_membership, "target_reference_membership.json"), + (local, "local_target_references.json"), + (local_membership, "local_target_reference_membership.json"), + ): + committed = package / committed_name + assert _sha256(regenerated) == _sha256(committed), committed_name + + def _contract_targets_by_id() -> dict[str, dict]: contract = _load_uk_resource("uk_population_targets.json") return {target["target_id"]: target for target in contract["targets"]} @@ -75,6 +180,11 @@ def _uc_benefit_units_fact(period: str, *, value: float) -> dict: "aggregation": {"method": "sum"}, "assertion": "observation", "geography": {"level": "country", "id": "K03000001"}, + "layout": { + "groupby_dimension": "dwp.uc_deductions_month", + "measure_id": "total_units", + "record_set_id": f"dwp.uc_deductions.{period}.total_units", + }, "observed_measure": { "source_name": "dwp", "source_concept": "dwp.uc_benefit_units", @@ -104,6 +214,7 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: "sum", "calendar_year_average", "latest_plateau", + "count_x_mean", ] assert len(names) == len(set(names)) @@ -176,12 +287,44 @@ def test_ons_age_total_targets_pin_exact_age_dimension_set() -> None: ] } - assert references["ons.population.scotland_babies_under_1"][ - "ledger_selector" - ]["dimensions"] == ["age"] - assert references["ons.population.scotland_children_under_16"][ - "ledger_selector" - ]["dimensions"] == ["age"] + 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_uc_composition_targets_pin_exact_dimension_sets_without_triggering_sum() -> ( + None +): + contract = _load_uk_resource("uk_population_targets.json") + targets = {target["target_id"]: target for target in contract["targets"]} + sum_target_ids = _sum_target_ids(contract) + + composition = { + target_id: target + for target_id, target in targets.items() + if target["family"] == "dwp_universal_credit" + and "dimension_values" in target["ledger_selector"] + } + assert composition + for target_id, target in composition.items(): + selector = target["ledger_selector"] + assert set(selector["dimension_values"]) <= set(selector["dimensions"]) + assert target_id not in sum_target_ids + + for target_id, target in composition.items(): + selector = target["ledger_selector"] + if target_id.startswith("dwp.uc.households_children_"): + assert selector["dimensions"] == ["number_of_children"] + elif target_id.startswith( + ( + "dwp.uc.households_single_", + "dwp.uc.households_couple_", + ) + ): + assert selector["dimensions"] == ["family_type"] def test_prefix_geography_pins_carry_scotgov_and_england_scoped_slc_families() -> None: @@ -281,9 +424,8 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: assert membership["active_reference_count"] == ACTIVE_REFERENCE_COUNT assert membership["status_counts"] == { "active": 408, - "multi_fact": 1, "no_fact_at_or_before_period": 7, - "signed_excluded": 1, + "signed_excluded": 2, } assert membership["genuine_sum_residue"] assert membership["uprating_holds"] @@ -348,24 +490,20 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: "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", + "status": "signed_excluded", "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." + "Signed out pending a Scotland household-composition fact: " + "the current selector reaches person-level ONS mid-year " + "population age rows, not households with three or more " + "children. microcosm#736 tracks the missing declaration." ), - } + }, ] + assert membership["multi_fact_rationales"] == [] def test_uk_fixture_b_signed_differences_carry_ruled_rationales() -> None: @@ -378,18 +516,15 @@ def test_uk_fixture_b_signed_differences_carry_ruled_rationales() -> None: 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"] + 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: @@ -443,9 +578,29 @@ def test_uk_target_references_compile_from_real_staged_feed_rows() -> None: assert targets["hmrc.cgt.taxpayers_total"].value == 378_000 assert targets["hmrc.cgt.gains_total"].metadata["ledger_fact_period"] == "2023" + caseload = targets["dwp.uc.households"] + assert caseload.value == pytest.approx(6_758_888.888888889) + assert caseload.metadata["ledger_member_fact_count"] == "9" + assert caseload.metadata["ledger_value_operation"] == "calendar_year_average" -def test_uk_generator_assigns_calendar_average_to_uc_benefit_unit_targets() -> None: + family_type = targets["dwp.uc.households_single_no_children"] + assert family_type.value == 3_725_304 + assert "ledger_member_fact_count" not in family_type.metadata + assert family_type.metadata["ledger_value_operation"] == "calendar_year_average" + + +def test_uk_generator_assigns_calendar_average_to_the_whole_uc_family() -> None: contract = _load_uk_resource("uk_population_targets.json") + operations = _value_operation_by_target_id(contract) + uc_target_ids = { + target["target_id"] + for target in contract["targets"] + if target["family"] == "dwp_universal_credit" + } + assert uc_target_ids + assert all( + operations[target_id] == "calendar_year_average" for target_id in uc_target_ids + ) facts = [ _uc_benefit_units_fact("2025-04", value=6_380_000.0), *( @@ -516,11 +671,16 @@ def test_uk_target_references_constrain_a_frame_with_prepared_columns() -> None: n_households = 3 weights = np.array([10.0, 20.0, 30.0]) household_columns: dict[str, np.ndarray] = {} + benunit_columns: dict[str, np.ndarray] = {} person_columns: dict[str, np.ndarray] = {} expected_aggregates: dict[str, float] = {} for index, compiled in enumerate(registry.specs): column = np.array([index + 1.0, 2.0 * (index + 1.0), 0.0]) - columns = person_columns if compiled.entity == "person" else household_columns + columns = { + "person": person_columns, + "benunit": benunit_columns, + "household": household_columns, + }[compiled.entity] columns[compiled.measure] = column expected_aggregates[f"{compiled.name}@{compiled.period}"] = float( (column * weights).sum() @@ -533,14 +693,16 @@ def test_uk_target_references_constrain_a_frame_with_prepared_columns() -> None: { "person_id": household_ids, "person_household_id": household_ids, + "person_benunit_id": household_ids, **person_columns, } ), + "benunit": pd.DataFrame({"benunit_id": household_ids, **benunit_columns}), "household": pd.DataFrame( {"household_id": household_ids, **household_columns} ), }, - EntitySchema(group_entities=("household",)), + EntitySchema(group_entities=("household", "benunit")), {"household": Weights(values=weights, kind=WeightKind.DESIGN)}, ) diff --git a/tools/calibrate_uk_national_dataset.py b/tools/calibrate_uk_national_dataset.py index c6e2118a5..c05b2fb04 100644 --- a/tools/calibrate_uk_national_dataset.py +++ b/tools/calibrate_uk_national_dataset.py @@ -27,6 +27,7 @@ ) from microcosm.build.uk_runtime.frs_release import load_uk_frs_release from microcosm.build.uk_runtime.ledger_targets import compile_uk_target_registry +from microcosm.build.uk_runtime.local_target_census import _LEDGER_FACT_FEED_PIN from microcosm.build.uk_runtime.measure_simulation import ( UKMeasureResolver, apply_uk_calibration_measure_exclusions, @@ -37,7 +38,9 @@ from microcosm.calibrate import TargetRegistry _SHA256 = re.compile(r"[0-9a-f]{64}") -_CANONICAL_UK_RELEASE_ID = re.compile(r"populace-uk-[1-9][0-9]*-[a-z0-9_]+-k[1-9][0-9]*") +_CANONICAL_UK_RELEASE_ID = re.compile( + r"populace-uk-[1-9][0-9]*-[a-z0-9_]+-k[1-9][0-9]*" +) _UK_JUNE_RELEASE_ID = "populace-uk-2023-dd68c73-4aa4b14-20260619T023711Z" @@ -48,6 +51,10 @@ def main(argv: list[str] | None = None) -> int: expected_facts_sha256=args.ledger_facts_sha256, expected_manifest_sha256=args.ledger_manifest_sha256, ) + _check_committed_ledger_feed_pin( + artifact.facts_sha256, + allow_unpinned_feed=args.allow_unpinned_feed, + ) calibration_year = load_uk_frs_release().calibration_year compilation = compile_uk_target_registry( artifact.facts, target_period=calibration_year @@ -111,7 +118,10 @@ def main(argv: list[str] | None = None) -> int: }, "ledger_facts": _ledger_facts_pin(artifact), }, - run_config_extra={"calibration_year": calibration_year}, + run_config_extra={ + "calibration_year": calibration_year, + "allow_unpinned_feed": args.allow_unpinned_feed, + }, release_id=args.release_id, logbook_prev_row_digest=args.logbook_prev_row_digest, ) @@ -133,6 +143,14 @@ def _parse_args(argv: list[str] | None) -> argparse.Namespace: parser.add_argument("--ledger-facts", required=True, type=Path) parser.add_argument("--ledger-facts-sha256", required=True, type=_sha256) parser.add_argument("--ledger-manifest-sha256", required=True, type=_sha256) + parser.add_argument( + "--allow-unpinned-feed", + action="store_true", + help=( + "Allow a Chronicle fact feed whose content hash differs from the " + "committed UK feed pin; the override is recorded in the run manifest." + ), + ) parser.add_argument("--staging-h5", required=True, type=Path) parser.add_argument("--diagnostics-json", required=True, type=Path) parser.add_argument("--build-record-json", required=True, type=Path) @@ -205,6 +223,20 @@ def _sha256_file(path: Path) -> str: return digest.hexdigest() +def _check_committed_ledger_feed_pin( + facts_sha256: str, + *, + allow_unpinned_feed: bool, +) -> None: + committed = _LEDGER_FACT_FEED_PIN["facts_sha256"] + if facts_sha256 != committed and not allow_unpinned_feed: + raise SystemExit( + "error: Chronicle consumer facts differ from the committed UK feed pin: " + f"loaded {facts_sha256}, committed {committed}; pass " + "--allow-unpinned-feed only for an explicitly reviewed diagnostic run" + ) + + def _validate_distinct_paths(paths: dict[str, Path]) -> None: resolved = {label: path.expanduser().resolve() for label, path in paths.items()} for (left_label, left), (right_label, right) in combinations(resolved.items(), 2): @@ -223,7 +255,10 @@ def _paths_alias(left: Path, right: Path) -> bool: right_stat = right.stat() except FileNotFoundError: return False - return (left_stat.st_dev, left_stat.st_ino) == (right_stat.st_dev, right_stat.st_ino) + return (left_stat.st_dev, left_stat.st_ino) == ( + right_stat.st_dev, + right_stat.st_ino, + ) def _compare_frozen_register(path: Path | None, registry: Any) -> None: @@ -252,7 +287,9 @@ def _compare_frozen_register(path: Path | None, registry: Any) -> None: def _ledger_facts_pin(artifact: Any) -> dict[str, object]: facts_path = ( - artifact.path / "consumer_facts.jsonl" if artifact.path.is_dir() else artifact.path + artifact.path / "consumer_facts.jsonl" + if artifact.path.is_dir() + else artifact.path ) return {"sha256": artifact.facts_sha256, "size_bytes": facts_path.stat().st_size} diff --git a/tools/generate_uk_local_target_references.py b/tools/generate_uk_local_target_references.py index 8065f4e8c..9fe172300 100644 --- a/tools/generate_uk_local_target_references.py +++ b/tools/generate_uk_local_target_references.py @@ -52,8 +52,17 @@ def main() -> None: areas_by_geography_level=_areas_by_geography_level(crosswalk), area_signed_deferrals=tuple(_area_signed_deferrals(contract, crosswalk)), value_operation_by_target_id=_value_operation_by_target_id(contract), + reference_metadata_by_target_id={ + "ons.rent.private_rent": { + "fact_aggregation": "time_mean", + "period_basis_note": ( + "Calendar-year average of the available 2025 PIPR monthly " + "area price levels; approved by María on 2026-09-05." + ), + } + }, binding_vocabulary=POLICYENGINE_BINDING_KEYS, - source_fact_feed=str(args.ledger_facts), + source_fact_feed=args.source_fact_feed or str(args.ledger_facts), ) authored = author_area_target_references( contract, @@ -84,6 +93,10 @@ def _parser() -> argparse.ArgumentParser: # The pinned consumer feed is licensed and untracked: it must be named # explicitly so a regeneration never silently binds to a stale local copy. parser.add_argument("--ledger-facts", type=Path, required=True) + parser.add_argument( + "--source-fact-feed", + help="Stable display name recorded in the generated membership report.", + ) parser.add_argument( "--crosswalk", type=Path, default=UK_PACKAGE_ROOT / "local_area_crosswalk.json" ) @@ -157,6 +170,8 @@ def _value_operation_by_target_id(contract: Mapping[str, Any]) -> dict[str, str] "ons.tenure.social_rent", }: operations[target_id] = "sum" + if target_id == "ons.rent.private_rent": + operations[target_id] = "calendar_year_average" return operations @@ -197,11 +212,6 @@ def _area_signed_deferrals( "E08000019", "E09000001", ) - pipr_after_target_period_area_ids = tuple( - area_id - for area_id in local_authority_ids - if area_id[:1] in {"E", "W"} and area_id not in pipr_lad_absent_area_ids - ) spi_la_measure_gap_area_ids = ("E06000027", "E06000053") deferrals: list[AreaSignedDeferral] = [] @@ -349,32 +359,25 @@ def add( ), area_ids=council_tax_wales_band_h_area_ids, ) - add( - target_id="ons.rent.private_rent", - geography_level="local_authority", - reason_id="private_rent_pipr_after_target_period", - rationale="The pinned feed contains one PIPR period, 2026-06: 348 facts total, including 316 LA ids. Of those, 314 overlap the 2025 crosswalk (292 England and all 22 Wales); E08000038 and E08000039 are outside it. No PIPR fact is at or before the 2025 target period, so all 314 matching cells remain deferred.", - area_ids=pipr_after_target_period_area_ids, - ) add( target_id="ons.rent.private_rent", geography_level="local_authority", reason_id="private_rent_pipr_english_lad_absent", - rationale="The pinned feed's sole PIPR period (2026-06) carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001.", + rationale="The pinned PIPR monthly series carries 294 English LA ids, of which 292 overlap the crosswalk and two (E08000038, E08000039) do not. It omits four English crosswalk authorities: E06000053, E08000016, E08000019, and E09000001.", area_ids=pipr_lad_absent_area_ids, ) add( target_id="ons.rent.private_rent", geography_level="local_authority", reason_id="private_rent_pipr_scotland_brma_grain", - rationale="The pinned feed's sole PIPR period (2026-06) carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred.", + rationale="The pinned PIPR monthly series carries 18 Scottish BRMA rows at statistical_scope grain and no Scottish LA rows for the 32-authority crosswalk. CrossGrainBridge declares target identity but cannot translate overlapping BRMA geographies to LAs, and no signed BRMA-to-LA crosswalk is present, so allocation is forbidden and all 32 cells remain deferred.", area_ids=scottish_local_authorities, ) add( target_id="ons.rent.private_rent", geography_level="local_authority", reason_id="private_rent_pipr_ni_absent", - rationale="The pinned feed's 348 PIPR facts at 2026-06 contain zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent.", + rationale="The pinned PIPR monthly series contains zero Northern Ireland rows at any geography level, so all 11 Northern Ireland local-authority cells remain signed absent.", area_ids=ni_local_authorities, ) return deferrals diff --git a/tools/generate_uk_target_references.py b/tools/generate_uk_target_references.py index 79c3998ae..73d8da5d6 100644 --- a/tools/generate_uk_target_references.py +++ b/tools/generate_uk_target_references.py @@ -121,7 +121,7 @@ def main() -> None: 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), + source_fact_feed=args.source_fact_feed or str(args.ledger_facts), ) authored = author_target_references(contract, facts, config) _add_uk_membership_accounting(authored.membership_report, authored.references) @@ -144,6 +144,10 @@ 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( + "--source-fact-feed", + help="Stable display name recorded in the generated membership report.", + ) 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) @@ -238,7 +242,10 @@ def _sum_target_ids(contract: Mapping[str, Any]) -> frozenset[str]: 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()): + if any( + key != "dimensions" and isinstance(value, list) + for key, value in selector.items() + ): target_ids.add(str(target["target_id"])) dimension_values = selector.get("dimension_values") if isinstance(dimension_values, Mapping) and any( @@ -250,10 +257,13 @@ def _sum_target_ids(contract: Mapping[str, Any]) -> frozenset[str]: 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)} + # ``dimensions: []`` is an exact-key-set selector pin, not a generic sum + # trigger. The UK all-ages population row is nevertheless a reviewed sum + # residue and must retain that operation explicitly. + operations["ons.population.uk_total"] = "sum" 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": + if target.get("family") == "dwp_universal_credit": operations[target_id] = "calendar_year_average" return operations @@ -263,9 +273,10 @@ def _selector_pins(contract: Mapping[str, Any]) -> 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) + 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) @@ -274,14 +285,23 @@ def _selector_pins(contract: Mapping[str, Any]) -> dict[str, dict[str, Any]]: def _signed_exclusions(contract: Mapping[str, Any]) -> dict[str, str]: - target_ids = { - str(target["target_id"]) - for target in contract.get("targets", ()) + target_ids = {str(target["target_id"]) for target in contract.get("targets", ())} + exclusions = { + "hmrc.spi.property_income.amount_by_total_income_band": ( + PROPERTY_INCOME_SIGNED_EXCLUSION_RATIONALE + ), + "ons.population.scotland_households_3plus_children": ( + "Signed out pending a Scotland household-composition fact: the " + "current selector reaches person-level ONS mid-year population " + "age rows, not households with three or more children. " + "microcosm#736 tracks the missing declaration." + ), + } + return { + target_id: rationale + for target_id, rationale in exclusions.items() + if target_id in target_ids } - 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( @@ -419,24 +439,17 @@ def _add_uk_membership_accounting( "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." - ), - } + "status": "signed_excluded", + "signed_rationale": report["targets"][ + "ons.population.scotland_households_3plus_children" + ]["candidates"][0]["signed_rationale"], + }, ] + report["multi_fact_rationales"] = [] _GEOGRAPHY_VALUE_IDS = frozenset( diff --git a/tools/score_uk_local_candidate.py b/tools/score_uk_local_candidate.py index beb278116..35cb64f14 100644 --- a/tools/score_uk_local_candidate.py +++ b/tools/score_uk_local_candidate.py @@ -27,7 +27,7 @@ relative_error_loss, ) -UK_LOCAL_ACTIVE_REFERENCE_COUNT = 19_618 +UK_LOCAL_ACTIVE_REFERENCE_COUNT = 19_932 UK_LOCAL_SCORE_TARGET_PERIOD = 2025 #: The incumbent is scored from published weights, never re-solved, so no #: incumbent holdout exists to place beside the candidate's rotation. From 5750244227a8f0fa4400d657c62b241c13b10eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 07:00:23 +0200 Subject: [PATCH 26/33] Port the childcare/TFC spine input and targets and activate the DfT bus targets (#834, #789) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lane A (D1–D6): a generic `assign_period_constant` source operation gives `frs_person_draws` the HMRC-derived `tax_free_childcare_spend_routed_share` from a new `stochastic` entry of the take-up contract at the build year (2024-04-01 → 0.593; 2017–2025 series from the March-2026 account-activity ODS, Chronicle package and sha pinned), with the stage's node key folding the contract sha, a build-year lockstep check against the installed engine, the degenerate-column and swap-register entries, and the H2 fixture regenerated. The contract's TFC citation is corrected, the targeted rationale added, and the extended-hours distribution moved to `frozen_by_adjudication`. The childcare fitter is rewritten: targets compiled from the contract and the pinned feed, four rates, hours frozen, identity-keyed draws, `--eps` recorded in the receipt. Lane B (D8–D13): five childcare rows declared once and resolved by period (`hmrc.tfc.*` at fiscal-year government/person grain; the three DfE rows with the `sum` cardinality guard, the `difference` operation and the observation basis), the two England bus rows active at household grain and the London, outside-London and UK rows declared with model-side filters but signed on the new `target_reference_signed_exclusions.json`; national references, membership, local references and the compile-parity receipts regenerated on feed `6ae49d7d…` (415 active / 7 no fact / 8 signed). Publisher fixtures for the tests are Chronicle rows (`uk_bus05i_fy2025.json`), never hand-copied. Two I0 defects fixed here: `dwp.uc.scotland_households_child_under_1` keeps its household-grain binding (the measure provider has no categorical household-to-benefit-unit broadcast, so the benefit-unit re-bind refused at calibration), and the held London / outside-London bus rows carry their region filters. Receipts: `experiments/834-childcare-tfc-receipts.md` Parts C–E (L2 column twin, L3 round trip, L5 fit diagnosis, bus re-measurement, both-basis table). Co-Authored-By: Claude Fable 5.1 --- .../uk-childcare-bus-targets-834-789.added.md | 1 + .../uk-childcare-fitter-834.changed.md | 1 + changelog.d/uk-tfc-routed-share-834.added.md | 1 + experiments/834-childcare-tfc-receipts.md | 184 ++- .../src/microcosm/build/ledger_targets.py | 114 +- .../src/microcosm/build/source_manifest.py | 1 + .../spec_engine/schema/sources.schema.json | 28 + .../build/target_reference_authoring.py | 18 + .../microcosm/build/uk/country_package.json | 5 + .../uk/degenerate_reviewed_exclusions.json | 7 + .../src/microcosm/build/uk/gates.json | 1 + ...ity_incumbent_2025_signed_differences.json | 55 +- ...ty_production_2023_signed_differences.json | 41 +- .../build/uk/local_target_references.json | 1 + .../uk/release_input_coverage_manifest.json | 26 +- .../src/microcosm/build/uk/source_stages.json | 106 +- .../src/microcosm/build/uk/spec/sources.yaml | 13 +- .../uk/spine_swap_signed_differences.json | 31 +- .../microcosm/build/uk/take_up_contract.json | 45 +- .../build/uk/target_reference_membership.json | 255 +++- .../target_reference_signed_exclusions.json | 69 + .../microcosm/build/uk/target_references.json | 340 ++++- .../build/uk/uk_data_target_parity.json | 2 +- .../build/uk/uk_population_targets.json | 1266 +++++++++++++---- .../build/uk_runtime/data_target_parity.py | 2 +- .../microcosm/build/uk_runtime/diagnostics.py | 5 + .../build/uk_runtime/frs_person_draws.py | 44 +- .../src/microcosm/build/uk_runtime/graph.py | 1 + .../build/uk_runtime/take_up_contract.py | 7 + .../build/uk_runtime/terminal_gates.py | 1 + .../tests/fixtures/uk_bus05i_fy2025.json | 12 + .../uk_target_reference_feed_rows.jsonl | 2 +- .../tests/test_country_spec.py | 4 +- .../tests/test_ledger_targets.py | 146 ++ .../tests/test_spec_engine_country_bundles.py | 2 +- .../tests/test_uk_battery_bindings.py | 4 +- .../tests/test_uk_bus_targets.py | 96 ++ .../tests/test_uk_childcare_targets.py | 66 + .../tests/test_uk_diagnostics.py | 6 + .../tests/test_uk_frs_stochastic.py | 14 +- .../tests/test_uk_national_calibration.py | 4 +- .../tests/test_uk_population_targets.py | 58 +- .../tests/test_uk_source_stages.py | 5 +- .../tests/test_uk_stochastic_tools.py | 75 +- .../tests/test_uk_take_up_contract.py | 58 +- .../tests/test_uk_target_references.py | 85 +- .../tests/test_uk_terminal_gates.py | 11 +- .../tests/test_uk_tfc_routed_share.py | 106 ++ .../src/microcosm/data/contract.py | 12 +- .../microcosm-data/tests/test_contract.py | 8 +- .../parity/uk_spine/sources/fixture.json | 22 +- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- tools/fit_uk_childcare_takeup.py | 345 +++-- tools/generate_uk_target_references.py | 70 +- 54 files changed, 3367 insertions(+), 517 deletions(-) create mode 100644 changelog.d/uk-childcare-bus-targets-834-789.added.md create mode 100644 changelog.d/uk-childcare-fitter-834.changed.md create mode 100644 changelog.d/uk-tfc-routed-share-834.added.md create mode 100644 packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json create mode 100644 packages/microcosm-build/tests/fixtures/uk_bus05i_fy2025.json create mode 100644 packages/microcosm-build/tests/test_uk_bus_targets.py create mode 100644 packages/microcosm-build/tests/test_uk_childcare_targets.py create mode 100644 packages/microcosm-build/tests/test_uk_tfc_routed_share.py diff --git a/changelog.d/uk-childcare-bus-targets-834-789.added.md b/changelog.d/uk-childcare-bus-targets-834-789.added.md new file mode 100644 index 000000000..051722815 --- /dev/null +++ b/changelog.d/uk-childcare-bus-targets-834-789.added.md @@ -0,0 +1 @@ +Add five UK childcare calibration targets and two active England bus-finance targets, with six signed bus exclusions (#834, #789). diff --git a/changelog.d/uk-childcare-fitter-834.changed.md b/changelog.d/uk-childcare-fitter-834.changed.md new file mode 100644 index 000000000..0a70beac9 --- /dev/null +++ b/changelog.d/uk-childcare-fitter-834.changed.md @@ -0,0 +1 @@ +Rewrite the UK childcare take-up fitter to compile its five targets from the calibration contract and the pinned Chronicle feed, fit the four rates only with identity-keyed draws and the hours distribution frozen by adjudication, and record an explicit finite-difference step (`--eps`) in its provenance receipt (#834). diff --git a/changelog.d/uk-tfc-routed-share-834.added.md b/changelog.d/uk-tfc-routed-share-834.added.md new file mode 100644 index 000000000..364143cfa --- /dev/null +++ b/changelog.d/uk-tfc-routed-share-834.added.md @@ -0,0 +1 @@ +Add the HMRC-derived Tax-Free Childcare routed-spend share to the UK person spine and release contract (#834). diff --git a/experiments/834-childcare-tfc-receipts.md b/experiments/834-childcare-tfc-receipts.md index 0c30e6668..baecd9d77 100644 --- a/experiments/834-childcare-tfc-receipts.md +++ b/experiments/834-childcare-tfc-receipts.md @@ -84,10 +84,192 @@ arithmetic). No income, benefit or childcare input column moves. The childcare r ## Part C — column twin (L2), release round trip (L3), re-fit (L5), composition (L4) -Pending the Lane A/B increments. +### L4-pre — the I0 surface calibrated, before any childcare row exists + +Purpose: attribute the contract repair separately from the childcare targets. Input: the L1 +engine-only twin (2.94.0, no routed share); surface: the I0 commit's 408 references on feed +`6ae49d7d…`; solve: 1 500 epochs, `family_equal`, the packaged measure exclusions (364 targets in +the matrix); driver tree: a scratch worktree at the I0 commit (`l4pre-i0/`). + +| | value | +|---|---| +| initial → final loss | 0.374 → 0.0259 | +| within 10% / within 25% | 330 / 357 of 364 | +| ESS / max weight ratio / top-1% share | 5 733 / 10.0 / 0.189 | +| caseload `dwp.uc.households` (6 758 889) | −25.4% → **−12.7%** | +| 84 payment-band rows (2025 averages) | median 0.1%, max 3.6% | +| `hmrc.cgt.gains_total` (£127.3bn, TY2024) / `taxpayers_total` (584 000) | −50.1% → −0.6% / −38.9% → −0.2% | +| **`obr.capital_gains_tax` (£21.8bn, 2025-26)** | −27.6% → **+43.7%** | +| Scotland UC youngest child < 1 (14 333) | +8.5% → −0.2% | + +The terminal battery blocks on seven `uk_target_fit` cells: the four UC with-children cells +(single_with_children −34.0%, children_1 −25.8%, children_2 −39.7%, children_5_or_more −28.4%), +two state-pension SPI bands (+33.2%, +26.7%) — all signed on the publication stack's +`target_fit_reviewed_exclusions.json`, which main does not carry — and one new cell: +**OBR CGT receipts +43.7%.** The re-pin moved the two CGT totals from tax year 2023-24 (the +latest fact on the previous feed) to 2024-25 (HMRC's 2026 release, £127.3bn of gains against +£65.9bn a year earlier: the realisations brought forward ahead of the October 2024 rate rise). The +solve fits the 2024-25 gains to 0.6% and, at 2025-26 policy, the frame's CGT liability then +overshoots OBR's 2025-26 receipts line by 44% (it was −25% under with the 2023-24 gains). Neither +vintage of gains reproduces the OBR line; the choice is the CGT lane's (#467 / #725 / #552, #736 +"CGT 2025 level") and is put to María as A21. + +**Defect found and fixed here:** I0 had re-bound `dwp.uc.scotland_households_child_under_1` at +benefit-unit grain with a `region` filter; the calibration's measure provider has no categorical +household-to-benefit-unit broadcast (`compute_uk_measure_input` broadcasts categoricals to +persons only), so the run refused with `provider does not know benunit.region`. The row keeps +its household-grain binding (`household_conditions`, the pre-I0 form) with the tightened +selector and the family's calendar-year average; validated by this run. + +### L2 — column twin (I1 + I2 tree on `14c71008`, built at 2.94.0) + +Tree: the I0 commit plus the uncommitted Lane A/B increments (`TREE_HEAD`: `14c71008`, 46 files +changed); the same licensed inputs and the same `build_twin.sh` invocation as L1. Build: exit 0, +28 stages, rows 113 626 / 61 234 / 52 846, all 15 spine gates `passed` +(`l2-column-twin/l2-column.spine_gates.json`), engine 2.94.0. The new column is present from +`frs_person_draws` onward with nonzero share 1.0 (every person carries the build-year value; the +degenerate-column register carries its signed entry). + +**Payload against L1 (`compare_uk_h5_payload.py`, `l2_vs_l1_payload.json`)** — the only +between-twin difference is the new column and its consequences: + +| table | columns only in L2 | columns moved | rows moved | +|---|---|---|---| +| benunit | — | 0 / 11 | 0 | +| time_period | — | 0 | 0 | +| person | `tax_free_childcare_spend_routed_share` | 1 (`student_loan_balance`) | 64 (the `top_up_to_stock` selection; no cash column moves) | +| household | — | 38 / 66 | see below | + +The 38 household columns are exactly the imputed surfaces (WAS wealth, LCFS consumption, ETB +services) and their deterministic derivatives; no FRS-carried column moves. Root cause, proven +at engine level (`l2_vs_l1_net_income_decomposition.log`): the routed share lowers +`tax_free_childcare` for 1 414 households (unweighted £1.228m → £0.797m; the £2 000 cap binds for +some, hence 0.65 rather than 0.593), `hbai_household_net_income` moves for exactly those 1 414 +and for no others, and the three imputation stages read `household_net_income` / +`hbai_household_net_income` as predictors. Market income, income tax, National Insurance, +council tax, UC, child benefit, housing benefit, pension credit, student-loan repayments and CGT +are byte-equal between the twins. + +| stage | households re-drawn | of which TFC households | mechanism | +|---|---|---|---| +| `was_wealth` | 654 | 536 | predictor move → correlated-rank re-draw (the 686 E5 class); the remainder are threshold neighbours (owner share 0.89 vs 0.63 in the frame) | +| `lcfs_consumption` | 1 196 | 946 | as above, plus WAS-drawn predictors | +| `etb_services` | 1 027 | 768 | as above | +| `regional_property_uprating` | 31 084 (every owner) | — | deterministic: the regional owner mean re-solves once any owner draw moves; median relative move 3.2e-4 | +| LCFS energy IPF (`electricity`, `gas`, folded `domestic_energy_consumption`) | 52 586 | — | deterministic: the weighted IPF on income/tenure/accommodation/region margins re-solves for the whole frame; median relative move 6e-4 – 1.1e-3 | + +Aggregate mass per column (`l2_vs_l1_household_magnitudes.json`, unweighted column totals): +largest moves `bus_fare_spending` +0.89%, `education_consumption` +0.72%, `diesel_spending` ++0.54%, `rail_usage`/`rail_subsidy_spending` −0.37%; every other column within ±0.2%, the energy +trio and the property pair within ±1.2e-4. On the release payload these feed back into +`household_tax` (VAT for 1 342 households, fuel duty for 453, and a sub-£1 energy-tax ripple on +40 491) and `household_benefits` (the 1 414 TFC households plus the in-kind ETB columns); net +household income moves by −£0.27m unweighted across the frame. + +Classification for the swap register: **net-new person column + engine-predictor re-draw of the +imputed household surfaces**, the same class the L1 twin showed against spine-n under the engine +bump, with a smaller footprint (1 414 root households against a frame-wide net-income shift). +No cash column, weight column or benefit-unit column moves. + +### L3 — release round trip (L2 read by policyengine-uk 2.94.0) + +`l0_childcare_receipt.py` on `l2-column.h5` (`l3_l2_column_childcare_receipt.json`): the engine +reads `tax_free_childcare_spend_routed_share` at 0.593 (float32) for every person at both 2024 +and 2025 — the 2024-04-01 contract value, as the build-year lock requires. Against the same five +facts as L0/L1 (model ÷ target, weights as built, before any calibration): + +| target (basis) | L0 = L1 | L3 | +|---|---|---| +| TFC top-up £ (FY2024-25 / FY2025-26) | 1.073 / 1.174 | **0.698 / 0.772** | +| TFC children with used accounts | 1.020 / 0.951 | 1.020 / 0.951 | +| extended entitlement children 2–4, England (Jan 2024 / Jan 2025) | 1.283 / 1.261 | 1.283 / 1.261 | +| targeted 2-year-olds, England | 0.596 / 0.738 | 0.596 / 0.738 | +| universal-only 3–4s, England | 1.104 / 1.177 | 1.104 / 1.177 | + +Only the spend row moves, by the routed share (×0.65 on the top-up, the cap binding for part of +the population) — the four count rows are identical to L0 to three decimals, which is the +"routed share touches spend, not eligibility or take-up" property the issue describes. The L0 +spend ratio of 1.07 was the un-routed accident that #472 corrected; the re-fit at L5 works from +the routed 0.70. + +### L5 — re-fit of the four take-up rates (A6: 2024 base, hours frozen) + +`tools/fit_uk_childcare_takeup.py` on `l2-column.h5` (sha `2c69544b…`), feed `6ae49d7d…`, +`--target-period 2024`, `--vintage-override dfe.funded_childcare.working_parent_children_2_to_4=2025` +(the Jan-2024 2-year-old cell is suppressed; Part E), seed 42, engine 2.94.0, routed share 0.593 +injected from the contract, hours distribution frozen (15.019 / 4.972 / [0, 30]). Targets as +compiled: £632.2m, 1 085 020, 621 482, 115 852, 416 537. + +**First run (`fit_2024.json`, defaults: L-BFGS-B, maxiter 5, eps 1e-2): did not converge** +(`success: false`, loss 0.302). TFC 0.88 → 0.959, extended 0.812 → 0.559, universal 0.563 → +0.447, targeted **0.597 → 0.597 (never moved)**; achieved ÷ target: TFC spend 0.785, TFC +children 1.104, extended 0.943, targeted 0.508, universal 0.984. + +Diagnosis (`l5-refit/runner_probe.log`, the fitter's own runner on the same H5): + +| probe | result | +|---|---| +| stored build draws, no injection | targeted 69 050 (0.596×) from **94 flagged sample children**; 1 290 two-year-olds in the frame, 94 with a positive entitlement | +| runner at the frozen rates, seed 42 / seed 0 | targeted 54 889 / 62 521 (0.47× / 0.54×) — the realisation noise of a ~157-child eligible base carrying £-weights of hundreds each | +| targeted rate 0.597 → 0.607 (the optimizer's step) | **identical count** (54 889): a 0.01 step flips no unit at this base, so the forward difference reads zero and L-BFGS-B never moves the parameter | +| targeted rate 0.697 / 0.90 | 66 101 / 88 036 — the row responds, but even at 0.90 it reaches 0.76× | + +So the targeted row is (i) below the draw resolution of a 1e-2 finite-difference step and (ii) +near its reachable ceiling at design weights: the eligible base — England, a qualifying benefit +or UC/TC criterion, **and not extended-eligible** (the engine's mutual exclusion; extended now +covers working-parent 2-year-olds) — is ~157 sample children, and a rate of 1.0 lands at roughly +0.85–1.0× on the build's realisation. That is a frame/rules property the calibration weights +absorb (the publication-stack solve, L4), not something a take-up scalar reaches; uk-data's own +release sits at 0.78× on the same row. The TFC pair is the routed-share tension the issue +predicted: with spend routed at 0.593, the least-squares compromise pushes the TFC rate to ~0.96 +(children +10%, spend −21%) because the frame's spend per child is below HMRC's. + +The fitter gains an `--eps` flag (default unchanged at 1e-2, recorded in the receipt) so the +step can exceed the smallest eligible base's resolution; the fitter's draws are its own +identity-keyed realisation (seed 42 by default; seed 0 does not reproduce the build's stage +draws either), so a fitted rate is a population parameter and the build's flip set differs by +sampling noise — for targeted, ±10–20% at this base. The exact fix — an expected-count objective +(rate × weight over the rules-eligible base, no draw) with an analytic gradient — is a fitter +redesign outside this PR and is filed as a follow-up. + +**Second run (`fit_2024_eps05.json`: maxiter 10, eps 0.05):** pending. ## Part D — bus (#789) E9's Part D (`experiments/685-net-new-stages-receipts.md`) is the sizing evidence: at design weights England fares 0.56× BUS05ai and net support 0.71× BUS05bi; London 0.28×; England outside London 0.74× / 0.97×; the LCFS fare gradient runs against NTS0705a (#790's disposition). + +Re-measured on the L2 column twin against the FY2025 facts the two active rows bind +(`l2_bus_design_weight_receipt.json`, design weights, `region` ≠ Scotland/Wales/NI as England): + +| row | fact (FY2025, £bn) | L2 twin at design weights | ratio | +|---|---|---|---| +| `dft.bus_fare_receipts.england` (active) | 3.417 | 1.945 | 0.569 | +| `dft.bus_net_support.england` (active) | 3.025 | 2.153 | 0.712 | +| London fares (held, `region == LONDON`) | 1.347 | 0.372 | 0.276 | +| outside-London fares (held) | 2.070 | 1.573 | 0.760 | +| outside-London net support (held) | 1.895 | 1.836 | 0.969 | + +The frame reproduces E9's shape to the second decimal, so the routed share and the re-pin +leave the bus surface where E9 measured it: the England rows go to the solver at 0.57× / 0.71×, +which is the #790 gradient question (London's 0.28× against outside-London's 0.76× is the LCFS +fare gradient, not a weighting residual) and the reason the London / outside-London rows are +declared with their model-side filters but signed-excluded rather than bound. The feed carries +no UK-level fare or support fact (BUS05i is England-only), so the `.uk` rows stay signed-excluded +on that ground. + +## Part E — the childcare rows at both bases (declared once, resolved by period) + +Compiled from the pinned feed with the committed declarations (`compile_ledger_target_references`), +restamped at each target period — the rule A1 ruled: + +| row | at 2024 (fitter basis) | at 2025 (calibration basis) | +|---|---|---| +| `hmrc.tfc.government_top_up` | £632.2m (FY2024-25) | £599.8m (FY2025-26) | +| `hmrc.tfc.children_with_used_accounts` | 1 085 020 | 1 151 515 | +| `dfe.funded_childcare.working_parent_children_2_to_4` | refuses: DfE suppresses the Jan-2024 2-year-old cell, the sum's cardinality guard reports one member of two (the fitter uses its Jan-2025 vintage override) | 621 482 (Jan-2025, 2 members) | +| `dfe.funded_childcare.early_learning_2_year_olds` | 115 852 (Jan-2024) | 95 031 (Jan-2025) | +| `dfe.funded_childcare.universal_only_children` | 416 537 (Jan-2024, `difference` of 2) | 396 965 (Jan-2025) | + +The 2024 column is the #834 contract as written; the 2025 column is what the calibration binds. diff --git a/packages/microcosm-build/src/microcosm/build/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/ledger_targets.py index 83bca9306..fe0391e59 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_targets.py @@ -23,12 +23,21 @@ ALLOWED_ASSERTION_POLICIES = frozenset(("observed_only", "allow_source_projection")) ALLOWED_PERIOD_MATCH_POLICIES = frozenset(("latest_not_after", "exact")) ALLOWED_VALUE_OPERATIONS = frozenset( - ("identity", "sum", "calendar_year_average", "latest_plateau", "count_x_mean") + ( + "identity", + "sum", + "difference", + "calendar_year_average", + "latest_plateau", + "count_x_mean", + ) ) MULTI_FACT_VALUE_OPERATIONS = frozenset( - ("sum", "calendar_year_average", "latest_plateau", "count_x_mean") + ("sum", "difference", "calendar_year_average", "latest_plateau", "count_x_mean") +) +EXACT_PERIOD_VALUE_OPERATIONS = frozenset( + ("identity", "sum", "difference", "count_x_mean") ) -EXACT_PERIOD_VALUE_OPERATIONS = frozenset(("identity", "sum", "count_x_mean")) DEFAULT_HIERARCHY_MATCH_SPEC_FIELDS = ("entity", "period", "family", "filter") @@ -71,6 +80,8 @@ class LedgerTargetReference: ledger_source_record_id: str = "" ledger_selector: Mapping[str, object] = field(default_factory=dict) value_operation: str = "identity" + value_operands: tuple[Mapping[str, object], ...] = () + expected_member_count: int | None = None entity: str = "" measure: str | None = None filter: str | None = None @@ -111,6 +122,22 @@ def __post_init__(self) -> None: f"LedgerTargetReference {self.name!r}: ledger_selector must be a " f"mapping, got {type(self.ledger_selector).__name__}." ) + if self.expected_member_count is not None and ( + isinstance(self.expected_member_count, bool) + or not isinstance(self.expected_member_count, int) + or self.expected_member_count <= 0 + ): + raise ValueError( + f"LedgerTargetReference {self.name!r}: expected_member_count " + "must be a positive integer." + ) + if self.value_operation == "difference": + roles = [str(operand.get("role")) for operand in self.value_operands] + if roles != ["minuend", "subtrahend"]: + raise ValueError( + f"LedgerTargetReference {self.name!r}: difference requires " + "exactly ordered minuend/subtrahend operands." + ) if self.assertion_policy not in ALLOWED_ASSERTION_POLICIES: raise ValueError( f"LedgerTargetReference {self.name!r}: unsupported " @@ -590,6 +617,13 @@ def target_spec_from_ledger_reference( numeric_value = numeric_values[0] * numeric_values[1] elif reference.value_operation == "sum": numeric_value = sum(numeric_values) + elif reference.value_operation == "difference": + numeric_value = numeric_values[0] - numeric_values[1] + if not math.isfinite(numeric_value) or numeric_value < 0: + raise ValueError( + f"Ledger target reference {reference.name!r}: difference " + f"produced invalid value {numeric_value!r}." + ) else: numeric_value = numeric_values[0] representative_fact = _value_representative_fact( @@ -948,6 +982,8 @@ def _resolve_reference_fact( 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 == "difference" and eligible_matches: + return _resolve_difference_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 @@ -1020,6 +1056,15 @@ def _resolve_sum_reference_facts( if period_key == latest_period for fact in facts ] + if ( + reference.expected_member_count is not None + and len(latest_matches) != reference.expected_member_count + ): + raise ValueError( + f"Ledger target reference {reference.name!r}: value_operation=sum " + f"expected {reference.expected_member_count} members at the latest " + f"period but resolved {len(latest_matches)}; a declared member is missing." + ) return tuple( sorted( latest_matches, @@ -1028,6 +1073,54 @@ def _resolve_sum_reference_facts( ) +def _resolve_difference_reference_facts( + reference: LedgerTargetReference, + eligible_matches: list[object], +) -> tuple[object, ...]: + resolved: list[object] = [] + for operand in reference.value_operands: + dimensions = operand.get("dimension_values") + if not isinstance(dimensions, Mapping): + raise ValueError( + f"Ledger target reference {reference.name!r}: difference operand " + "requires dimension_values." + ) + shared_dimensions = reference.ledger_selector.get("dimension_values") + selector = { + **dict(reference.ledger_selector), + **{ + str(key): value + for key, value in operand.items() + if key not in {"role", "dimension_values"} + }, + "dimension_values": { + **( + dict(shared_dimensions) + if isinstance(shared_dimensions, Mapping) + else {} + ), + **dict(dimensions), + }, + } + matches = [ + fact for fact in eligible_matches if _fact_matches_selector(fact, selector) + ] + match = _latest_period_selector_match(reference, matches) + if match is None: + raise ValueError( + f"Ledger target reference {reference.name!r}: difference operand " + f"{operand.get('role')!r} did not resolve exactly once." + ) + resolved.append(match) + periods = {_period_key(fact) for fact in resolved} + if len(periods) != 1: + raise ValueError( + f"Ledger target reference {reference.name!r}: difference operands " + "must resolve at the same latest period." + ) + return tuple(resolved) + + def _resolve_calendar_year_average_reference_facts( reference: LedgerTargetReference, eligible_matches: list[object], @@ -1292,6 +1385,13 @@ def _validate_resolved_reference_fact( f"vintage {vintage_pin!r}, but resolved fact has vintage " f"{_at(fact, 'geography', 'vintage')!r}." ) + entity_pin = reference.ledger_selector.get("entity_name") + if entity_pin is not None and _str_at(fact, "entity", "name") != entity_pin: + raise ValueError( + f"Ledger target reference {reference.name!r} requires entity_name " + f"{entity_pin!r}, but resolved fact has entity " + f"{_at(fact, 'entity', 'name')!r}." + ) def _validate_reference_period(fact: object, reference: LedgerTargetReference) -> None: @@ -1333,7 +1433,9 @@ def _latest_period_selector_match( reference: LedgerTargetReference, matches: list[object], ) -> object | None: - if len(matches) < 2: + if len(matches) == 1: + return matches[0] + if not matches: return None semantic_keys = {_selector_period_invariant_key(fact) for fact in matches} if len(semantic_keys) != 1: @@ -1409,6 +1511,8 @@ def _is_period_fragment(value: str) -> bool: normalized = value.lower().replace("-", "_") if _is_period_token(normalized): return True + if normalized.startswith("year") and _is_period_token(normalized[4:]): + return True month_names = ( "jan", "january", @@ -1641,6 +1745,8 @@ def _reference_metadata(reference: LedgerTargetReference) -> dict[str, str]: metadata["ledger_value_operation"] = reference.value_operation metadata["ledger_assertion_policy"] = reference.assertion_policy metadata["ledger_period_match_policy"] = reference.period_match_policy + if reference.value_operation == "difference": + metadata["ledger_value_formula"] = "minuend - subtrahend" for key, value in sorted(reference.ledger_selector.items()): if isinstance(value, Mapping): continue diff --git a/packages/microcosm-build/src/microcosm/build/source_manifest.py b/packages/microcosm-build/src/microcosm/build/source_manifest.py index e7681bdbe..21f450da5 100644 --- a/packages/microcosm-build/src/microcosm/build/source_manifest.py +++ b/packages/microcosm-build/src/microcosm/build/source_manifest.py @@ -47,6 +47,7 @@ "assign_binary_from_rate", "assign_binary_with_anchored_residual", "assign_clipped_normal", + "assign_period_constant", "assign_student_loan_plan_cohorts", "assign_uniform_draw", "aggregate_person_to_benunit", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index aa43f8ec7..8b92992c9 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -5759,6 +5759,34 @@ } } }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "output", + "contract_key", + "period_source", + "dtype" + ], + "properties": { + "kind": { + "const": "assign_period_constant" + }, + "output": { + "type": "string" + }, + "contract_key": { + "type": "string" + }, + "period_source": { + "const": "build_year" + }, + "dtype": { + "const": "float64" + } + } + }, { "type": "object", "additionalProperties": false, diff --git a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py index 64543c053..868584e80 100644 --- a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py +++ b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py @@ -55,6 +55,9 @@ class TargetReferenceAuthoringConfig: selector_pins_by_target_id: Mapping[str, Mapping[str, Any]] = field( default_factory=dict ) + reference_metadata_by_target_id: Mapping[str, Mapping[str, str]] = 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 = "" @@ -435,6 +438,7 @@ def target_references_resource( "allowed_value_operations": [ "identity", "sum", + "difference", "calendar_year_average", "latest_plateau", "count_x_mean", @@ -725,6 +729,7 @@ def _reference_row( "metadata": { "contract_target_id": target_id, "measure_kind": "prepared_column", + **dict(config.reference_metadata_by_target_id.get(target_id, {})), }, } assertion_policy = target.get("assertion_policy") @@ -735,6 +740,19 @@ def _reference_row( value_operation = "sum" if value_operation is not None and value_operation != "identity": row["value_operation"] = value_operation + operands = target.get("value_operands") + if operands is not None: + row["value_operands"] = operands + dimension_values = selector.get("dimension_values") + if value_operation == "sum" and isinstance(dimension_values, Mapping): + member_count = 1 + has_list = False + for value in dimension_values.values(): + if isinstance(value, list): + has_list = True + member_count *= len(value) + if has_list: + row["expected_member_count"] = member_count return row 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 7fdc2720a..f5a766850 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/country_package.json +++ b/packages/microcosm-build/src/microcosm/build/uk/country_package.json @@ -177,6 +177,11 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "target_reference_signed_exclusions.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "input_mass_reviewed_exclusions.json", "kind": "legacy_json", diff --git a/packages/microcosm-build/src/microcosm/build/uk/degenerate_reviewed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/degenerate_reviewed_exclusions.json index 26e356543..6ddd4fc6e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/degenerate_reviewed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/degenerate_reviewed_exclusions.json @@ -8,6 +8,13 @@ "adjudication": "microcosm#630", "approved_on": "2026-08-10", "expires_on": "2027-02-10" + }, + "person.tax_free_childcare_spend_routed_share": { + "reason": "Constant by construction: the published FY mean of an HMRC account-activity proxy assigned without an invented distribution (uk-data #473 judgement, microcosm#834); not signal.", + "approved_by": "juaristi22", + "adjudication": "microcosm#834", + "approved_on": "2026-09-05", + "expires_on": "2027-03-05" } } } diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index efb84c369..3844e506a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -629,6 +629,7 @@ "person.sic_industry_division", "person.student_loan_balance", "person.student_loan_plan", + "person.tax_free_childcare_spend_routed_share", "person.would_claim_marriage_allowance", "person.would_claim_scp" ], 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 3bfe535bc..95d9a7109 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 408, + "compiled_count": 415, "counts_by_kind": { "calibration_drift": 172, "fixture_only": 267, - "ledger_only": 38 + "ledger_only": 45 }, - "difference_count": 477, + "difference_count": 484, "differences": [ { "fixture_value": 1608000.0, @@ -1876,6 +1876,41 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 95031.0, + "name": "dfe.funded_childcare.early_learning_2_year_olds", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 396965.0, + "name": "dfe.funded_childcare.universal_only_children", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 621482.0, + "name": "dfe.funded_childcare.working_parent_children_2_to_4", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3417388656.43538, + "name": "dft.bus_fare_receipts.england", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3024904320.8399997, + "name": "dft.bus_net_support.england", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 597920.0, @@ -2002,6 +2037,20 @@ "period": 2025, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 1151515.0, + "name": "hmrc.tfc.children_with_used_accounts", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 599800000.0, + "name": "hmrc.tfc.government_top_up", + "period": 2025, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 7553013.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json index a34a5e228..80039a988 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 217, + "compiled_count": 222, "counts_by_kind": { "calibration_drift": 12, "fixture_only": 125, - "ledger_only": 193 + "ledger_only": 198 }, - "difference_count": 330, + "difference_count": 335, "differences": [ { "fixture_value": 82000.0, @@ -882,6 +882,34 @@ "period": 2023, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 124211.0, + "name": "dfe.funded_childcare.early_learning_2_year_olds", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 437147.0, + "name": "dfe.funded_childcare.universal_only_children", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3105254075.49544, + "name": "dft.bus_fare_receipts.england", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 2247884765.6, + "name": "dft.bus_net_support.england", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 69861000000.0, @@ -896,6 +924,13 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 624500000.0, + "name": "hmrc.tfc.government_top_up", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 222000.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json b/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json index ee618142e..5023d8607 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_target_references.json @@ -4,6 +4,7 @@ "allowed_value_operations": [ "identity", "sum", + "difference", "calendar_year_average", "latest_plateau", "count_x_mean" diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index a763725ee..e8a531c25 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -473,7 +473,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2025, Table 2.1a", "survey": "HMRC Capital Gains Tax statistics Table 2.1a and Advani-Summers capital-gains incidence" @@ -496,7 +496,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -525,7 +525,7 @@ "required_mass_change_reason": "E5 source-stage transform preserves household rows and typed household weights; total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -545,7 +545,7 @@ "required_mass_change_reason": "E5 source-stage transform preserves household rows and typed household weights; total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -576,7 +576,7 @@ "superseded_by": { "reason": "The FRS spine build executes hmrc_cgt_gains_spine, which applies the same HMRC Table 3 amounts redraw directly in source_stages.json before calibration.", "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "stage": "hmrc_cgt_gains_spine" } }, @@ -596,7 +596,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024" @@ -610,7 +610,7 @@ "base_candidate_tier": "frs", "calibration_permitted": false, "canonical_source_manifest": "source_stages.json", - "canonical_source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "canonical_source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "effective_mass_requirements": { "charitable_investment_gifts": { "mass_share_denominator": "all_person_effective_mass", @@ -693,7 +693,7 @@ "superseded_by": { "reason": "The FRS spine build executes hmrc_spi_income_spine, which supersedes the June retained-leaves/hmrc_spi_income pair inside source_stages.json.", "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "stage": "hmrc_spi_income_spine" } }, @@ -727,7 +727,7 @@ "required_mass_change_reason": "E5 source-stage transform preserves household rows and typed household weights; total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs, NEED 2023 headline energy tables, Ofgem Q2 2026 unit rates, and WAS round-8 bridge donor.", "survey": "Living Costs and Food Survey 2023-24" @@ -748,7 +748,7 @@ "property_wealth" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -772,7 +772,7 @@ "employee_pension_contributions" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -794,7 +794,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -829,7 +829,7 @@ "required_mass_change_reason": "E5 source-stage transform preserves household rows and typed household weights; total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "214de0aca954786bf819b2e664dd96585de5c17dcd51b61fdac7d9833cd18ad7", + "source_manifest_sha256": "05ccf7a780a48af62817a7d4922c4229b82a470951075f90811d40ab5d5cdb18", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index f39c6f437..52b06e46a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -362,50 +362,50 @@ "grain": "person", "artifacts": [ { - "format": "json", + "role": "age_tail_band_populations", "kind": "public_aggregate_reference", "resource": "ons_age_tail_band_populations.json", - "role": "age_tail_band_populations", + "format": "json", "runtime_sha256_required": true } ], "operations": [ { + "kind": "disaggregate_top_coded_ages", + "output": "age", + "resource": "ons_age_tail_band_populations.json", + "top_code": 80, "bands": [ { - "low": 80, "name": "80_84", + "low": 80, "width": 5 }, { - "low": 85, "name": "85_89", + "low": 85, "width": 5 }, { - "low": 90, "name": "90_plus", + "low": 90, "width": 8 } ], + "seed": 0, "draw_key": "person_id", - "kind": "disaggregate_top_coded_ages", - "output": "age", - "reason": "Age disaggregation rewrites an existing person column in place; no rows move, no weights change, and total household mass is conserved.", - "resource": "ons_age_tail_band_populations.json", "salt_streams": [ "band", "within" ], - "seed": 0, - "top_code": 80 + "reason": "Age disaggregation rewrites an existing person column in place; no rows move, no weights change, and total household mass is conserved." } ], "outputs": [], - "notes": "The licensed FRS records no age above 80, so every 80+ person arrives piled at exactly 80 and the 85-89 and 90+ population targets are structurally unbindable; the incumbent shares the defect. Each piled base person draws a band from the sex-specific ONS inverse CDF and a uniform integer age within it, keyed on person_id. Runs immediately after frs_spine, before every stage that conditions on age, so all age-conditioned imputations derive from the disaggregated surface. The stage precedes person_source_id provenance; later support and capital-gains clones copy the donor's rewritten age, preserving the #623 final-age identity invariant. Ages are assigned toward the ONS distribution; calibration still owns the totals.", "rewrites": [ "age" - ] + ], + "notes": "The licensed FRS records no age above 80, so every 80+ person arrives piled at exactly 80 and the 85-89 and 90+ population targets are structurally unbindable; the incumbent shares the defect. Each piled base person draws a band from the sex-specific ONS inverse CDF and a uniform integer age within it, keyed on person_id. Runs immediately after frs_spine, before every stage that conditions on age, so all age-conditioned imputations derive from the disaggregated surface. The stage precedes person_source_id provenance; later support and capital-gains clones copy the donor's rewritten age, preserving the #623 final-age identity invariant. Ages are assigned toward the ONS distribution; calibration still owns the totals." }, { "stage": "frs_employment", @@ -792,7 +792,14 @@ "survey": "Family Resources Survey 2024-25", "source": "Sourced UK take-up contract rates and identity-keyed deterministic draws.", "grain": "person", - "artifacts": [], + "artifacts": [ + { + "role": "stochastic_contract", + "resource": "take_up_contract.json", + "kind": "public_aggregate_reference", + "format": "json" + } + ], "operations": [ { "kind": "assign_binary_from_rate", @@ -821,15 +828,24 @@ "kind": "assign_uniform_draw", "output": "attends_private_school_random_draw", "seed": 0 + }, + { + "kind": "assign_period_constant", + "output": "tax_free_childcare_spend_routed_share", + "contract_key": "tax_free_childcare_spend_routed_share", + "period_source": "build_year", + "dtype": "float64" } ], "outputs": [ "would_claim_marriage_allowance", "would_claim_scp", - "attends_private_school_random_draw" + "attends_private_school_random_draw", + "tax_free_childcare_spend_routed_share" ], "nonnegative_outputs": [ - "attends_private_school_random_draw" + "attends_private_school_random_draw", + "tax_free_childcare_spend_routed_share" ], "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; higher_earner_tie_break is intentionally not produced." }, @@ -2040,8 +2056,8 @@ "require_all_predictors": true, "require_all_outputs": true, "initialize_frs_channel_columns": { - "gift_aid": 0, - "charitable_investment_gifts": 0 + "gift_aid": 0.0, + "charitable_investment_gifts": 0.0 }, "n_estimators": 100, "seed": 42 @@ -2474,46 +2490,47 @@ "notes": "Runs the SPI-trained income QRFs on the raw-spine support channel, initializes FRS charity columns to zero, trains FRS-only stage 2 before redrawing base-channel dividends, and emits a sidecar-only 208-fact replay report for the spine path." }, { - "artifacts": [], + "stage": "uc_reporter_redraw", + "survey": "Family Resources Survey 2024-25", + "source": "Family Resources Survey 2024-25 reported Universal Credit amounts, conditioned on benefit-unit composition and post-SPI incomes with PolicyEngine-UK eligibility inputs.", "grain": "benunit", - "notes": "Runs after the person-grain SPI income chain and before UC capital coherence. One temporary engine simulation screens both FRS and SPI benefit units to a positive pre-take-up award using FRS-carried capital AND at least one non-child member (uc_maximum_amount pays qualifying-young-person-only units mechanically), and materializes the UC child and state-pension-age flags; engine-known values are consumed only. A benefit-unit RegimeGatedQRF fitted on the screened base domain draws the screened SPI domain (rows); the rewrite domain (rewrite_rows) is the whole SPI channel, so screen-failing SPI units are zeroed. Each positive amount lands on one deterministic adult claimant; base-FRS rows remain byte-unchanged; an empty screened SPI domain refuses.", + "artifacts": [], "operations": [ { + "kind": "derive", "derived": { - "claimable_screen": "positive_pre_takeup_uc_award AND has_non_child_member", - "has_non_child_member": "any(NOT is_child_or_qualifying_young_person_for_universal_credit) over benefit-unit members", + "uc_reported_capital": "frs_benunit_capital", "positive_pre_takeup_uc_award": "max(0, uc_maximum_amount - uc_income_reduction) > 0", - "uc_reported_capital": "frs_benunit_capital" - }, - "kind": "derive" + "has_non_child_member": "any(NOT is_child_or_qualifying_young_person_for_universal_credit) over benefit-unit members", + "claimable_screen": "positive_pre_takeup_uc_award AND has_non_child_member" + } }, { - "consumed_only": true, "kind": "materialize_rules_engine_predictors", "predictors": [ "uc_maximum_amount", "uc_income_reduction", "is_child_or_qualifying_young_person_for_universal_credit", "is_SP_age" - ] + ], + "consumed_only": true }, { + "kind": "aggregate_person_to_benunit", + "method": "sum", + "consumed_only": true, "aggregates": { "uc_child_count": "is_child_or_qualifying_young_person_for_universal_credit", "universal_credit_reported_amount": "universal_credit_reported" - }, - "consumed_only": true, - "kind": "aggregate_person_to_benunit", - "method": "sum" + } }, { - "categorical_predictors": [ - "region" - ], - "fit": "regime_gated_qrf", "kind": "redraw_spi_reported_uc", - "landing": "eldest_working_age_adult_lowest_person_id", "output": "universal_credit_reported", + "training_rows": "base_frs_channel_not_capital_gains_clone_support_clone_0_screened", + "rows": "spi_channel_screened", + "rewrite_rows": "spi_channel", + "screen": "claimable_screen", "predictors": [ "is_married", "uc_child_band", @@ -2525,22 +2542,21 @@ "claimant_age", "region" ], - "rewrite_rows": "spi_channel", - "rows": "spi_channel_screened", - "screen": "claimable_screen", - "seed": 44, + "categorical_predictors": [ + "region" + ], "target": "universal_credit_reported_amount", - "training_rows": "base_frs_channel_not_capital_gains_clone_support_clone_0_screened", - "weight_mapping": "household_to_benunit" + "weight_mapping": "household_to_benunit", + "fit": "regime_gated_qrf", + "landing": "eldest_working_age_adult_lowest_person_id", + "seed": 44 } ], "outputs": [], "rewrites": [ "universal_credit_reported" ], - "source": "Family Resources Survey 2024-25 reported Universal Credit amounts, conditioned on benefit-unit composition and post-SPI incomes with PolicyEngine-UK eligibility inputs.", - "stage": "uc_reporter_redraw", - "survey": "Family Resources Survey 2024-25" + "notes": "Runs after the person-grain SPI income chain and before UC capital coherence. One temporary engine simulation screens both FRS and SPI benefit units to a positive pre-take-up award using FRS-carried capital AND at least one non-child member (uc_maximum_amount pays qualifying-young-person-only units mechanically), and materializes the UC child and state-pension-age flags; engine-known values are consumed only. A benefit-unit RegimeGatedQRF fitted on the screened base domain draws the screened SPI domain (rows); the rewrite domain (rewrite_rows) is the whole SPI channel, so screen-failing SPI units are zeroed. Each positive amount lands on one deterministic adult claimant; base-FRS rows remain byte-unchanged; an empty screened SPI domain refuses." }, { "stage": "uc_capital_coherence", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 81c973a05..bd70eb0ab 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -640,7 +640,11 @@ stages: survey: Family Resources Survey 2024-25 source: Sourced UK take-up contract rates and identity-keyed deterministic draws. grain: person - artifacts: [] + artifacts: + - role: stochastic_contract + resource: take_up_contract.json + kind: public_aggregate_reference + format: json operations: - kind: assign_binary_from_rate output: would_claim_marriage_allowance @@ -659,12 +663,19 @@ stages: - kind: assign_uniform_draw output: attends_private_school_random_draw seed: 0 + - kind: assign_period_constant + output: tax_free_childcare_spend_routed_share + contract_key: tax_free_childcare_spend_routed_share + period_source: build_year + dtype: float64 outputs: - would_claim_marriage_allowance - would_claim_scp - attends_private_school_random_draw + - tax_free_childcare_spend_routed_share nonnegative_outputs: - attends_private_school_random_draw + - tax_free_childcare_spend_routed_share notes: Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; higher_earner_tie_break is intentionally not produced. - stage: frs_household_draws survey: Family Resources Survey 2024-25 diff --git a/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json index 16c3365f4..18e3bac54 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json @@ -215,7 +215,7 @@ ] }, "expectation": "column_differs", - "magnitude_evidence": "The incumbent's state-education column is degenerate and the spine's is not, which makes this a defect fix on the incumbent side rather than a method preference. Measured on the ETB services stage's own cleaned donor frame \u2014 SN 8856, year 2023, complete cases on the thirteen-column services subset, 4,199 rows, weighted by hhold_adj_weight \u2014 dfe_education_spending has a donor share of 0.2794 weighted (0.2546 unweighted, which reproduces the E6 acceptance receipt's figure exactly) and a donor population mean of GBP 3,461 per household. The incumbent carries 14 nonzero households out of 52,846, a share of 0.000265 and a population mean of GBP 2 per household; the spine carries 11,934, a share of 0.2258 and GBP 3,111, or 0.90x the donor. bus_subsidy_spending moves the same way: donor share 0.5255 weighted and GBP 87 per household, against incumbent 0.3167 and GBP 113 (1.30x) and ours 0.5554 and GBP 89 (1.02x). The spine is closer on both the share and the level of both columns. This resolves the ETB weight-basis question that was previously recorded as blocking these rows: the stage's convention is the household grossing weight, and the verdict holds on either basis.", + "magnitude_evidence": "The incumbent's state-education column is degenerate and the spine's is not, which makes this a defect fix on the incumbent side rather than a method preference. Measured on the ETB services stage's own cleaned donor frame — SN 8856, year 2023, complete cases on the thirteen-column services subset, 4,199 rows, weighted by hhold_adj_weight — dfe_education_spending has a donor share of 0.2794 weighted (0.2546 unweighted, which reproduces the E6 acceptance receipt's figure exactly) and a donor population mean of GBP 3,461 per household. The incumbent carries 14 nonzero households out of 52,846, a share of 0.000265 and a population mean of GBP 2 per household; the spine carries 11,934, a share of 0.2258 and GBP 3,111, or 0.90x the donor. bus_subsidy_spending moves the same way: donor share 0.5255 weighted and GBP 87 per household, against incumbent 0.3167 and GBP 113 (1.30x) and ours 0.5554 and GBP 89 (1.02x). The spine is closer on both the share and the level of both columns. This resolves the ETB weight-basis question that was previously recorded as blocking these rows: the stage's convention is the household grossing weight, and the verdict holds on either basis.", "evidence": "experiments/686-uk-spine-comparison-ledger.md#etb--the-weight-basis-question-is-closed", "adjudicator": "juaristi22", "adjudicated_on": "2026-08-24", @@ -252,7 +252,7 @@ ] }, "expectation": "column_differs", - "magnitude_evidence": "Carries forward the E5 adjudication of 2026-08-19 \u2014 that the wealth stage is not required to reproduce the incumbent's inflated totals \u2014 now scoped to the five household columns that actually diverge beyond the band, and re-measured against WAS Round 8 on the stage's own cleaning of the pinned tab (15,128 rows, weighted by R8xshhwgt). The spine is closer than the incumbent on all five survey-weighted donor shares: savings donor 0.6072 against incumbent 0.6620 and ours 0.6107; other_residential_property_value donor 0.0363 against 0.0763 and 0.0367; property_wealth donor 0.6433 against 0.7081 and 0.6607; main_residence_value donor 0.6236 against 0.6747 and 0.6356; corporate_wealth donor 0.7629 against 0.8222 and 0.7792. The level evidence behind the original adjudication reproduces and is the more dramatic surface: population mean per household runs 5.66x the donor for the incumbent's savings against 1.97x for ours, and 6.12x against 1.26x for other residential property. main_residence_value is the one column where the incumbent's level is closer, at 1.02x against our 0.88x. Note that the unweighted donor shares tell the opposite story on incidence, because WAS oversamples wealth-holders by design; the weighted basis is the population one and is the basis quoted here throughout.", + "magnitude_evidence": "Carries forward the E5 adjudication of 2026-08-19 — that the wealth stage is not required to reproduce the incumbent's inflated totals — now scoped to the five household columns that actually diverge beyond the band, and re-measured against WAS Round 8 on the stage's own cleaning of the pinned tab (15,128 rows, weighted by R8xshhwgt). The spine is closer than the incumbent on all five survey-weighted donor shares: savings donor 0.6072 against incumbent 0.6620 and ours 0.6107; other_residential_property_value donor 0.0363 against 0.0763 and 0.0367; property_wealth donor 0.6433 against 0.7081 and 0.6607; main_residence_value donor 0.6236 against 0.6747 and 0.6356; corporate_wealth donor 0.7629 against 0.8222 and 0.7792. The level evidence behind the original adjudication reproduces and is the more dramatic surface: population mean per household runs 5.66x the donor for the incumbent's savings against 1.97x for ours, and 6.12x against 1.26x for other residential property. main_residence_value is the one column where the incumbent's level is closer, at 1.02x against our 0.88x. Note that the unweighted donor shares tell the opposite story on incidence, because WAS oversamples wealth-holders by design; the weighted basis is the population one and is the basis quoted here throughout.", "evidence": "experiments/686-uk-spine-comparison-ledger.md#e5--wealth--signed-carried-forward", "adjudicator": "juaristi22", "adjudicated_on": "2026-08-24", @@ -300,7 +300,7 @@ ] }, "expectation": "column_differs", - "magnitude_evidence": "Scoped apart from the benchmarked wealth columns because it has no donor benchmark to quote: the column is a fold of two WAS aggregates (total loans less total loans excluding Student Loans Company debt) and is a person-entity column where the wealth columns beside it are household-entity, so no like-for-like donor share exists on the stage's cleaned frame. The observed divergence is +0.0296 on the unweighted share, incumbent 0.0197 against ours 0.0493 \u2014 the spine places student debt on about two and a half times as many carriers. Signed under the standing E5 adjudication as part of the same correlated-rank draw, with the absence of a benchmark stated rather than papered over; if the wealth stage is revisited, this is the column whose direction is unevidenced.", + "magnitude_evidence": "Scoped apart from the benchmarked wealth columns because it has no donor benchmark to quote: the column is a fold of two WAS aggregates (total loans less total loans excluding Student Loans Company debt) and is a person-entity column where the wealth columns beside it are household-entity, so no like-for-like donor share exists on the stage's cleaned frame. The observed divergence is +0.0296 on the unweighted share, incumbent 0.0197 against ours 0.0493 — the spine places student debt on about two and a half times as many carriers. Signed under the standing E5 adjudication as part of the same correlated-rank draw, with the absence of a benchmark stated rather than papered over; if the wealth stage is revisited, this is the column whose direction is unevidenced.", "evidence": "experiments/686-uk-spine-comparison-ledger.md#e5--wealth--signed-carried-forward", "adjudicator": "juaristi22", "adjudicated_on": "2026-08-24", @@ -484,6 +484,31 @@ } } }, + { + "id": "tfc-routed-share-net-new-column", + "class": "net_new_column", + "scope": { + "surface": "nonzero_shares", + "columns": [ + "tax_free_childcare_spend_routed_share" + ], + "entities": [ + "person" + ] + }, + "expectation": "column_missing_in_reference", + "magnitude_evidence": "The spine persists the HMRC-derived financial-year account-activity proxy as a constant person-level input. The pinned enhanced-FRS reference predates this column, so the difference is structural. Licensed L2 (2026-09-05, receipts Part C): the column is present for every person at the 2024-04-01 contract value 0.593 (nonzero share 1.0) and policyengine-uk 2.94.0 reads it back; against the L1 engine-only twin the benunit and time_period tables are byte-equal, no cash, weight or FRS-carried column moves, and the 38 imputed household surfaces re-draw through the engine net-income predictors of 1 414 TFC households (column totals within +/-0.9%).", + "evidence": "experiments/834-childcare-tfc-receipts.md#part-c--column-twin-l2-release-round-trip-l3-re-fit-l5-composition-l4", + "adjudicator": "juaristi22", + "adjudicated_on": "2026-09-05", + "quantitative": { + "structural": { + "expected_columns": [ + "tax_free_childcare_spend_routed_share" + ] + } + } + }, { "id": "uc-reported-capital-net-new-column", "class": "net_new_column", diff --git a/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json b/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json index a48ce8ec0..875e5de82 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json +++ b/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json @@ -103,7 +103,7 @@ "source": { "source": "FRS empirical fit and HMRC Tax-Free Childcare statistics, June 2025 release", "agency": "HMRC", - "citation": "The 2015 value is the incumbent offline FRS fit; the 2024 value reflects HMRC 2024-25 TFC spending and annual unique children reached.", + "citation": "The 2024 value was a manual bump fitted on Enhanced FRS 2022-23 before the pipeline moved to FRS 2024-25; one scalar cannot hit caseload and spending when the award is wrong.", "url": "https://www.gov.uk/government/statistics/tax-free-childcare-statistics-june-2025", "status": "fitted_offline" }, @@ -161,7 +161,7 @@ "source": { "source": "FRS empirical fit", "agency": "PolicyEngine", - "citation": "Incumbent offline FRS childcare take-up fit.", + "citation": "Incumbent offline FRS childcare take-up fit. DfE's published 74.8% figure is not transferred directly because its denominator is not comparable to the model's eligibility base.", "status": "fitted_offline" }, "fitting_receipt": { @@ -265,6 +265,32 @@ "url": "https://www.gov.uk/government/statistics/monthly-property-transactions-completed-in-the-uk-with-value-40000-or-above", "status": "sourced_administrative_derived" } + }, + { + "key": "tax_free_childcare_spend_routed_share", + "output": "tax_free_childcare_spend_routed_share", + "entity": "person", + "values": { + "2017-04-01": 0.359, + "2018-04-01": 0.489, + "2019-04-01": 0.542, + "2020-04-01": 0.471, + "2021-04-01": 0.575, + "2022-04-01": 0.584, + "2023-04-01": 0.589, + "2024-04-01": 0.593, + "2025-04-01": 0.582 + }, + "source": { + "source": "HMRC Tax-Free Childcare statistics, March 2026, Table 2 (children with used accounts, monthly and annual-unique)", + "agency": "HMRC", + "status": "sourced_administrative_derived", + "url": "https://www.gov.uk/government/statistics/tax-free-childcare-statistics-march-2026", + "chronicle_package_id": "hmrc-tax-free-childcare-march-2026", + "ods_sha256": "c2a8e82a7d1e6c85cbe119ffe0a51e692fac3e5014a37f845484dee710e7a29d", + "derivation": "sum(monthly children with used accounts) / annual-unique children / 12, per HMRC financial year; quality report defines a used account", + "citation": "A calibration adjustment, not a measured routed-expenditure share: an account-active-duration proxy assuming uniform spend through the year and full routing in active months; HMRC warns payment dates need not be care dates. Assigned as the published mean, no invented distribution. Denominator is the whole year; the engine defines the share over the eligible period, and the two coincide while tax_free_childcare_eligible_declaration_periods is 0 or 4. HMRC's used-account definition changed from April 2025 and applies to annual figures from FY2024-25." + } } ], "continuous": [ @@ -278,15 +304,14 @@ "lower": 0, "upper": 30, "source": { - "source": "FRS empirical fit", + "source": "FRS empirical fit, frozen by microcosm#834 adjudication", "agency": "PolicyEngine", - "citation": "Incumbent offline childcare usage fit, clipped to [0, 30] hours.", - "status": "fitted_offline" - }, - "fitting_receipt": { - "source": "incumbent UK pipeline @ ebf733c", - "seed": 42, - "status": "frozen parity value" + "citation": "Incumbent offline childcare usage fit, clipped to [0, 30] hours. Frozen because it is underidentified without an independent extended-spending observation; replacing it needs evidence on hours actually used.", + "status": "frozen_by_adjudication", + "freeze": { + "decision": "Hold 15.019 / 4.972 / 0 / 30 fixed while fitting only four take-up rates", + "followup": "microcosm#834" + } } } ] 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 4ea45d035..637fbc254 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -1,13 +1,13 @@ { "source_fact_feed": ".codex-work/consumer_facts_uk.jsonl", "target_period": 2025, - "candidate_count": 417, - "contract_target_count": 189, - "active_reference_count": 408, + "candidate_count": 430, + "contract_target_count": 202, + "active_reference_count": 415, "status_counts": { - "active": 408, + "active": 415, "no_fact_at_or_before_period": 7, - "signed_excluded": 2 + "signed_excluded": 8 }, "geography_pins": { "obr.income_tax": { @@ -765,9 +765,62 @@ "dwp.uc.households": { "geography_level": "country", "geography_id": "K03000001" + }, + "hmrc.tfc.government_top_up": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "hmrc.tfc.children_with_used_accounts": { + "geography_level": "country", + "geography_id": "K02000001" + }, + "dfe.funded_childcare.working_parent_children_2_to_4": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dfe.funded_childcare.early_learning_2_year_olds": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dfe.funded_childcare.universal_only_children": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_fare_receipts.england": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_net_support.england": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_fare_receipts.london": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_net_support.london": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_fare_receipts.england_outside_london": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_net_support.england_outside_london": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_fare_receipts.uk": { + "geography_level": "country", + "geography_id": "E92000001" + }, + "dft.bus_net_support.uk": { + "geography_level": "country", + "geography_id": "E92000001" } }, "genuine_sum_residue": [ + "dfe.funded_childcare.working_parent_children_2_to_4", "obr.esa", "ons.population.age_0_9_by_region", "ons.population.age_10_19_by_region", @@ -2650,6 +2703,21 @@ "name": "dwp.uc.households", "from": "2025-12", "to": "2025" + }, + { + "name": "dfe.funded_childcare.working_parent_children_2_to_4", + "from": "2025-01", + "to": "2025" + }, + { + "name": "dfe.funded_childcare.early_learning_2_year_olds", + "from": "2025-01", + "to": "2025" + }, + { + "name": "dfe.funded_childcare.universal_only_children", + "from": "2025-01", + "to": "2025" } ], "targets": { @@ -7740,6 +7808,183 @@ "resolved_fact_key": "ledger_aggregate_fact_v2_3270b0f656838ddd01b1ac5f" } ] + }, + "hmrc.tfc.government_top_up": { + "status": "active", + "candidates": [ + { + "name": "hmrc.tfc.government_top_up", + "status": "active", + "matched_fact_count_overall": 9, + "matched_fact_count_at_or_before_period": 9, + "resolved_period": 2025, + "resolved_value": 599800000.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_988715985f9e98bbb332e83d" + } + ] + }, + "hmrc.tfc.children_with_used_accounts": { + "status": "active", + "candidates": [ + { + "name": "hmrc.tfc.children_with_used_accounts", + "status": "active", + "matched_fact_count_overall": 2, + "matched_fact_count_at_or_before_period": 2, + "resolved_period": 2025, + "resolved_value": 1151515.0, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_7aa1c663447037b35ea1c999" + } + ] + }, + "dfe.funded_childcare.working_parent_children_2_to_4": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.working_parent_children_2_to_4", + "status": "active", + "matched_fact_count_overall": 11, + "matched_fact_count_at_or_before_period": 9, + "resolved_period": 2025, + "resolved_value": 621482.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_a57a0c03ac43b62dde04fabd" + } + ] + }, + "dfe.funded_childcare.early_learning_2_year_olds": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.early_learning_2_year_olds", + "status": "active", + "matched_fact_count_overall": 12, + "matched_fact_count_at_or_before_period": 11, + "resolved_period": 2025, + "resolved_value": 95031.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_a2b30af28303935159ba0edc" + } + ] + }, + "dfe.funded_childcare.universal_only_children": { + "status": "active", + "candidates": [ + { + "name": "dfe.funded_childcare.universal_only_children", + "status": "active", + "matched_fact_count_overall": 770, + "matched_fact_count_at_or_before_period": 686, + "resolved_period": 2025, + "resolved_value": 396965.0, + "resolved_fact_period": "2025-01", + "resolved_fact_key": "ledger_aggregate_fact_v2_471573def13ebdc67ff1f40a" + } + ] + }, + "dft.bus_fare_receipts.england": { + "status": "active", + "candidates": [ + { + "name": "dft.bus_fare_receipts.england", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "resolved_period": 2025, + "resolved_value": 3417388656.43538, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_2ece7c3d283b6de43b30389f" + } + ] + }, + "dft.bus_net_support.england": { + "status": "active", + "candidates": [ + { + "name": "dft.bus_net_support.england", + "status": "active", + "matched_fact_count_overall": 3, + "matched_fact_count_at_or_before_period": 3, + "resolved_period": 2025, + "resolved_value": 3024904320.8399997, + "resolved_fact_period": "2025", + "resolved_fact_key": "ledger_aggregate_fact_v2_a12dfcdc0662c8a5e48bf003" + } + ] + }, + "dft.bus_fare_receipts.london": { + "status": "signed_excluded", + "candidates": [ + { + "name": "dft.bus_fare_receipts.london", + "status": "signed_excluded", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "signed_rationale": "Region target held until the UK target compiler has a declared region roster and cross-grain leg; tracked by #790." + } + ] + }, + "dft.bus_net_support.london": { + "status": "signed_excluded", + "candidates": [ + { + "name": "dft.bus_net_support.london", + "status": "signed_excluded", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "signed_rationale": "Region target held until the UK target compiler has a declared region roster and cross-grain leg; tracked by #790." + } + ] + }, + "dft.bus_fare_receipts.england_outside_london": { + "status": "signed_excluded", + "candidates": [ + { + "name": "dft.bus_fare_receipts.england_outside_london", + "status": "signed_excluded", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "signed_rationale": "Chronicle stamps this row at statistical_scope; Microcosm has no declared statistical-scope pin and must not bind the England total accidentally." + } + ] + }, + "dft.bus_net_support.england_outside_london": { + "status": "signed_excluded", + "candidates": [ + { + "name": "dft.bus_net_support.england_outside_london", + "status": "signed_excluded", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "signed_rationale": "Chronicle stamps this row at statistical_scope; Microcosm has no declared statistical-scope pin and must not bind the England total accidentally." + } + ] + }, + "dft.bus_fare_receipts.uk": { + "status": "signed_excluded", + "candidates": [ + { + "name": "dft.bus_fare_receipts.uk", + "status": "signed_excluded", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "signed_rationale": "BUS05i publishes no UK total and Microcosm declares no method to construct one." + } + ] + }, + "dft.bus_net_support.uk": { + "status": "signed_excluded", + "candidates": [ + { + "name": "dft.bus_net_support.uk", + "status": "signed_excluded", + "matched_fact_count_overall": 0, + "matched_fact_count_at_or_before_period": 0, + "signed_rationale": "BUS05i publishes no UK total and Microcosm declares no method to construct one." + } + ] } }, "fanout_family_outcomes": [ diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json new file mode 100644 index 000000000..50b8eb618 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json @@ -0,0 +1,69 @@ +{ + "schema_version": 1, + "exclusions": [ + { + "target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "reason_id": "property_income_undercount_adjustment_missing", + "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.", + "tracking": "policyengine-uk-data#230", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "ons.population.scotland_households_3plus_children", + "reason_id": "no_household_composition_fact", + "rationale": "Signed out pending a Scotland household-composition fact: the current selector reaches person-level ONS mid-year population age rows, not households with three or more children. microcosm#736 tracks the missing declaration.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "dft.bus_fare_receipts.london", + "reason_id": "region_pin_unsupported", + "rationale": "Region target held until the UK target compiler has a declared region roster and cross-grain leg; tracked by #790.", + "tracking": "microcosm#790", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "dft.bus_net_support.london", + "reason_id": "region_pin_unsupported", + "rationale": "Region target held until the UK target compiler has a declared region roster and cross-grain leg; tracked by #790.", + "tracking": "microcosm#790", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "dft.bus_fare_receipts.england_outside_london", + "reason_id": "statistical_scope_unsupported", + "rationale": "Chronicle stamps this row at statistical_scope; Microcosm has no declared statistical-scope pin and must not bind the England total accidentally.", + "tracking": "microcosm#789", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "dft.bus_net_support.england_outside_london", + "reason_id": "statistical_scope_unsupported", + "rationale": "Chronicle stamps this row at statistical_scope; Microcosm has no declared statistical-scope pin and must not bind the England total accidentally.", + "tracking": "microcosm#789", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "dft.bus_fare_receipts.uk", + "reason_id": "no_publisher_uk_total", + "rationale": "BUS05i publishes no UK total and Microcosm declares no method to construct one.", + "tracking": "microcosm#789", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + }, + { + "target_id": "dft.bus_net_support.uk", + "reason_id": "no_publisher_uk_total", + "rationale": "BUS05i publishes no UK total and Microcosm declares no method to construct one.", + "tracking": "microcosm#789", + "approved_by": "juaristi22", + "approved_on": "2026-09-05" + } + ] +} 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 b256be72d..128542f6b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -4,6 +4,7 @@ "allowed_value_operations": [ "identity", "sum", + "difference", "calendar_year_average", "latest_plateau", "count_x_mean" @@ -14,6 +15,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.income_tax", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -32,6 +34,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_total", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -50,6 +53,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_employee", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -68,6 +72,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_employer", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -86,6 +91,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_self_employed", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -104,6 +110,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.vat", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -122,6 +129,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.fuel_duties", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -140,6 +148,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.capital_gains_tax", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -158,6 +167,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.sdlt", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -176,6 +186,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.attendance_allowance", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -194,6 +205,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.carers_allowance", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -212,6 +224,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.child_benefit", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -248,6 +261,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.incapacity_benefits", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -267,6 +281,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.housing_benefit", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -285,6 +300,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.jobseekers_allowance", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -303,6 +319,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.pension_credit", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -321,6 +338,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.dla_and_pip", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -339,6 +357,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.state_pension", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -357,6 +376,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.statutory_maternity_pay", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -375,6 +395,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.tv_licence_fee", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -393,6 +414,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.universal_credit_in_cap", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -411,6 +433,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.universal_credit_outside_cap", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -429,6 +452,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.winter_fuel_payment", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -622,6 +646,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -645,6 +670,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -668,6 +694,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -691,6 +718,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -714,6 +742,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -737,6 +766,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -760,6 +790,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -783,6 +814,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -806,6 +838,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -829,6 +862,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -852,6 +886,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -875,6 +910,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -898,6 +934,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1220,6 +1257,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1243,6 +1281,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1266,6 +1305,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1289,6 +1329,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1312,6 +1353,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1335,6 +1377,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1358,6 +1401,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1381,6 +1425,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1404,6 +1449,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1427,6 +1473,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1450,6 +1497,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1473,6 +1521,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1496,6 +1545,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1818,6 +1868,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1841,6 +1892,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1864,6 +1916,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1887,6 +1940,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1910,6 +1964,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1933,6 +1988,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1956,6 +2012,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -1979,6 +2036,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2002,6 +2060,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2025,6 +2084,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2048,6 +2108,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2071,6 +2132,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2094,6 +2156,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2715,6 +2778,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2738,6 +2802,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2761,6 +2826,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2784,6 +2850,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2807,6 +2874,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2830,6 +2898,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2853,6 +2922,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2876,6 +2946,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2899,6 +2970,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2922,6 +2994,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2945,6 +3018,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2968,6 +3042,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -2991,6 +3066,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3313,6 +3389,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3336,6 +3413,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3359,6 +3437,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3382,6 +3461,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3405,6 +3485,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3428,6 +3509,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3451,6 +3533,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3474,6 +3557,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3497,6 +3581,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3520,6 +3605,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3543,6 +3629,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3566,6 +3653,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3589,6 +3677,7 @@ "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001", "dimension_values": { @@ -3931,6 +4020,7 @@ "source_name": "hmrc", "source_concept": "hmrc.cgt_gains_total", "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit", "geography_level": "country", "geography_id": "K02000001" }, @@ -7207,7 +7297,7 @@ "geography_level": "country", "geography_id": "S92000003" }, - "entity": "benunit", + "entity": "household", "measure": "dwp/scotland_uc_households_child_under_1", "family": "dwp_universal_credit", "period": 2025, @@ -7606,6 +7696,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7644,6 +7735,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7682,6 +7774,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7720,6 +7813,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7758,6 +7852,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7796,6 +7891,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7834,6 +7930,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7872,6 +7969,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7910,6 +8008,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7945,6 +8044,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7980,6 +8080,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8015,6 +8116,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8050,6 +8152,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8085,6 +8188,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8120,6 +8224,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8155,6 +8260,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8190,6 +8296,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8225,6 +8332,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8260,6 +8368,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8295,6 +8404,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8330,6 +8440,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8365,6 +8476,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8400,6 +8512,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8435,6 +8548,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8470,6 +8584,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8505,6 +8620,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8540,6 +8656,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8571,6 +8688,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 1, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8606,6 +8724,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8641,6 +8760,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8676,6 +8796,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8711,6 +8832,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8746,6 +8868,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8781,6 +8904,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8816,6 +8940,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8851,6 +8976,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8886,6 +9012,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8921,6 +9048,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8956,6 +9084,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8991,6 +9120,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9026,6 +9156,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9061,6 +9192,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9096,6 +9228,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9131,6 +9264,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9166,6 +9300,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9201,6 +9336,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9232,6 +9368,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 1, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9276,6 +9413,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 16, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9305,6 +9443,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 1, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9868,6 +10007,7 @@ "dimension_values": { "social_security_line": "scottish_child_payment" }, + "entity_name": "person", "geography_level": "country", "geography_id": "S92000003" }, @@ -9886,6 +10026,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.ukea_haxv", + "entity_name": "household", "geography_level": "country", "geography_id": "K02000001" }, @@ -9922,6 +10063,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.e44r", + "entity_name": "institutional_sector", "geography_level": "country", "geography_id": "K02000001" }, @@ -9941,6 +10083,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.e44n", + "entity_name": "institutional_sector", "geography_level": "country", "geography_id": "K02000001" }, @@ -9960,6 +10103,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.e43b", + "entity_name": "institutional_sector", "geography_level": "country", "geography_id": "K02000001" }, @@ -9982,6 +10126,7 @@ "source_measure_id": [ "total_higher_education" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10005,6 +10150,7 @@ "source_measure_id": [ "plan_1" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10029,6 +10175,7 @@ "plan_2_full_time", "plan_2_part_time" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10053,6 +10200,7 @@ "plan_3_postgraduate_masters", "plan_3_postgraduate_doctoral" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10077,6 +10225,7 @@ "plan_5_full_time", "plan_5_part_time" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10208,6 +10357,7 @@ "ledger_selector": { "source_name": "slc", "source_concept": "slc.maintenance_loan_amount_paid", + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10252,6 +10402,7 @@ "dimension_values": { "student_support_product": "parents_learning_allowance" }, + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10296,6 +10447,7 @@ "dimension_values": { "student_support_product": "adult_dependants_grant" }, + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -10331,6 +10483,192 @@ "value_operation": "calendar_year_average", "uprating_from_period": "2025-12", "uprating_to_period": 2025 + }, + { + "name": "hmrc.tfc.government_top_up", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.tax_free_childcare.government_top_up_gbp_million", + "entity_name": "government", + "period_type": "fiscal_year", + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/tfc/government_top_up", + "family": "hmrc_tfc", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.tfc.government_top_up", + "measure_kind": "prepared_column", + "observation_basis": "annual_flow" + } + }, + { + "name": "hmrc.tfc.children_with_used_accounts", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.tax_free_childcare.children_with_used_accounts_total", + "entity_name": "person", + "period_type": "fiscal_year", + "dimension_values": { + "definition_regime": "payment_and_open_at_reference_date" + }, + "geography_level": "country", + "geography_id": "K02000001" + }, + "entity": "person", + "measure": "hmrc/tfc/children_with_used_accounts", + "family": "hmrc_tfc", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.tfc.children_with_used_accounts", + "measure_kind": "prepared_column", + "observation_basis": "annual_unique_count" + } + }, + { + "name": "dfe.funded_childcare.working_parent_children_2_to_4", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": [ + "2 years", + "3 to 4 years" + ], + "registration_basis": "registered_children", + "provision": "all" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/working_parent_children_2_to_4", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.working_parent_children_2_to_4", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "value_operation": "sum", + "expected_member_count": 2, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dfe.funded_childcare.early_learning_2_year_olds", + "ledger_selector": { + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Early learning for 2-year-olds", + "age": "2 years", + "registration_basis": "registered_children" + }, + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/early_learning_2_year_olds", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.early_learning_2_year_olds", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dfe.funded_childcare.universal_only_children", + "ledger_selector": { + "source_name": "dfe", + "entity_name": "person", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "person", + "measure": "dfe/funded_childcare/universal_only_children", + "family": "dfe_funded_childcare", + "period": 2025, + "metadata": { + "contract_target_id": "dfe.funded_childcare.universal_only_children", + "measure_kind": "prepared_column", + "observation_basis": "january_stock" + }, + "value_operation": "difference", + "value_operands": [ + { + "role": "minuend", + "source_concept": "dfe.number_of_registered_children_nursery", + "source_measure_id": "registered_children_nursery_count", + "dimension_values": { + "entitlement_type": "Universal", + "age": "Total" + } + }, + { + "role": "subtrahend", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "3 to 4 years" + } + } + ], + "uprating_from_period": "2025-01", + "uprating_to_period": 2025 + }, + { + "name": "dft.bus_fare_receipts.england", + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_passenger_fare_receipts", + "layout_groupby_value_id": "england", + "entity_name": "institutional_sector", + "period_type": "fiscal_year", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "dft/bus_fare_receipts/england", + "family": "dft_local_bus", + "period": 2025, + "metadata": { + "contract_target_id": "dft.bus_fare_receipts.england", + "measure_kind": "prepared_column", + "observation_basis": "fiscal_year_flow" + } + }, + { + "name": "dft.bus_net_support.england", + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_total_estimated_net_support", + "layout_groupby_value_id": "england", + "entity_name": "institutional_sector", + "period_type": "fiscal_year", + "geography_level": "country", + "geography_id": "E92000001" + }, + "entity": "household", + "measure": "dft/bus_net_support/england", + "family": "dft_local_bus", + "period": 2025, + "metadata": { + "contract_target_id": "dft.bus_net_support.england", + "measure_kind": "prepared_column", + "observation_basis": "fiscal_year_flow" + } } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_data_target_parity.json b/packages/microcosm-build/src/microcosm/build/uk/uk_data_target_parity.json index b13fd09e0..33ba0cdd6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_data_target_parity.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_data_target_parity.json @@ -201,7 +201,7 @@ "purpose": "Preserve service-consumption totals and distribution.", "verdict_basis": "Route to WS-E/F (#148), using landed DfT facts; never allocate the national total over local areas." }, - "reason": "BUS05 subsidy/fare totals and the NTS0705 quintile IPF belong to WS-E/F (#148).", + "reason": "BUS05 subsidy/fare totals are consumed by the #789 rows; the NTS0705 quintile gradient remains routed to WS-E/F (#148).", "status": "routed" }, { diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 90c9739c9..1fb59edc3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -4,7 +4,8 @@ "description": "UK population calibration contract: value-free national and local-geography target declarations over Chronicle facts. Selection contracts live in Microcosm per the chronicle#166 ruling (2026-08-13): Chronicle is a facts-only layer; Microcosm owns which facts are targets and how they bind to the model. This resource consolidates the former national and local-geography contracts into one population contract while preserving both target levels and their provenance accounting blocks. Observed values resolve from hash-pinned Chronicle consumer-facts artifacts at build time.", "allowed_value_operations": [ "identity", - "sum" + "sum", + "difference" ], "resolution_defaults": { "base_period_policy": "latest_not_after_build_base_period", @@ -678,8 +679,21 @@ "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\u00eda 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\u00eda 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.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.", + "hmrc.tfc.government_top_up": "Post-freeze fact family, no uk-data metric.", + "hmrc.tfc.children_with_used_accounts": "Post-freeze fact family, no uk-data metric.", + "dfe.funded_childcare.working_parent_children_2_to_4": "Post-freeze fact family, no uk-data metric.", + "dfe.funded_childcare.early_learning_2_year_olds": "Post-freeze fact family, no uk-data metric.", + "dfe.funded_childcare.universal_only_children": "Post-freeze fact family, no uk-data metric.", + "dft.bus_fare_receipts.england": "#789 consumer target.", + "dft.bus_net_support.england": "#789 consumer target.", + "dft.bus_fare_receipts.london": "#789 consumer target.", + "dft.bus_net_support.london": "#789 consumer target.", + "dft.bus_fare_receipts.england_outside_london": "#789 consumer target.", + "dft.bus_net_support.england_outside_london": "#789 consumer target.", + "dft.bus_fare_receipts.uk": "#789 consumer target.", + "dft.bus_net_support.uk": "#789 consumer target." }, "suppressed_ancestors": { "hmrc/salary_sacrifice_it_relief_basic_rate": { @@ -709,7 +723,7 @@ "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\u00eda 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_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." }, "scope_target_ids": [ "obr.income_tax", @@ -900,7 +914,20 @@ "slc.support.parents_learning_allowance_spend", "slc.support.adult_dependants_grant_recipients", "slc.support.adult_dependants_grant_spend", - "dwp.uc.households" + "dwp.uc.households", + "hmrc.tfc.government_top_up", + "hmrc.tfc.children_with_used_accounts", + "dfe.funded_childcare.working_parent_children_2_to_4", + "dfe.funded_childcare.early_learning_2_year_olds", + "dfe.funded_childcare.universal_only_children", + "dft.bus_fare_receipts.england", + "dft.bus_net_support.england", + "dft.bus_fare_receipts.london", + "dft.bus_net_support.london", + "dft.bus_fare_receipts.england_outside_london", + "dft.bus_net_support.england_outside_london", + "dft.bus_fare_receipts.uk", + "dft.bus_net_support.uk" ] }, "profile_parity": { @@ -1358,7 +1385,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.income_tax" + "source_concept": "obr.income_tax", + "entity_name": "person" } }, { @@ -1378,7 +1406,7 @@ "value_variable": "total_national_insurance", "from_entity": "person", "map_to": "household", - "notes": "The EFO line is total NICs receipts; binds total_national_insurance (class 1 employee + employer + classes 2-4). The prior ni_employee-only binding was the uk-data defect carried for parity \u2014 final estimate bit-identical to obr.ni_employee \u2014 fixed under the microcosm#757 audit partition (2026-08-26). Nearly redundant with the three separately-calibrated component lines by construction; kept so the published total binds honestly. Residual gap is Class 1A/1B on benefits in kind, which the model does not carry." + "notes": "The EFO line is total NICs receipts; binds total_national_insurance (class 1 employee + employer + classes 2-4). The prior ni_employee-only binding was the uk-data defect carried for parity — final estimate bit-identical to obr.ni_employee — fixed under the microcosm#757 audit partition (2026-08-26). Nearly redundant with the three separately-calibrated component lines by construction; kept so the published total binds honestly. Residual gap is Class 1A/1B on benefits in kind, which the model does not carry." }, "axiom": { "metric_name": "obr/ni", @@ -1389,7 +1417,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.ni_total" + "source_concept": "obr.ni_total", + "entity_name": "person" } }, { @@ -1419,7 +1448,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.ni_employee" + "source_concept": "obr.ni_employee", + "entity_name": "person" } }, { @@ -1449,7 +1479,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.ni_employer" + "source_concept": "obr.ni_employer", + "entity_name": "person" } }, { @@ -1479,7 +1510,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.ni_self_employed" + "source_concept": "obr.ni_self_employed", + "entity_name": "person" } }, { @@ -1506,7 +1538,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.vat" + "source_concept": "obr.vat", + "entity_name": "person" } }, { @@ -1533,7 +1566,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.fuel_duties" + "source_concept": "obr.fuel_duties", + "entity_name": "person" } }, { @@ -1563,7 +1597,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.capital_gains_tax" + "source_concept": "obr.capital_gains_tax", + "entity_name": "person" } }, { @@ -1590,7 +1625,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.sdlt" + "source_concept": "obr.sdlt", + "entity_name": "person" } }, { @@ -1620,7 +1656,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.attendance_allowance" + "source_concept": "obr.attendance_allowance", + "entity_name": "person" } }, { @@ -1650,7 +1687,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.carers_allowance" + "source_concept": "obr.carers_allowance", + "entity_name": "person" } }, { @@ -1680,7 +1718,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.child_benefit" + "source_concept": "obr.child_benefit", + "entity_name": "person" } }, { @@ -1855,7 +1894,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.domestic_rates" + "source_concept": "obr.domestic_rates", + "entity_name": "person" } }, { @@ -1884,7 +1924,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.incapacity_benefits" + "source_concept": "obr.incapacity_benefits", + "entity_name": "person" } }, { @@ -1914,7 +1955,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.housing_benefit" + "source_concept": "obr.housing_benefit", + "entity_name": "person" } }, { @@ -1944,7 +1986,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.jobseekers_allowance" + "source_concept": "obr.jobseekers_allowance", + "entity_name": "person" } }, { @@ -1974,7 +2017,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.pension_credit" + "source_concept": "obr.pension_credit", + "entity_name": "person" } }, { @@ -2005,7 +2049,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.dla_and_pip" + "source_concept": "obr.dla_and_pip", + "entity_name": "person" } }, { @@ -2035,7 +2080,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.state_pension" + "source_concept": "obr.state_pension", + "entity_name": "person" } }, { @@ -2065,7 +2111,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.statutory_maternity_pay" + "source_concept": "obr.statutory_maternity_pay", + "entity_name": "person" } }, { @@ -2092,7 +2139,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.tv_licence_fee" + "source_concept": "obr.tv_licence_fee", + "entity_name": "person" } }, { @@ -2137,7 +2185,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.universal_credit_in_cap" + "source_concept": "obr.universal_credit_in_cap", + "entity_name": "person" } }, { @@ -2182,7 +2231,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.universal_credit_outside_cap" + "source_concept": "obr.universal_credit_outside_cap", + "entity_name": "person" } }, { @@ -2209,7 +2259,8 @@ "assertion_policy": "allow_source_projection", "ledger_selector": { "source_name": "obr", - "source_concept": "obr.winter_fuel_payment" + "source_concept": "obr.winter_fuel_payment", + "entity_name": "person" } }, { @@ -2598,7 +2649,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.spi_employment_income_amount", - "groupby_dimension": "hmrc.total_income_band" + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person" } }, { @@ -2677,7 +2729,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.spi_self_employment_income_amount", - "groupby_dimension": "hmrc.total_income_band" + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person" } }, { @@ -2756,7 +2809,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.spi_dividend_income_amount", - "groupby_dimension": "hmrc.total_income_band" + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person" } }, { @@ -2835,7 +2889,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.spi_property_income_amount", - "groupby_dimension": "hmrc.total_income_band" + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person" } }, { @@ -2914,7 +2969,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.spi_private_pension_income_amount", - "groupby_dimension": "hmrc.total_income_band" + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person" } }, { @@ -2993,7 +3049,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.spi_state_pension_amount", - "groupby_dimension": "hmrc.total_income_band" + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person" } }, { @@ -3123,7 +3180,8 @@ "ledger_selector": { "source_name": "hmrc", "source_concept": "hmrc.cgt_gains_total", - "groupby_dimension": "hmrc.cgt_table1_line" + "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit" } }, { @@ -4153,8 +4211,8 @@ "country" ], "measurement": { - "entity": "benunit", - "concept": "uk.benefit_unit.count", + "entity": "household", + "concept": "uk.household.count", "filters": [ { "concept": "uk.geography.region", @@ -4175,9 +4233,8 @@ "bindings": { "policyengine": { "metric_name": "dwp/scotland_uc_households_child_under_1", - "value_variable": "benunit_count", - "from_entity": "benunit", - "filters": [ + "reduce": "any", + "household_conditions": [ { "variable": "region", "operator": "==", @@ -4185,21 +4242,26 @@ }, { "variable": "universal_credit", + "entity": "benunit", + "reduce": "any", "operator": ">", "value": 0 }, { - "variable": "youngest_child_age", + "variable": "age", + "entity": "person", + "reduce": "any_child_under", "operator": "<", "value": 1 } ], - "notes": "Prepared benefit-unit count for Scottish UC units whose youngest child is under 1. The Chronicle monthly series is averaged over April-December 2025, matching the rest of the DWP Universal Credit family." + "value_variable": "household_count", + "notes": "Scottish UC households with a child under 1 (compute/benefits.py:24-30). Household grain kept: the calibration provider has no categorical household-to-benefit-unit broadcast (a benefit-unit row cannot filter on region), so the #813-style re-bind is not available for a geography-filtered row; the Chronicle series is calendar-year averaged over April-December 2025 like the rest of the family." }, "axiom": { "metric_name": "dwp/scotland_uc_households_child_under_1", "status": "pending", - "value_rule": "uk.benefit_unit.count" + "value_rule": "uk.household.count" } }, "ledger_selector": { @@ -4859,6 +4921,7 @@ }, { "target_id": "ons.population.uk_total", + "value_operation": "sum", "family": "ons_population", "geography_levels": [ "country" @@ -8626,7 +8689,7 @@ } ], "value_variable": "household_count", - "notes": "ONS Table 7 'one family only: couple, no children' is the household being exactly one childless couple and nobody else; with the childless-couple benunit present, person count == 2 is equivalent to the one-family restriction. Without it the binding counted every household *containing* such a couple \u2014 a 1.84m overlap with the couple-non-dependent-children and multi-family categories (microcosm#757 audit partition, 2026-08-26)." + "notes": "ONS Table 7 'one family only: couple, no children' is the household being exactly one childless couple and nobody else; with the childless-couple benunit present, person count == 2 is equivalent to the one-family restriction. Without it the binding counted every household *containing* such a couple — a 1.84m overlap with the couple-non-dependent-children and multi-family categories (microcosm#757 audit partition, 2026-08-26)." }, "axiom": { "metric_name": "ons/couple_no_children_households", @@ -9750,7 +9813,8 @@ "source_concept": "scotgov.social_security_assistance_spending", "dimension_values": { "social_security_line": "scottish_child_payment" - } + }, + "entity_name": "person" } }, { @@ -9780,7 +9844,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.ukea_haxv" + "source_concept": "ons.ukea_haxv", + "entity_name": "household" } }, { @@ -9848,7 +9913,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.e44r" + "source_concept": "ons.e44r", + "entity_name": "institutional_sector" } }, { @@ -9875,7 +9941,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.e44n" + "source_concept": "ons.e44n", + "entity_name": "institutional_sector" } }, { @@ -9902,7 +9969,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.e43b" + "source_concept": "ons.e43b", + "entity_name": "institutional_sector" } }, { @@ -9932,7 +10000,8 @@ }, "ledger_selector": { "source_name": "slc", - "source_concept": "slc.student_loan_net_repayments_total" + "source_concept": "slc.student_loan_net_repayments_total", + "entity_name": "person" } }, { @@ -9979,7 +10048,8 @@ "groupby_dimension": "slc.repayment_plan", "source_measure_id": [ "total_higher_education" - ] + ], + "entity_name": "person" } }, { @@ -10034,7 +10104,8 @@ "groupby_dimension": "slc.repayment_plan", "source_measure_id": [ "plan_1" - ] + ], + "entity_name": "person" } }, { @@ -10092,7 +10163,8 @@ "source_measure_id": [ "plan_2_full_time", "plan_2_part_time" - ] + ], + "entity_name": "person" } }, { @@ -10150,7 +10222,8 @@ "source_measure_id": [ "plan_3_postgraduate_masters", "plan_3_postgraduate_doctoral" - ] + ], + "entity_name": "person" } }, { @@ -10208,7 +10281,8 @@ "source_measure_id": [ "plan_5_full_time", "plan_5_part_time" - ] + ], + "entity_name": "person" } }, { @@ -10474,7 +10548,8 @@ }, "ledger_selector": { "source_name": "slc", - "source_concept": "slc.maintenance_loan_amount_paid" + "source_concept": "slc.maintenance_loan_amount_paid", + "entity_name": "person" } }, { @@ -10552,7 +10627,8 @@ "source_concept": "slc.targeted_support_amount_awarded", "dimension_values": { "student_support_product": "parents_learning_allowance" - } + }, + "entity_name": "person" } }, { @@ -10630,7 +10706,8 @@ "source_concept": "slc.targeted_support_amount_awarded", "dimension_values": { "student_support_product": "adult_dependants_grant" - } + }, + "entity_name": "person" } }, { @@ -10678,300 +10755,885 @@ } }, { - "target_id": "hmrc.self_employment_income.amount", - "family": "hmrc", + "target_id": "hmrc.tfc.government_top_up", + "family": "hmrc_tfc", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", - "concept": "uk.income.self_employment.amount", - "filters": [ - { - "concept": "uk.tax.income_tax", - "operator": ">", - "value": 0 - } - ] + "concept": "uk.tax.tax_free_childcare.amount", + "observation_basis": "annual_flow" }, "bindings": { "policyengine": { - "metric_name": "hmrc/self_employment_income/amount", - "value_variable": "self_employment_income", + "metric_name": "hmrc/tfc/government_top_up", + "value_variable": "tax_free_childcare", "from_entity": "person", - "map_to": "household", - "filters": [ - { - "variable": "income_tax", - "operator": ">", - "value": 0 - } - ] + "map_to": "household" }, "axiom": { - "metric_name": "hmrc/self_employment_income/amount", + "metric_name": "hmrc/tfc/government_top_up", "status": "pending", - "value_rule": "uk.income.self_employment.amount" + "value_rule": "uk.tax.tax_free_childcare.amount" } }, "ledger_selector": { "source_name": "hmrc", - "source_measure_id": [ - "self_employment_income_count", - "self_employment_income_mean" - ], - "record_set_spec_id": [ - "uk.local_geography.spi_income.by_constituency.v1", - "uk.local_geography.spi_income.by_local_authority.v1" - ] - }, - "selector_note": "No Chronicle amount fact exists; count_x_mean consumes the ordered count and mean facts from the same SPI area record-set spec." + "source_concept": "hmrc.tax_free_childcare.government_top_up_gbp_million", + "entity_name": "government", + "period_type": "fiscal_year" + } }, { - "target_id": "hmrc.self_employment_income.count", - "family": "hmrc", + "target_id": "hmrc.tfc.children_with_used_accounts", + "family": "hmrc_tfc", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", "concept": "uk.person.count", + "observation_basis": "annual_unique_count", "filters": [ { - "concept": "uk.income.self_employment.amount", - "operator": "!=", - "value": 0 - }, - { - "concept": "uk.tax.income_tax", - "operator": ">", - "value": 0 + "concept": "uk.childcare.is_child_receiving_tax_free_childcare", + "equals": true } ] }, "bindings": { "policyengine": { - "metric_name": "hmrc/self_employment_income/count", + "metric_name": "hmrc/tfc/children_with_used_accounts", "value_variable": "person_count", "from_entity": "person", "map_to": "household", "filters": [ { - "variable": "self_employment_income", - "operator": "!=", - "value": 0 - }, - { - "variable": "income_tax", - "operator": ">", - "value": 0 + "variable": "is_child_receiving_tax_free_childcare", + "equals": true } ] }, "axiom": { - "metric_name": "hmrc/self_employment_income/count", + "metric_name": "hmrc/tfc/children_with_used_accounts", "status": "pending", "value_rule": "uk.person.count" } }, "ledger_selector": { "source_name": "hmrc", - "source_measure_id": "self_employment_income_count", - "record_set_spec_id": [ - "uk.local_geography.spi_income.by_constituency.v1", - "uk.local_geography.spi_income.by_local_authority.v1" - ] + "source_concept": "hmrc.tax_free_childcare.children_with_used_accounts_total", + "entity_name": "person", + "period_type": "fiscal_year", + "dimension_values": { + "definition_regime": "payment_and_open_at_reference_date" + } } }, { - "target_id": "hmrc.employment_income.amount", - "family": "hmrc", + "target_id": "dfe.funded_childcare.working_parent_children_2_to_4", + "family": "dfe_funded_childcare", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", - "concept": "uk.income.employment.amount", + "concept": "uk.person.count", + "observation_basis": "january_stock", "filters": [ { - "concept": "uk.tax.income_tax", - "operator": ">", - "value": 0 + "concept": "uk.childcare.is_child_receiving_extended_childcare", + "equals": true + }, + { + "concept": "uk.demographics.age", + "operator": ">=", + "value": 2 + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" } ] }, "bindings": { "policyengine": { - "metric_name": "hmrc/employment_income/amount", - "value_variable": "employment_income", + "metric_name": "dfe/funded_childcare/working_parent_children_2_to_4", + "value_variable": "person_count", "from_entity": "person", "map_to": "household", "filters": [ { - "variable": "income_tax", - "operator": ">", - "value": 0 + "variable": "is_child_receiving_extended_childcare", + "equals": true + }, + { + "variable": "age", + "operator": ">=", + "value": 2 + }, + { + "variable": "country", + "equals": "ENGLAND" } - ] + ], + "notes": "Caseload only: entitlement spending is not bound because caseload multiplied by full-usage ceilings would double count assumptions." }, "axiom": { - "metric_name": "hmrc/employment_income/amount", + "metric_name": "dfe/funded_childcare/working_parent_children_2_to_4", "status": "pending", - "value_rule": "uk.income.employment.amount" + "value_rule": "uk.person.count" } }, "ledger_selector": { - "source_name": "hmrc", - "source_measure_id": [ - "employment_income_count", - "employment_income_mean" - ], - "record_set_spec_id": [ - "uk.local_geography.spi_income.by_constituency.v1", - "uk.local_geography.spi_income.by_local_authority.v1" - ] - }, - "selector_note": "No Chronicle amount fact exists; count_x_mean consumes the ordered count and mean facts from the same SPI area record-set spec." + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Working parents", + "age": [ + "2 years", + "3 to 4 years" + ], + "registration_basis": "registered_children", + "provision": "all" + } + } }, { - "target_id": "hmrc.employment_income.count", - "family": "hmrc", + "target_id": "dfe.funded_childcare.early_learning_2_year_olds", + "family": "dfe_funded_childcare", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { "entity": "person", "map_to": "household", "concept": "uk.person.count", + "observation_basis": "january_stock", "filters": [ { - "concept": "uk.income.employment.amount", - "operator": "!=", - "value": 0 + "concept": "uk.childcare.is_child_receiving_targeted_childcare", + "equals": true }, { - "concept": "uk.tax.income_tax", - "operator": ">", - "value": 0 + "concept": "uk.geography.country", + "equals": "ENGLAND" } ] }, "bindings": { "policyengine": { - "metric_name": "hmrc/employment_income/count", + "metric_name": "dfe/funded_childcare/early_learning_2_year_olds", "value_variable": "person_count", "from_entity": "person", "map_to": "household", "filters": [ { - "variable": "employment_income", - "operator": "!=", - "value": 0 + "variable": "is_child_receiving_targeted_childcare", + "equals": true }, { - "variable": "income_tax", - "operator": ">", - "value": 0 + "variable": "country", + "equals": "ENGLAND" } - ] + ], + "notes": "Caseload only; the published 74.8% denominator is not transferred into the model take-up rate." }, "axiom": { - "metric_name": "hmrc/employment_income/count", + "metric_name": "dfe/funded_childcare/early_learning_2_year_olds", "status": "pending", "value_rule": "uk.person.count" } }, "ledger_selector": { - "source_name": "hmrc", - "source_measure_id": "employment_income_count", - "record_set_spec_id": [ - "uk.local_geography.spi_income.by_constituency.v1", - "uk.local_geography.spi_income.by_local_authority.v1" - ] + "source_name": "dfe", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "entity_name": "person", + "dimension_values": { + "entitlement_type": "Early learning for 2-year-olds", + "age": "2 years", + "registration_basis": "registered_children" + } } }, { - "target_id": "ons.age.0_10", - "family": "ons_population", + "target_id": "dfe.funded_childcare.universal_only_children", + "family": "dfe_funded_childcare", "geography_levels": [ - "constituency", - "local_authority" + "country" + ], + "value_operation": "difference", + "value_operands": [ + { + "role": "minuend", + "source_concept": "dfe.number_of_registered_children_nursery", + "source_measure_id": "registered_children_nursery_count", + "dimension_values": { + "entitlement_type": "Universal", + "age": "Total" + } + }, + { + "role": "subtrahend", + "source_concept": "dfe.number_of_registered_children", + "source_measure_id": "registered_children_count", + "dimension_values": { + "entitlement_type": "Working parents", + "age": "3 to 4 years" + } + } ], "measurement": { "entity": "person", "map_to": "household", "concept": "uk.person.count", + "observation_basis": "january_stock", "filters": [ { - "concept": "uk.demographics.age", - "lower": 0, - "upper": 10 + "concept": "uk.childcare.is_child_receiving_universal_childcare", + "equals": true + }, + { + "concept": "uk.geography.country", + "equals": "ENGLAND" } ] }, "bindings": { "policyengine": { - "metric_name": "age/0_10", + "metric_name": "dfe/funded_childcare/universal_only_children", "value_variable": "person_count", "from_entity": "person", "map_to": "household", "filters": [ { - "variable": "age", - "lower": 0, - "upper": 10 + "variable": "is_child_receiving_universal_childcare", + "equals": true + }, + { + "variable": "country", + "equals": "ENGLAND" } - ] + ], + "notes": "Universal-only caseload is the declared difference between the overlapping published universes; no entitlement spending row is bound." }, "axiom": { - "metric_name": "age/0_10", + "metric_name": "dfe/funded_childcare/universal_only_children", "status": "pending", "value_rule": "uk.person.count" } }, "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_0_10.v1" + "source_name": "dfe", + "entity_name": "person" } }, { - "target_id": "ons.age.10_20", - "family": "ons_population", + "target_id": "dft.bus_fare_receipts.england", + "family": "dft_local_bus", "geography_levels": [ - "constituency", - "local_authority" + "country" ], "measurement": { - "entity": "person", - "map_to": "household", - "concept": "uk.person.count", + "entity": "household", + "concept": "uk.transport.bus_fare.amount", + "observation_basis": "fiscal_year_flow", "filters": [ { - "concept": "uk.demographics.age", - "lower": 10, - "upper": 20 + "concept": "uk.geography.country", + "equals": "ENGLAND" } ] }, "bindings": { "policyengine": { - "metric_name": "age/10_20", - "value_variable": "person_count", - "from_entity": "person", - "map_to": "household", + "metric_name": "dft/bus_fare_receipts/england", + "value_variable": "bus_fare_spending", "filters": [ { - "variable": "age", - "lower": 10, - "upper": 20 - } + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "DfT closing-year label: period 2025 means YE March 2025. BUS05i is consumed; NTS0705a and BUS0415 are not consumed pending #790." + }, + "axiom": { + "metric_name": "dft/bus_fare_receipts/england", + "status": "pending", + "value_rule": "uk.transport.bus_fare.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_passenger_fare_receipts", + "layout_groupby_value_id": "england", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_net_support.england", + "family": "dft_local_bus", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_support.amount", + "observation_basis": "fiscal_year_flow", + "filters": [ + { + "concept": "uk.geography.country", + "equals": "ENGLAND" + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_net_support/england", + "value_variable": "bus_subsidy_spending", + "filters": [ + { + "variable": "country", + "equals": "ENGLAND" + } + ], + "notes": "DfT closing-year label: period 2025 means YE March 2025. BUS05i is consumed; BUS0415 is not selectable for support." + }, + "axiom": { + "metric_name": "dft/bus_net_support/england", + "status": "pending", + "value_rule": "uk.transport.bus_support.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_total_estimated_net_support", + "layout_groupby_value_id": "england", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_fare_receipts.london", + "family": "dft_local_bus", + "geography_levels": [ + "region" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_fare.amount", + "observation_basis": "fiscal_year_flow" + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_fare_receipts/london", + "value_variable": "bus_fare_spending", + "filters": [ + { + "variable": "region", + "operator": "==", + "value": "LONDON" + } + ] + }, + "axiom": { + "metric_name": "dft/bus_fare_receipts/london", + "status": "pending", + "value_rule": "uk.transport.bus_fare.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_passenger_fare_receipts", + "layout_groupby_value_id": "london", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_net_support.london", + "family": "dft_local_bus", + "geography_levels": [ + "region" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_support.amount", + "observation_basis": "fiscal_year_flow" + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_net_support/london", + "value_variable": "bus_subsidy_spending", + "filters": [ + { + "variable": "region", + "operator": "==", + "value": "LONDON" + } + ] + }, + "axiom": { + "metric_name": "dft/bus_net_support/london", + "status": "pending", + "value_rule": "uk.transport.bus_support.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_total_estimated_net_support", + "layout_groupby_value_id": "london", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_fare_receipts.england_outside_london", + "family": "dft_local_bus", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_fare.amount", + "observation_basis": "fiscal_year_flow" + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_fare_receipts/england_outside_london", + "value_variable": "bus_fare_spending", + "filters": [ + { + "variable": "country", + "operator": "==", + "value": "ENGLAND" + }, + { + "variable": "region", + "operator": "!=", + "value": "LONDON" + } + ] + }, + "axiom": { + "metric_name": "dft/bus_fare_receipts/england_outside_london", + "status": "pending", + "value_rule": "uk.transport.bus_fare.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_passenger_fare_receipts", + "layout_groupby_value_id": "england_outside_london", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_net_support.england_outside_london", + "family": "dft_local_bus", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_support.amount", + "observation_basis": "fiscal_year_flow" + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_net_support/england_outside_london", + "value_variable": "bus_subsidy_spending", + "filters": [ + { + "variable": "country", + "operator": "==", + "value": "ENGLAND" + }, + { + "variable": "region", + "operator": "!=", + "value": "LONDON" + } + ] + }, + "axiom": { + "metric_name": "dft/bus_net_support/england_outside_london", + "status": "pending", + "value_rule": "uk.transport.bus_support.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_total_estimated_net_support", + "layout_groupby_value_id": "england_outside_london", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_fare_receipts.uk", + "family": "dft_local_bus", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_fare.amount", + "observation_basis": "fiscal_year_flow" + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_fare_receipts/uk", + "value_variable": "bus_fare_spending" + }, + "axiom": { + "metric_name": "dft/bus_fare_receipts/uk", + "status": "pending", + "value_rule": "uk.transport.bus_fare.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_passenger_fare_receipts", + "layout_groupby_value_id": "uk", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "dft.bus_net_support.uk", + "family": "dft_local_bus", + "geography_levels": [ + "country" + ], + "measurement": { + "entity": "household", + "concept": "uk.transport.bus_support.amount", + "observation_basis": "fiscal_year_flow" + }, + "bindings": { + "policyengine": { + "metric_name": "dft/bus_net_support/uk", + "value_variable": "bus_subsidy_spending" + }, + "axiom": { + "metric_name": "dft/bus_net_support/uk", + "status": "pending", + "value_rule": "uk.transport.bus_support.amount" + } + }, + "ledger_selector": { + "source_name": "dft", + "source_concept": "dft.local_bus_total_estimated_net_support", + "layout_groupby_value_id": "uk", + "entity_name": "institutional_sector", + "period_type": "fiscal_year" + } + }, + { + "target_id": "hmrc.self_employment_income.amount", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.income.self_employment.amount", + "filters": [ + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/self_employment_income/amount", + "value_variable": "self_employment_income", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "axiom": { + "metric_name": "hmrc/self_employment_income/amount", + "status": "pending", + "value_rule": "uk.income.self_employment.amount" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_measure_id": [ + "self_employment_income_count", + "self_employment_income_mean" + ], + "record_set_spec_id": [ + "uk.local_geography.spi_income.by_constituency.v1", + "uk.local_geography.spi_income.by_local_authority.v1" + ] + }, + "selector_note": "No Chronicle amount fact exists; count_x_mean consumes the ordered count and mean facts from the same SPI area record-set spec." + }, + { + "target_id": "hmrc.self_employment_income.count", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.income.self_employment.amount", + "operator": "!=", + "value": 0 + }, + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/self_employment_income/count", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "self_employment_income", + "operator": "!=", + "value": 0 + }, + { + "variable": "income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "axiom": { + "metric_name": "hmrc/self_employment_income/count", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_measure_id": "self_employment_income_count", + "record_set_spec_id": [ + "uk.local_geography.spi_income.by_constituency.v1", + "uk.local_geography.spi_income.by_local_authority.v1" + ] + } + }, + { + "target_id": "hmrc.employment_income.amount", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.income.employment.amount", + "filters": [ + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/employment_income/amount", + "value_variable": "employment_income", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "axiom": { + "metric_name": "hmrc/employment_income/amount", + "status": "pending", + "value_rule": "uk.income.employment.amount" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_measure_id": [ + "employment_income_count", + "employment_income_mean" + ], + "record_set_spec_id": [ + "uk.local_geography.spi_income.by_constituency.v1", + "uk.local_geography.spi_income.by_local_authority.v1" + ] + }, + "selector_note": "No Chronicle amount fact exists; count_x_mean consumes the ordered count and mean facts from the same SPI area record-set spec." + }, + { + "target_id": "hmrc.employment_income.count", + "family": "hmrc", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.income.employment.amount", + "operator": "!=", + "value": 0 + }, + { + "concept": "uk.tax.income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "hmrc/employment_income/count", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "employment_income", + "operator": "!=", + "value": 0 + }, + { + "variable": "income_tax", + "operator": ">", + "value": 0 + } + ] + }, + "axiom": { + "metric_name": "hmrc/employment_income/count", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_name": "hmrc", + "source_measure_id": "employment_income_count", + "record_set_spec_id": [ + "uk.local_geography.spi_income.by_constituency.v1", + "uk.local_geography.spi_income.by_local_authority.v1" + ] + } + }, + { + "target_id": "ons.age.0_10", + "family": "ons_population", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.age", + "lower": 0, + "upper": 10 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "age/0_10", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "age", + "lower": 0, + "upper": 10 + } + ] + }, + "axiom": { + "metric_name": "age/0_10", + "status": "pending", + "value_rule": "uk.person.count" + } + }, + "ledger_selector": { + "source_measure_id": "population", + "record_set_spec_id": "uk.local_geography.population.age_0_10.v1" + } + }, + { + "target_id": "ons.age.10_20", + "family": "ons_population", + "geography_levels": [ + "constituency", + "local_authority" + ], + "measurement": { + "entity": "person", + "map_to": "household", + "concept": "uk.person.count", + "filters": [ + { + "concept": "uk.demographics.age", + "lower": 10, + "upper": 20 + } + ] + }, + "bindings": { + "policyengine": { + "metric_name": "age/10_20", + "value_variable": "person_count", + "from_entity": "person", + "map_to": "household", + "filters": [ + { + "variable": "age", + "lower": 10, + "upper": 20 + } ] }, "axiom": { @@ -11733,19 +12395,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_a", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "A"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "A" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_a", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "A"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "A" + } + ] }, - "axiom": {"metric_name": "council_tax/band_a", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_a", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11757,19 +12435,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_b", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "B"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "B" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_b", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "B"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "B" + } + ] }, - "axiom": {"metric_name": "council_tax/band_b", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_b", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11781,19 +12475,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_c", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "C"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "C" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_c", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "C"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "C" + } + ] }, - "axiom": {"metric_name": "council_tax/band_c", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_c", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11805,19 +12515,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_d", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "D"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "D" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_d", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "D"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "D" + } + ] }, - "axiom": {"metric_name": "council_tax/band_d", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_d", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11829,19 +12555,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_e", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "E"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "E" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_e", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "E"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "E" + } + ] }, - "axiom": {"metric_name": "council_tax/band_e", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_e", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11853,19 +12595,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_f", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "F"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "F" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_f", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "F"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "F" + } + ] }, - "axiom": {"metric_name": "council_tax/band_f", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_f", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11877,19 +12635,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_g", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "G"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "G" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_g", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "G"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "G" + } + ] }, - "axiom": {"metric_name": "council_tax/band_g", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_g", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", @@ -11901,19 +12675,35 @@ { "target_id": "voa.council_tax_stock.by_area.band_h", "family": "council_tax_stock", - "geography_levels": ["local_authority"], + "geography_levels": [ + "local_authority" + ], "measurement": { "entity": "household", "concept": "uk.household.count", - "filters": [{"concept": "uk.housing.council_tax_band", "equals": "H"}] + "filters": [ + { + "concept": "uk.housing.council_tax_band", + "equals": "H" + } + ] }, "bindings": { "policyengine": { "metric_name": "council_tax/band_h", "value_variable": "household_count", - "filters": [{"variable": "council_tax_band", "equals": "H"}] + "filters": [ + { + "variable": "council_tax_band", + "equals": "H" + } + ] }, - "axiom": {"metric_name": "council_tax/band_h", "status": "pending", "value_rule": "uk.household.count"} + "axiom": { + "metric_name": "council_tax/band_h", + "status": "pending", + "value_rule": "uk.household.count" + } }, "ledger_selector": { "source_name": "voa", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/data_target_parity.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/data_target_parity.py index 131d27660..96d22d57a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/data_target_parity.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/data_target_parity.py @@ -442,7 +442,7 @@ def _fence(origin: str, purpose: str, verdict_basis: str) -> dict[str, str]: "concern_id": "dataset_anchor_bus_subsidy_and_fares", "status": "routed", "classification": "imputation_anchor", - "reason": "BUS05 subsidy/fare totals and the NTS0705 quintile IPF belong to WS-E/F (#148).", + "reason": "BUS05 subsidy/fare totals are consumed by the #789 rows; the NTS0705 quintile gradient remains routed to WS-E/F (#148).", "evidence": "uk-data datasets/imputations/services/services.py:33 and datasets/imputations/consumption.py:790,830; Chronicle#200/#202.", "fence": _fence( "uk-data post-imputation-rescaled bus subsidy and fares, including London share and quintile rates.", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py index 186e820cb..313d3e48d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/diagnostics.py @@ -832,6 +832,11 @@ def uk_calibration_diagnostics_payload( "weights": weights, "zero_weight_rows_by_stratum": strata, "target_pass_rates_by_geography_level": pass_rates, + "target_observation_basis": { + spec.to_target().row_name: str(spec.metadata["observation_basis"]) + for spec in registry.specs + if spec.metadata.get("observation_basis") + }, } if local_area_support is not None: uk_diagnostics["weakest_families"] = uk_weakest_families(target_rows) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_person_draws.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_person_draws.py index 5e88e2467..9c80c14aa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_person_draws.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/frs_person_draws.py @@ -25,9 +25,17 @@ "would_claim_marriage_allowance", "would_claim_scp", "attends_private_school_random_draw", + "tax_free_childcare_spend_routed_share", ) -FRS_PERSON_DRAW_NONNEGATIVE_OUTPUT_COLUMNS = ("attends_private_school_random_draw",) -UK_PERSON_DRAW_DECLARED_SEEDS = {output: 0 for output in FRS_PERSON_DRAW_OUTPUT_COLUMNS} +FRS_PERSON_DRAW_NONNEGATIVE_OUTPUT_COLUMNS = ( + "attends_private_school_random_draw", + "tax_free_childcare_spend_routed_share", +) +UK_PERSON_DRAW_DECLARED_SEEDS = { + output: 0 + for output in FRS_PERSON_DRAW_OUTPUT_COLUMNS + if output != "tax_free_childcare_spend_routed_share" +} @dataclass(frozen=True) @@ -46,6 +54,13 @@ def output_columns() -> tuple[str, ...]: def add_frs_person_draws(frame: Frame, *, contract: UKTakeUpContract) -> Frame: + period = uk_time_period(frame) + if int(str(period).split("-", maxsplit=1)[0]) != contract.build_year: + raise ValueError( + "frs_person_draws assign_period_constant requires the frame time " + f"period {period!r} to equal contract build_year {contract.build_year}." + ) + _require_tax_free_childcare_routed_share_variable() person = frame.table("person").copy() derived = derive_frs_person_draws(person, contract=contract) for column in FRS_PERSON_DRAW_OUTPUT_COLUMNS: @@ -54,7 +69,7 @@ def add_frs_person_draws(frame: Frame, *, contract: UKTakeUpContract) -> Frame: person=person, benunit=frame.table("benunit").copy(), household=frame.table("household").copy(), - time_period=uk_time_period(frame), + time_period=period, weight_kind=uk_household_weight_kind(frame), household_weights=frame.weights_for("household").values, mass_log=frame.mass_log, @@ -81,9 +96,32 @@ def derive_frs_person_draws( values["attends_private_school_random_draw"] = _draws( ids, "attends_private_school_random_draw" ) + entry = contract.entry("tax_free_childcare_spend_routed_share") + if entry.raw.get("entity") != "person": + raise ValueError( + "tax_free_childcare_spend_routed_share contract entry must declare " + "entity='person'." + ) + values["tax_free_childcare_spend_routed_share"] = contract.rate( + "tax_free_childcare_spend_routed_share", contract.build_year + ) return values +def _require_tax_free_childcare_routed_share_variable() -> None: + """Fail before export when an installed UK engine cannot consume the input.""" + + try: + import policyengine_uk + except ImportError: + return + variable = "tax_free_childcare_spend_routed_share" + if variable not in policyengine_uk.CountryTaxBenefitSystem().variables: + raise ValueError( + f"Required variable {variable!r} is not defined in policyengine-uk." + ) + + def _draws(ids: np.ndarray, output: str) -> np.ndarray: return stable_identity_uniforms( ids, seed=UK_PERSON_DRAW_DECLARED_SEEDS[output], salt=output diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py index 62f316bd0..6e68a56c6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -425,6 +425,7 @@ def _cells( _Cell("person", "would_claim_marriage_allowance", "bool"), _Cell("person", "would_claim_scp", "bool"), _Cell("person", "attends_private_school_random_draw", "float64"), + _Cell("person", "tax_free_childcare_spend_routed_share", "float64"), ), "frs_household_draws": _cells( "household", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py index eb1bd87ca..682533863 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/take_up_contract.py @@ -29,6 +29,7 @@ "frozen_by_adjudication", } ) +UK_ALLOWED_RATE_ENTITIES = frozenset({"person", "benunit", "household"}) @dataclass(frozen=True) @@ -167,6 +168,12 @@ def _entries(values: object, *, section: str) -> tuple[UKRateEntry, ...]: if key in seen: raise ValueError(f"duplicate UK take-up contract key {key!r}.") seen.add(key) + entity = item.get("entity") + if entity not in UK_ALLOWED_RATE_ENTITIES: + raise ValueError( + f"UK take-up contract {key!r} has invalid entity {entity!r}; " + f"expected one of {sorted(UK_ALLOWED_RATE_ENTITIES)}." + ) entry_values = item.get("values") if not isinstance(entry_values, Mapping) or not entry_values: raise ValueError(f"UK take-up contract {key!r} requires values.") diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py index cb086f903..80b2faec9 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py @@ -216,6 +216,7 @@ def __post_init__(self) -> None: "person.sic_industry_division", "person.student_loan_balance", "person.student_loan_plan", + "person.tax_free_childcare_spend_routed_share", "person.would_claim_marriage_allowance", "person.would_claim_scp", ) diff --git a/packages/microcosm-build/tests/fixtures/uk_bus05i_fy2025.json b/packages/microcosm-build/tests/fixtures/uk_bus05i_fy2025.json new file mode 100644 index 000000000..b5365cf4b --- /dev/null +++ b/packages/microcosm-build/tests/fixtures/uk_bus05i_fy2025.json @@ -0,0 +1,12 @@ +{ + "source_package": "dft-bus05i-revenue-support-2025", + "source_sha256": "a65ad97d70982bc572a8ff7415182c1b350166fc2e485e37f5678f3dbaa12fa5", + "rows": [ + {"aggregate_fact_key": "ledger.aggregate_fact.v2:2ece7c3d283b6de43b30389f", "source_concept": "dft.local_bus_passenger_fare_receipts", "groupby_value_id": "england", "period": {"type": "fiscal_year", "value": 2025}, "unit": "gbp", "value": 3417388656.43538}, + {"aggregate_fact_key": "ledger.aggregate_fact.v2:33611c64d2048fe660501802", "source_concept": "dft.local_bus_passenger_fare_receipts", "groupby_value_id": "london", "period": {"type": "fiscal_year", "value": 2025}, "unit": "gbp", "value": 1347434943.01459}, + {"aggregate_fact_key": "ledger.aggregate_fact.v2:465d300355c85e7c498397dd", "source_concept": "dft.local_bus_passenger_fare_receipts", "groupby_value_id": "england_outside_london", "period": {"type": "fiscal_year", "value": 2025}, "unit": "gbp", "value": 2069953713.42079}, + {"aggregate_fact_key": "ledger.aggregate_fact.v2:a12dfcdc0662c8a5e48bf003", "source_concept": "dft.local_bus_total_estimated_net_support", "groupby_value_id": "england", "period": {"type": "fiscal_year", "value": 2025}, "unit": "gbp", "value": 3024904320.8399997}, + {"aggregate_fact_key": "ledger.aggregate_fact.v2:d8e40cee2fc723b719ff4680", "source_concept": "dft.local_bus_total_estimated_net_support", "groupby_value_id": "london", "period": {"type": "fiscal_year", "value": 2025}, "unit": "gbp", "value": 1130214000}, + {"aggregate_fact_key": "ledger.aggregate_fact.v2:7ab0c5007c9a6ad38aaa1468", "source_concept": "dft.local_bus_total_estimated_net_support", "groupby_value_id": "england_outside_london", "period": {"type": "fiscal_year", "value": 2025}, "unit": "gbp", "value": 1894690320.84} + ] +} 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 da610a263..98b4b5108 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,4 +1,4 @@ -{"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: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": "tax_unit", "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"} diff --git a/packages/microcosm-build/tests/test_country_spec.py b/packages/microcosm-build/tests/test_country_spec.py index 38f9cd437..685f6964d 100644 --- a/packages/microcosm-build/tests/test_country_spec.py +++ b/packages/microcosm-build/tests/test_country_spec.py @@ -931,6 +931,7 @@ def test_spi_spine_adds_no_country_package_resources(self) -> None: "regional_land_values.json", "source_stages.json", "take_up_contract.json", + "target_reference_signed_exclusions.json", "input_mass_reviewed_exclusions.json", "spine_swap_signed_differences.json", "spine_candidate_acceptance.json", @@ -1022,6 +1023,7 @@ def test_uk_package_loads(self) -> None: "regional_land_values.json", "source_stages.json", "take_up_contract.json", + "target_reference_signed_exclusions.json", "input_mass_reviewed_exclusions.json", "spine_swap_signed_differences.json", "spine_candidate_acceptance.json", @@ -1055,7 +1057,7 @@ 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) == 408 + assert len(references) == 415 assert references["obr.esa"].value_operation == "sum" assert references["dwp.uc.households"].value_operation == ( "calendar_year_average" diff --git a/packages/microcosm-build/tests/test_ledger_targets.py b/packages/microcosm-build/tests/test_ledger_targets.py index cf441548d..2a63040f3 100644 --- a/packages/microcosm-build/tests/test_ledger_targets.py +++ b/packages/microcosm-build/tests/test_ledger_targets.py @@ -1057,6 +1057,152 @@ def test__given_academic_year_record_sets__then_latest_source_period_is_used() - assert registry.specs[0].value == 1_159_761 +def test__given_year_prefixed_record_sets__then_latest_source_period_is_used() -> None: + older = _consumer_fact_row_for_period(2024, value=95_031) + newer = _consumer_fact_row_for_period(2025, value=85_629) + older["layout"]["record_set_id"] = "dfe.release2026.year2024.early_learning" + newer["layout"]["record_set_id"] = "dfe.release2026.year2025.early_learning" + reference = LedgerTargetReference( + name="latest DfE childcare count", + ledger_selector={"source_name": "irs_soi"}, + entity="person", + measure="person_count", + period=2025, + ) + + registry = compile_ledger_target_references( + [older, newer], [reference], country="uk" + ) + + assert registry.specs[0].value == 85_629 + + +def test__given_one_difference_fact_per_operand__then_difference_compiles() -> None: + minuend = _consumer_fact_row_for_period(2025, value=775_994) + subtrahend = _consumer_fact_row_for_period(2025, value=379_029) + minuend["dimensions"] = {"entitlement_type": "Universal"} + subtrahend["dimensions"] = {"entitlement_type": "Working parents"} + reference = LedgerTargetReference( + name="universal-only childcare", + ledger_selector={"source_name": "irs_soi"}, + value_operation="difference", + value_operands=( + { + "role": "minuend", + "dimension_values": {"entitlement_type": "Universal"}, + }, + { + "role": "subtrahend", + "dimension_values": {"entitlement_type": "Working parents"}, + }, + ), + entity="person", + measure="person_count", + period=2025, + ) + + registry = compile_ledger_target_references( + [minuend, subtrahend], [reference], country="uk" + ) + + assert registry.specs[0].value == 396_965 + assert registry.specs[0].metadata["ledger_value_formula"] == ( + "minuend - subtrahend" + ) + assert json.loads(registry.specs[0].metadata["ledger_member_fact_keys"]) == [ + minuend["aggregate_fact_key"], + subtrahend["aggregate_fact_key"], + ] + + +@pytest.mark.parametrize( + ("minuend_value", "subtrahend_value"), + [(1.0, 2.0), (1e308, -1e308)], +) +def test__given_invalid_difference__then_compilation_refuses_it( + minuend_value: float, subtrahend_value: float +) -> None: + minuend = _consumer_fact_row_for_period(2025, value=minuend_value) + subtrahend = _consumer_fact_row_for_period(2025, value=subtrahend_value) + minuend["dimensions"] = {"role": "whole"} + subtrahend["dimensions"] = {"role": "part"} + reference = LedgerTargetReference( + name="invalid difference", + ledger_selector={"source_name": "irs_soi"}, + value_operation="difference", + value_operands=( + {"role": "minuend", "dimension_values": {"role": "whole"}}, + {"role": "subtrahend", "dimension_values": {"role": "part"}}, + ), + entity="person", + measure="person_count", + period=2025, + ) + + with pytest.raises(ValueError, match="difference produced invalid value"): + compile_ledger_target_references( + [minuend, subtrahend], [reference], country="uk" + ) + + +def test__given_difference_operands_at_different_periods__then_compilation_fails() -> ( + None +): + minuend = _consumer_fact_row_for_period(2025, value=10.0) + subtrahend = _consumer_fact_row_for_period(2024, value=2.0) + minuend["dimensions"] = {"role": "whole"} + subtrahend["dimensions"] = {"role": "part"} + reference = LedgerTargetReference( + name="period-mismatched difference", + ledger_selector={"source_name": "irs_soi"}, + value_operation="difference", + value_operands=( + {"role": "minuend", "dimension_values": {"role": "whole"}}, + {"role": "subtrahend", "dimension_values": {"role": "part"}}, + ), + entity="person", + measure="person_count", + period=2025, + ) + + with pytest.raises(ValueError, match="same latest period"): + compile_ledger_target_references( + [minuend, subtrahend], [reference], country="uk" + ) + + +def test__given_sum_member_shortfall__then_compilation_fails_loudly() -> None: + only_member = _consumer_fact_row_for_period(2025, value=10.0) + reference = LedgerTargetReference( + name="guarded sum", + ledger_selector={"source_name": "irs_soi"}, + value_operation="sum", + expected_member_count=2, + entity="person", + measure="person_count", + period=2025, + ) + + with pytest.raises(ValueError, match="expected 2 members.*resolved 1"): + compile_ledger_target_references([only_member], [reference], country="uk") + + +def test__given_identifier_bypasses_selector__then_entity_pin_still_applies() -> None: + fact = _consumer_fact_row_for_period(2025, value=10.0) + fact["entity"] = {"name": "government"} + reference = LedgerTargetReference( + name="entity-guarded reference", + ledger_fact_key=fact["aggregate_fact_key"], + ledger_selector={"entity_name": "person"}, + entity="person", + measure="person_count", + period=2025, + ) + + with pytest.raises(ValueError, match="requires entity_name 'person'"): + compile_ledger_target_references([fact], [reference], country="uk") + + def test__given_selector_matches_future_year__then_latest_eligible_period_is_used() -> ( None ): 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 3bb3d801a..1e791eade 100644 --- a/packages/microcosm-build/tests/test_spec_engine_country_bundles.py +++ b/packages/microcosm-build/tests/test_spec_engine_country_bundles.py @@ -55,7 +55,7 @@ ), ( "uk", - "5751a2b7b6ea771c6c885f62438927603e6acec3d1bdacbbbced2a1088b69175", + "cfb76f76cf42b9dedf640dfcb8a86a66ba8757da3b672179ad5754b61a2099fc", { "benunit.benunit_id", "household.household_id", diff --git a/packages/microcosm-build/tests/test_uk_battery_bindings.py b/packages/microcosm-build/tests/test_uk_battery_bindings.py index 71346837b..7e35a0888 100644 --- a/packages/microcosm-build/tests/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/test_uk_battery_bindings.py @@ -55,9 +55,9 @@ KEY = base64.b64encode(b"\x07" * 32).decode("ascii") #: The shared exclusion-expiry clock, fixed inside the committed register's -#: validity window (approved 2026-08-10, expires 2027-02-10) so the suite +#: validity window (latest approval 2026-09-05, expires 2027-02-10) so the suite #: never drifts across an expiry boundary. -CLOCK = date(2026, 9, 1) +CLOCK = date(2026, 9, 5) VALIDATE_REFERENCE = ( "microcosm.build.uk_runtime.weighted_integrity." diff --git a/packages/microcosm-build/tests/test_uk_bus_targets.py b/packages/microcosm-build/tests/test_uk_bus_targets.py new file mode 100644 index 000000000..57f0988b4 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_bus_targets.py @@ -0,0 +1,96 @@ +from __future__ import annotations + +import json +from importlib import resources as importlib_resources +from pathlib import Path + +import pytest + +FIXTURE = Path(__file__).parent / "fixtures" / "uk_bus05i_fy2025.json" +BUS_PREFIX = "dft.bus_" + + +def _resource(name: str) -> dict: + return json.loads( + importlib_resources.files("microcosm.build.uk").joinpath(name).read_text() + ) + + +def test_bus05i_fy2025_subareas_reconcile_to_england() -> None: + fixture = json.loads(FIXTURE.read_text()) + rows = fixture["rows"] + + assert len(rows) == 6 + assert {row["period"]["type"] for row in rows} == {"fiscal_year"} + assert {row["period"]["value"] for row in rows} == {2025} + assert {row["unit"] for row in rows} == {"gbp"} + + for concept in { + "dft.local_bus_passenger_fare_receipts", + "dft.local_bus_total_estimated_net_support", + }: + values = { + row["groupby_value_id"]: row["value"] + for row in rows + if row["source_concept"] == concept + } + assert values["london"] + values["england_outside_london"] == pytest.approx( + values["england"], abs=1_000 + ) + + +def test_bus_targets_are_active_or_signed_excluded_as_declared() -> None: + contract = _resource("uk_population_targets.json") + references = { + row["name"] for row in _resource("target_references.json")["target_references"] + } + membership = _resource("target_reference_membership.json") + exclusions = { + row["target_id"]: row + for row in _resource("target_reference_signed_exclusions.json")["exclusions"] + } + bus = { + row["target_id"]: row + for row in contract["targets"] + if row["target_id"].startswith(BUS_PREFIX) + } + + active = {"dft.bus_fare_receipts.england", "dft.bus_net_support.england"} + excluded = set(bus) - active + assert len(bus) == 8 + assert active <= references + assert excluded.isdisjoint(references) + assert set(exclusions) >= excluded + assert {exclusions[target_id]["reason_id"] for target_id in excluded} == { + "region_pin_unsupported", + "statistical_scope_unsupported", + "no_publisher_uk_total", + } + assert all( + membership["targets"][target_id]["status"] == "signed_excluded" + for target_id in excluded + ) + + +def test_bus_selectors_do_not_consume_nts_or_bus0415() -> None: + targets = [ + row + for row in _resource("uk_population_targets.json")["targets"] + if row["target_id"].startswith(BUS_PREFIX) + ] + selected_concepts = { + row["ledger_selector"].get("source_concept", "") for row in targets + } + + assert selected_concepts == { + "dft.local_bus_passenger_fare_receipts", + "dft.local_bus_total_estimated_net_support", + } + england_notes = " ".join( + row["bindings"]["policyengine"]["notes"] + for row in targets + if row["target_id"].endswith("england") + ) + assert "NTS0705a" in england_notes + assert "BUS0415" in england_notes + assert "#790" in england_notes diff --git a/packages/microcosm-build/tests/test_uk_childcare_targets.py b/packages/microcosm-build/tests/test_uk_childcare_targets.py new file mode 100644 index 000000000..332e86e29 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_childcare_targets.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +import inspect +import json +from importlib import resources as importlib_resources + +import pytest + +pytestmark = pytest.mark.requires_uk + + +def _system(): + from policyengine_uk import CountryTaxBenefitSystem + + return CountryTaxBenefitSystem() + + +def test_childcare_target_formula_contracts_match_the_installed_engine() -> None: + system = _system() + universal_source = inspect.getsource( + system.variables["universal_childcare_entitlement_eligible"].formula + ) + tax_free_source = inspect.getsource(system.variables["tax_free_childcare"].formula) + + assert "~has_extended_childcare" in universal_source + assert "tax_free_childcare_spend_routed_share" in tax_free_source + + for name in ( + "is_child_receiving_tax_free_childcare", + "is_child_receiving_extended_childcare", + "is_child_receiving_targeted_childcare", + "is_child_receiving_universal_childcare", + ): + variable = system.variables[name] + assert variable.entity.key == "person", name + assert variable.value_type is bool, name + + +def test_extended_childcare_age_one_hours_change_on_2025_01_01() -> None: + system = _system() + + before = system.parameters("2024-12-31").gov.dfe.extended_childcare_entitlement + after = system.parameters("2025-01-01").gov.dfe.extended_childcare_entitlement + + assert before.hours.calc(1) == 0 + assert after.hours.calc(1) == 15 + + +def test_childcare_activation_preserves_existing_calibration_gates() -> None: + from microcosm.build.uk_runtime.national_doctrine import ( + UK_NATIONAL_SOLVE_DOCTRINE, + ) + + gates = json.loads( + importlib_resources.files("microcosm.build.uk") + .joinpath("gates.json") + .read_text() + )["gates"] + by_id = {gate["id"]: gate for gate in gates} + + assert by_id["uk_target_fit"]["criticality"] == "release_blocking" + assert by_id["uk_target_fit"]["parameters"]["max_abs_relative_error"] == 0.25 + assert by_id["uk_calibration_reference_coverage"]["criticality"] == ( + "release_blocking" + ) + assert UK_NATIONAL_SOLVE_DOCTRINE.target_weight_rule == "uniform" diff --git a/packages/microcosm-build/tests/test_uk_diagnostics.py b/packages/microcosm-build/tests/test_uk_diagnostics.py index ee5ad4734..a771c9b95 100644 --- a/packages/microcosm-build/tests/test_uk_diagnostics.py +++ b/packages/microcosm-build/tests/test_uk_diagnostics.py @@ -259,6 +259,9 @@ def _diagnostics_case(*, with_skipped: bool = False): period=2023, source="Synthetic UK diagnostics fixture", family="fixture", + metadata=( + {"observation_basis": "annual_flow"} if row_index == 0 else {} + ), ) ) geography[f"{name}@2023"] = "la" if level == "local_authority" else level @@ -477,6 +480,7 @@ def test_payload_preserves_common_schema_and_adds_versioned_uk_evidence() -> Non "weights", "zero_weight_rows_by_stratum", "target_pass_rates_by_geography_level", + "target_observation_basis", } assert uk["schema_version"] == UK_DIAGNOSTICS_SCHEMA_VERSION assert set(uk["weights"]) == { @@ -497,6 +501,7 @@ def test_payload_preserves_common_schema_and_adds_versioned_uk_evidence() -> Non assert uk["weights"]["ess_fraction"] == pytest.approx( payload["effective_sample_size"] / frame.n("household") ) + assert uk["target_observation_basis"] == {"national_target@2023": "annual_flow"} assert uk["target_pass_rates_by_geography_level"] == [ { "geography_level": "national", @@ -565,6 +570,7 @@ def test_uk_payload_shared_layer_matches_shared_diagnostics_format() -> None: "weights", "zero_weight_rows_by_stratum", "target_pass_rates_by_geography_level", + "target_observation_basis", } diff --git a/packages/microcosm-build/tests/test_uk_frs_stochastic.py b/packages/microcosm-build/tests/test_uk_frs_stochastic.py index 7a72bcf82..c64eda93d 100644 --- a/packages/microcosm-build/tests/test_uk_frs_stochastic.py +++ b/packages/microcosm-build/tests/test_uk_frs_stochastic.py @@ -1,5 +1,7 @@ from __future__ import annotations +from types import SimpleNamespace + import numpy as np import pandas as pd import pytest @@ -44,6 +46,7 @@ class _Contract: "tv_licence_evasion_rate": 0.5, "first_time_buyer_rate": 0.5, "property_purchase_rate": 0.5, + "tax_free_childcare_spend_routed_share": 0.593, } def rate(self, key: str, build_year: int | None = None) -> float: @@ -53,6 +56,12 @@ def continuous_entry(self, key: str): assert key == "maximum_extended_childcare_hours_usage" return {"mean": 15.019, "sd": 4.972, "lower": 0, "upper": 30} + def entry(self, key: str): + assert key == "tax_free_childcare_spend_routed_share" + return SimpleNamespace(raw={"entity": "person"}) + + build_year = 2024 + class _FakeEngine: country = "uk" @@ -62,7 +71,7 @@ def __init__(self, lha_category): def materialize(self, frame, variables, period): assert tuple(variables) == ("LHA_category",) - assert period == "2023" + assert period == "2024" return {"LHA_category": self.lha_category} @@ -90,7 +99,7 @@ def _frame() -> object: person=person, benunit=benunit, household=household, - time_period="2023", + time_period="2024", ) @@ -135,6 +144,7 @@ def test_person_draws_pin_scp_age_six_boundary_and_uniform_draw() -> None: np.testing.assert_array_equal(derived["would_claim_scp"].to_numpy(), expected) private_draws = derived["attends_private_school_random_draw"].to_numpy() assert ((0 <= private_draws) & (private_draws < 1)).all() + assert (derived["tax_free_childcare_spend_routed_share"] == 0.593).all() def test_person_and_household_stage_families_are_deterministic() -> None: diff --git a/packages/microcosm-build/tests/test_uk_national_calibration.py b/packages/microcosm-build/tests/test_uk_national_calibration.py index a259bd24e..0dadc852f 100644 --- a/packages/microcosm-build/tests/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/test_uk_national_calibration.py @@ -41,7 +41,7 @@ from microcosm.calibrate import TargetRegistry, TargetSpec from microcosm.frame import EntitySchema, Frame, WeightKind, Weights -ACTIVE_REFERENCE_COUNT = 408 +ACTIVE_REFERENCE_COUNT = 415 def _uc_reference(**overrides) -> LedgerTargetReference: @@ -72,6 +72,7 @@ def _fact( "aggregate_fact_key": "ledger.aggregate_fact.v2:uc-fixture", "aggregation": {"method": "sum"}, "assertion": "observation", + "entity": {"name": "person"}, "geography": {"level": "country", "id": "K02000001"}, "observed_measure": { "source_name": source_name, @@ -241,6 +242,7 @@ def _fact_for_reference( "aggregate_fact_key": f"ledger.aggregate_fact.v2:{reference.name}", "aggregation": {"method": "sum"}, "assertion": "observation", + "entity": {"name": selector.get("entity_name", reference.entity)}, "dimensions": dimensions, "geography": { "level": selector.get("geography_level", "country"), diff --git a/packages/microcosm-build/tests/test_uk_population_targets.py b/packages/microcosm-build/tests/test_uk_population_targets.py index d780b8c2d..e0ddf8278 100644 --- a/packages/microcosm-build/tests/test_uk_population_targets.py +++ b/packages/microcosm-build/tests/test_uk_population_targets.py @@ -48,6 +48,9 @@ "groupby_dimension", "dimensions", "dimension_values", + "entity_name", + "period_type", + "layout_groupby_value_id", } LOCAL_SELECTOR_KEYS = {"source_name", "source_measure_id", "record_set_spec_id"} POLICYENGINE_BINDING_KEYS = { @@ -158,21 +161,21 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: resource = _load() assert resource["country"] == "uk" - assert resource["allowed_value_operations"] == ["identity", "sum"] + assert resource["allowed_value_operations"] == ["identity", "sum", "difference"] assert resource["resolution_defaults"] == { "base_period_policy": "latest_not_after_build_base_period", "operation": "sum", "assertion_policy": "observed_only", } - assert len(resource["targets"]) == 222 + assert len(resource["targets"]) == 235 target_ids = [target["target_id"] for target in resource["targets"]] registry_scope = resource["registry_parity"]["scope_target_ids"] profile_scope = resource["profile_parity"]["scope_target_ids"] - assert len(registry_scope) == 189 + assert len(registry_scope) == 202 assert len(profile_scope) == 33 - assert target_ids[:189] == registry_scope - assert target_ids[189:] == profile_scope + assert target_ids[:202] == registry_scope + assert target_ids[202:] == profile_scope parity = resource["registry_parity"] assert parity["pinned_ref"] == "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3" @@ -186,7 +189,7 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: assert mapped_target_ids | set(unmapped_declarations) == set(registry_scope) assert all(reason for reason in unmapped_declarations.values()) assert len(mapped_target_ids) == 184 - assert len(unmapped_declarations) == 5 + assert len(unmapped_declarations) == 18 suppressed_ancestors = parity["suppressed_ancestors"] assert len(suppressed_ancestors) == 5 assert set(suppressed_ancestors).isdisjoint(parity["mapped"]) @@ -305,7 +308,7 @@ def test_uk_population_targets_have_unique_target_ids() -> None: resource = _load() target_ids = [target["target_id"] for target in resource["targets"]] - assert len(target_ids) == 222 + assert len(target_ids) == 235 assert len(target_ids) == len(set(target_ids)) @@ -359,6 +362,47 @@ def test_uk_population_targets_declare_selector_vocabularies_and_bindings() -> N assert len(metric_names_seen) == len(set(metric_names_seen)) +def test_childcare_bus_observation_basis_and_entity_pins_are_closed_world() -> None: + resource = _load() + registry_scope = set(resource["registry_parity"]["scope_target_ids"]) + allowed_basis = { + "annual_flow", + "annual_unique_count", + "january_stock", + "fiscal_year_flow", + } + allowed_operations = set(resource["allowed_value_operations"]) + for target in resource["targets"]: + operation = target.get("value_operation", "identity") + assert operation in allowed_operations, target["target_id"] + basis = target["measurement"].get("observation_basis") + if basis is not None: + assert basis in allowed_basis, target["target_id"] + if target["target_id"] in registry_scope and target["measurement"][ + "concept" + ].endswith(".amount"): + assert "entity_name" in target["ledger_selector"], target["target_id"] + + childcare = [ + target + for target in resource["targets"] + if target["family"] == "dfe_funded_childcare" + ] + assert len(childcare) == 3 + assert all( + not target["measurement"]["concept"].endswith(".amount") for target in childcare + ) + + +def test_diagnostic_only_cma_comparator_is_not_a_target() -> None: + resource = _load() + + assert all( + "cma" not in target["target_id"].lower() for target in resource["targets"] + ) + assert all("role" not in target for target in resource["targets"]) + + def test_uk_population_targets_declare_chronicle_loader_guarantees() -> None: resource = _load() registry_scope = set(resource["registry_parity"]["scope_target_ids"]) diff --git a/packages/microcosm-build/tests/test_uk_source_stages.py b/packages/microcosm-build/tests/test_uk_source_stages.py index 657f82fd1..30c2be5a0 100644 --- a/packages/microcosm-build/tests/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/test_uk_source_stages.py @@ -603,6 +603,7 @@ def test_e3_operation_kinds_are_declared_in_order(self) -> None: "assign_binary_from_rate", "assign_binary_from_banded_rates", "assign_uniform_draw", + "assign_period_constant", ] assert [op.kind for op in stages["frs_household_draws"].operations] == [ "assign_binary_from_rate", @@ -926,9 +927,7 @@ def test_e7_declared_seed_lockstep(self) -> None: assert stages["hmrc_spi_income_spine"].operations[2].parameters["seed"] == 42 assert stages["hmrc_spi_income_spine"].operations[3].parameters["seed"] == 43 assert stages["uc_reporter_redraw"].operations[3].parameters["seed"] == 44 - assert ( - stages["uc_capital_coherence"].operations[1].parameters["seed"] == 0 - ) + assert stages["uc_capital_coherence"].operations[1].parameters["seed"] == 0 def test_e8_declared_seed_lockstep(self) -> None: stages = load_country_spec("uk").sources.stage_map() diff --git a/packages/microcosm-build/tests/test_uk_stochastic_tools.py b/packages/microcosm-build/tests/test_uk_stochastic_tools.py index 31dc82019..cb659d549 100644 --- a/packages/microcosm-build/tests/test_uk_stochastic_tools.py +++ b/packages/microcosm-build/tests/test_uk_stochastic_tools.py @@ -2,12 +2,14 @@ import importlib.util from pathlib import Path +from types import SimpleNamespace import numpy as np import pandas as pd import pytest from microcosm.build.uk_runtime.national_frame import uk_national_frame +from microcosm.build.uk_runtime.take_up_contract import load_uk_take_up_contract ROOT = Path(__file__).resolve().parents[3] @@ -21,15 +23,21 @@ def _load_tool(name: str): return module -def test_childcare_draws_use_seeded_default_rng_not_global_seed(monkeypatch) -> None: +def test_childcare_draws_are_identity_keyed_and_hold_hours_fixed(monkeypatch) -> None: tool = _load_tool("fit_uk_childcare_takeup") def forbidden_seed(*args, **kwargs): raise AssertionError("np.random.seed must not be used") monkeypatch.setattr(tool.np.random, "seed", forbidden_seed) - first = tool.draw_childcare_inputs(5, tool.INITIAL_PARAMS, seed=42) - second = tool.draw_childcare_inputs(5, tool.INITIAL_PARAMS, seed=42) + contract = load_uk_take_up_contract() + ids = np.array([5, 4, 3, 2, 1]) + first = tool.draw_childcare_inputs( + ids, tool.INITIAL_PARAMS, seed=42, contract=contract + ) + second = tool.draw_childcare_inputs( + ids, tool.INITIAL_PARAMS, seed=42, contract=contract + ) for key in first: np.testing.assert_array_equal(first[key], second[key]) @@ -42,33 +50,50 @@ def test_childcare_fit_receipt_is_deterministic_with_seeded_runner( input_h5 = tmp_path / "fixture.h5" input_h5.write_bytes(b"synthetic") - def runner(path: Path, params: np.ndarray, seed: int): + targets = {name: float(index + 1) for index, name in enumerate(tool.TARGET_IDS)} + + def runner(path: Path, params: np.ndarray, seed: int, period: int, contract): scale = float(params.sum()) + seed * 0.0 + len(path.read_bytes()) * 0.0 - spending = { - "tfc": 0.63 + scale * 0.0, - "extended": 2.5, - "targeted": 0.6, - "universal": 1.7, - } - caseload = { - "tfc": 985, - "extended": 740, - "targeted": 130, - "universal": 490, - } - return spending, caseload + assert period == 2024 + assert contract.resource_sha256 + return {name: value + scale * 0.0 for name, value in targets.items()} first = tool.fit_childcare_takeup( - input_h5, seed=42, maxiter=1, runner=runner, generated_at="2026-08-17" + input_h5, + seed=42, + maxiter=1, + runner=runner, + generated_at="2026-08-17", + targets=targets, ) second = tool.fit_childcare_takeup( - input_h5, seed=42, maxiter=1, runner=runner, generated_at="2026-08-17" + input_h5, + seed=42, + maxiter=1, + runner=runner, + generated_at="2026-08-17", + targets=targets, ) assert first == second assert first["input_sha256"] assert first["seed"] == 42 - assert first["target_citations"]["tfc"].startswith("HMRC") + assert set(first["params"]) == set(tool.RATE_KEYS) + assert len(first["params"]) == 4 + assert set(first["achieved"]) == set(tool.TARGET_IDS) + + +def test_childcare_fitter_family_allow_list_excludes_entitlement_spending() -> None: + tool = _load_tool("fit_uk_childcare_takeup") + + assert tool.TARGET_IDS == ( + "hmrc.tfc.government_top_up", + "hmrc.tfc.children_with_used_accounts", + "dfe.funded_childcare.working_parent_children_2_to_4", + "dfe.funded_childcare.early_learning_2_year_olds", + "dfe.funded_childcare.universal_only_children", + ) + assert not any("spending" in target_id for target_id in tool.TARGET_IDS[1:]) def test_identity_stability_receipt_compares_by_entity_id() -> None: @@ -100,9 +125,17 @@ def test_e4_identity_receipt_survives_permutation_on_synthetic_frame() -> None: tool = _load_tool("verify_uk_identity_stability") class Contract: - def rate(self, key: str) -> float: + build_year = 2024 + + def rate(self, key: str, build_year: int | None = None) -> float: + if key == "tax_free_childcare_spend_routed_share": + return 0.593 return 0.5 if not key.startswith("scp") else 0.9 + def entry(self, key: str): + assert key == "tax_free_childcare_spend_routed_share" + return SimpleNamespace(raw={"entity": "person"}) + def continuous_entry(self, key: str): return {"mean": 15.019, "sd": 4.972, "lower": 0, "upper": 30} diff --git a/packages/microcosm-build/tests/test_uk_take_up_contract.py b/packages/microcosm-build/tests/test_uk_take_up_contract.py index 76f55e596..402410eef 100644 --- a/packages/microcosm-build/tests/test_uk_take_up_contract.py +++ b/packages/microcosm-build/tests/test_uk_take_up_contract.py @@ -5,6 +5,7 @@ import json from importlib import metadata from importlib.resources import files +from pathlib import Path import pytest @@ -56,6 +57,7 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.1252, 0.384, 0.0385, + 0.593, ] @@ -66,6 +68,18 @@ def test_year_selection_uses_latest_value_at_or_before_build_year() -> None: assert contract.rate("child_benefit", 2023) == 0.89 assert contract.rate("tax_free_childcare", 2024) == 0.88 assert contract.rate("tv_licence_evasion_rate", 2024) == 0.1252 + assert contract.rate("tax_free_childcare_spend_routed_share", 2017) == 0.359 + assert contract.rate("tax_free_childcare_spend_routed_share", 2024) == 0.593 + assert contract.rate("tax_free_childcare_spend_routed_share", 2025) == 0.582 + + +def test_rate_entity_is_closed_world(monkeypatch) -> None: + raw = _resource() + mutated = copy.deepcopy(raw) + mutated["stochastic"][-1]["entity"] = "government" + _reload_with(monkeypatch, mutated) + with pytest.raises(ValueError, match="invalid entity"): + load_uk_take_up_contract() def test_rate_without_source_is_refused(monkeypatch) -> None: @@ -88,7 +102,15 @@ def test_frozen_and_fitted_status_blocks_are_required(monkeypatch) -> None: load_uk_take_up_contract() mutated = copy.deepcopy(raw) - del mutated["continuous"][0]["fitting_receipt"] + mutated["continuous"].append( + { + "key": "synthetic_fitted_entry", + "source": { + "source": "synthetic test source", + "status": "fitted_offline", + }, + } + ) _reload_with(monkeypatch, mutated) with pytest.raises(ValueError, match="fitting_receipt"): load_uk_take_up_contract() @@ -110,6 +132,40 @@ def test_resource_digest_binds_complete_json() -> None: assert uk_take_up_contract_identity(contract)["resource_sha256"] == expected +def test_tfc_routed_share_series_matches_pinned_chronicle_feed_when_present() -> None: + feed = Path(__file__).resolve().parents[3] / ".codex-work/consumer_facts_uk.jsonl" + if not feed.exists(): + pytest.skip("pinned Chronicle UK feed is not present") + + annual: dict[int, float] = {} + monthly: dict[int, list[float]] = {} + matched = 0 + with feed.open(encoding="utf-8") as rows: + for line in rows: + if "hmrc-tax-free-childcare-march-2026" not in line: + continue + row = json.loads(line) + matched += 1 + period = row["period"] + measure = row["observed_measure"]["source_measure_id"] + if measure == "annual_unique_children_with_used_accounts": + annual[int(period["value"])] = float(row["value"]) + elif measure == "monthly_children_with_used_accounts": + year, month = map(int, str(period["value"]).split("-")) + financial_year = year if month >= 4 else year - 1 + monthly.setdefault(financial_year, []).append(float(row["value"])) + + assert matched == 126 + contract = load_uk_take_up_contract() + entry = contract.entry("tax_free_childcare_spend_routed_share") + for year in range(2017, 2026): + assert len(monthly[year]) == 12 + derived = sum(monthly[year]) / annual[year] / 12 + assert round(derived, 3) == entry.values[f"{year}-04-01"] + assert entry.values["2017-04-01"] == 0.359 + assert entry.values["2024-04-01"] == 0.593 + + @pytest.mark.requires_uk def test_engine_version_is_read_dynamically_and_tie_break_absent() -> None: import policyengine_uk diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index 9c650e3e6..28c0cefd4 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -12,6 +12,7 @@ import os import subprocess import sys +from dataclasses import replace from importlib import resources as importlib_resources from pathlib import Path @@ -40,7 +41,7 @@ _value_operation_by_target_id, ) -ACTIVE_REFERENCE_COUNT = 408 +ACTIVE_REFERENCE_COUNT = 415 UK_DATA_REPO = "policyengine-" + "uk-data" FIXTURE_REFERENCE_NAMES = { @@ -212,6 +213,7 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: assert resource["allowed_value_operations"] == [ "identity", "sum", + "difference", "calendar_year_average", "latest_plateau", "count_x_mean", @@ -239,10 +241,14 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: assert reference["measure"] == expected_measure assert reference["family"] == target["family"] assert reference["period"] == 2025 - assert reference["metadata"] == { + expected_metadata = { "contract_target_id": contract_target_id, "measure_kind": "prepared_column", } + observation_basis = target["measurement"].get("observation_basis") + if observation_basis is not None: + expected_metadata["observation_basis"] = observation_basis + assert reference["metadata"] == expected_metadata # The measure is a prepared column, so the pointed-to contract binding # must carry what the microcosm#622 materializer needs to prepare it. assert ( @@ -252,6 +258,77 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: ), contract_target_id +def test_childcare_and_bus_references_compile_with_declared_provenance() -> None: + root = Path(__file__).resolve().parents[3] + feed = root / STABLE_UK_FACT_FEED_NAME + if not feed.is_file(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + + references = [ + reference + for reference in load_country_spec("uk").target_references + if reference.family in {"hmrc_tfc", "dfe_funded_childcare", "dft_local_bus"} + ] + facts = [] + for line in feed.open(): + fact = json.loads(line) + source_name = fact.get("source", {}).get("source_name") or fact.get( + "observed_measure", {} + ).get("source_name") + if source_name in {"hmrc", "dfe", "dft"}: + facts.append(fact) + + registry = compile_ledger_target_references(facts, references, country="uk") + specs = {spec.name: spec for spec in registry.specs} + assert {name: spec.value for name, spec in specs.items()} == { + "hmrc.tfc.government_top_up": 599_800_000.0, + "hmrc.tfc.children_with_used_accounts": 1_151_515.0, + "dfe.funded_childcare.working_parent_children_2_to_4": 621_482.0, + "dfe.funded_childcare.early_learning_2_year_olds": 95_031.0, + "dfe.funded_childcare.universal_only_children": 396_965.0, + "dft.bus_fare_receipts.england": 3_417_388_656.43538, + "dft.bus_net_support.england": 3_024_904_320.8399997, + } + assert { + name: spec.metadata["ledger_entity_name"] for name, spec in specs.items() + } == { + "hmrc.tfc.government_top_up": "government", + "hmrc.tfc.children_with_used_accounts": "person", + "dfe.funded_childcare.working_parent_children_2_to_4": "person", + "dfe.funded_childcare.early_learning_2_year_olds": "person", + "dfe.funded_childcare.universal_only_children": "person", + "dft.bus_fare_receipts.england": "institutional_sector", + "dft.bus_net_support.england": "institutional_sector", + } + assert ( + specs["dfe.funded_childcare.universal_only_children"].metadata[ + "ledger_value_formula" + ] + == "minuend - subtrahend" + ) + + +def test_dfe_extended_sum_refuses_the_suppressed_2024_member() -> None: + root = Path(__file__).resolve().parents[3] + feed = root / STABLE_UK_FACT_FEED_NAME + if not feed.is_file(): + pytest.skip("pinned UK Chronicle consumer feed is not present") + + reference = next( + reference + for reference in load_country_spec("uk").target_references + if reference.name == "dfe.funded_childcare.working_parent_children_2_to_4" + ) + facts = [json.loads(line) for line in feed.open() if '"source_name": "dfe"' in line] + + with pytest.raises(ValueError, match="expected 2 members.*resolved 1"): + compile_ledger_target_references( + facts, + [replace(reference, period=2024)], + country="uk", + ) + + def test_uk_target_references_do_not_bind_known_mismatched_property_amounts() -> None: resource = _load_uk_resource("target_references.json") @@ -423,9 +500,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": 408, + "active": 415, "no_fact_at_or_before_period": 7, - "signed_excluded": 2, + "signed_excluded": 8, } assert membership["genuine_sum_residue"] assert membership["uprating_holds"] diff --git a/packages/microcosm-build/tests/test_uk_terminal_gates.py b/packages/microcosm-build/tests/test_uk_terminal_gates.py index fa78fe628..7fd960622 100644 --- a/packages/microcosm-build/tests/test_uk_terminal_gates.py +++ b/packages/microcosm-build/tests/test_uk_terminal_gates.py @@ -390,13 +390,22 @@ def test_concentrated_qrf_output_fails_by_name() -> None: def test_committed_degenerate_register_is_the_policy_of_record() -> None: register = uk_default_degenerate_reviewed_exclusions() - assert set(register) == {"household.source_year"} + assert set(register) == { + "household.source_year", + "person.tax_free_childcare_spend_routed_share", + } record = register["household.source_year"] assert record.adjudication == "microcosm#630" assert record.approved_by == "juaristi22" assert record.approved_on == "2026-08-10" assert record.expires_on == "2027-02-10" assert record.reason.strip() + routed_share = register["person.tax_free_childcare_spend_routed_share"] + assert routed_share.adjudication == "microcosm#834" + assert routed_share.approved_by == "juaristi22" + assert routed_share.approved_on == "2026-09-05" + assert routed_share.expires_on == "2027-03-05" + assert routed_share.reason.strip() def test_policy_of_record_is_immutable_and_loaded_once() -> None: diff --git a/packages/microcosm-build/tests/test_uk_tfc_routed_share.py b/packages/microcosm-build/tests/test_uk_tfc_routed_share.py new file mode 100644 index 000000000..1e5347afc --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_tfc_routed_share.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.country_spec import load_country_spec +from microcosm.build.uk_runtime.frs_person_draws import ( + UKFRSPersonDrawsStageTransform, +) +from microcosm.build.uk_runtime.national_frame import ( + uk_national_frame, + write_uk_national_frame, +) +from microcosm.build.uk_runtime.take_up_contract import load_uk_take_up_contract + +pytestmark = pytest.mark.requires_uk + + +def _frame(): + return uk_national_frame( + person=pd.DataFrame( + { + "person_id": [1], + "person_benunit_id": [1], + "person_household_id": [1], + "age": [3], + "childcare_expenses": [1_000.0], + "tax_free_childcare_uses_qualifying_provider": [True], + "tax_free_childcare_qualifying_child": [True], + "is_disabled_for_benefits": [False], + "is_blind": [False], + } + ), + benunit=pd.DataFrame( + { + "benunit_id": [1], + "tax_free_childcare_eligible": [True], + "tax_free_childcare_eligible_declaration_periods": [4], + } + ), + household=pd.DataFrame( + { + "household_id": [1], + "region": ["LONDON"], + "council_tax": [0.0], + "tenure_type": ["OWNED_OUTRIGHT"], + "rent": [0.0], + } + ), + household_weights=np.array([1.0]), + time_period="2024", + ) + + +def test_engine_and_manifest_define_person_input_contract() -> None: + import policyengine_uk + + variable = policyengine_uk.CountryTaxBenefitSystem().variables[ + "tax_free_childcare_spend_routed_share" + ] + assert variable.entity.key == "person" + assert variable.is_input_variable() + assert variable.default_value == 1 + + spec = load_country_spec("uk") + stage = spec.sources.stage_map()["frs_person_draws"] + assert "tax_free_childcare_spend_routed_share" in stage.outputs + operation = stage.operations[-1] + assert operation.kind == "assign_period_constant" + assert operation.parameters == { + "contract_key": "tax_free_childcare_spend_routed_share", + "dtype": "float64", + "output": "tax_free_childcare_spend_routed_share", + "period_source": "build_year", + } + + +def test_release_h5_round_trip_preserves_routed_share_and_changes_award( + tmp_path, +) -> None: + import policyengine_uk + from policyengine_uk.data import UKSingleYearDataset + + contract = load_uk_take_up_contract() + routed = UKFRSPersonDrawsStageTransform(contract=contract, stage=None)(_frame()) + routed_path = write_uk_national_frame(routed, tmp_path / "routed.h5") + routed_simulation = policyengine_uk.Microsimulation( + dataset=UKSingleYearDataset(file_path=routed_path) + ) + np.testing.assert_allclose( + routed_simulation.calculate("tax_free_childcare_spend_routed_share", 2024), + [0.593], + ) + + default_path = write_uk_national_frame(_frame(), tmp_path / "default.h5") + default_simulation = policyengine_uk.Microsimulation( + dataset=UKSingleYearDataset(file_path=default_path) + ) + routed_award = np.asarray( + routed_simulation.calculate("tax_free_childcare", 2024), dtype=float + ) + default_award = np.asarray( + default_simulation.calculate("tax_free_childcare", 2024), dtype=float + ) + assert routed_award[0] == pytest.approx(default_award[0] * 0.593) diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index e1c0c6f23..52f58f69f 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -376,13 +376,13 @@ # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "9b489e83111400c2c37345bbe78c9727b738cbffa125e2c378a33cf563d68b7c" + "5a596f72e5412d97d7938864ce44426634f22622655b2a3efcc76aaa4274d485" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "6e2e9c02c6b9d253378b3e77827c5c4599767e7f1b2173aa4687b7fffcedd25d" + "9debdfbc78c4f48734c9851ff14fa88f84788d184ae05bb54558c43e82cc6345" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "b407d0088534ebfbc438030b3733b7daf2f80902676bd48c33bc2f5345809e30" + "c405d55f92528775565f8f6c9807bc187de42662e71b59132bf0ec3f5d2caae2" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -537,7 +537,7 @@ # is a vintage pin that moves with every reviewed register edit (the same # tripwire as the policy digest). _UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( - "d0d024043132fa07c378c393dbe2b24fe99bf19e876bcc39997d2c80cc9bd4f6" + "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" ) @@ -666,10 +666,10 @@ }, "release_cut": { "gates_manifest_sha256": ( - "57311d9aedbf7ba9ebcbe9721a386002f5d27ed77b10a589e3466f2265c3f1ef" + "969fd0f1bd4529006af00c9a7a0cdab76489cfc41b5b3f838670fcab52409188" ), "policy_sha256": ( - "6d6638d38e999e8a8aec8fd72083a31a369dc5be1a1af57569c41e8b423ad39c" + "619dd84ee5748948358a03e2a209f41ab2a170b6dd45ad636a9a47c994d98de0" ), }, } diff --git a/packages/microcosm-data/tests/test_contract.py b/packages/microcosm-data/tests/test_contract.py index 571884c26..7d4f4fbdd 100644 --- a/packages/microcosm-data/tests/test_contract.py +++ b/packages/microcosm-data/tests/test_contract.py @@ -137,16 +137,16 @@ 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 = ( - "9b489e83111400c2c37345bbe78c9727b738cbffa125e2c378a33cf563d68b7c" + "5a596f72e5412d97d7938864ce44426634f22622655b2a3efcc76aaa4274d485" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "6e2e9c02c6b9d253378b3e77827c5c4599767e7f1b2173aa4687b7fffcedd25d" + "9debdfbc78c4f48734c9851ff14fa88f84788d184ae05bb54558c43e82cc6345" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "b407d0088534ebfbc438030b3733b7daf2f80902676bd48c33bc2f5345809e30" + "c405d55f92528775565f8f6c9807bc187de42662e71b59132bf0ec3f5d2caae2" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( - "d0d024043132fa07c378c393dbe2b24fe99bf19e876bcc39997d2c80cc9bd4f6" + "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" ) UK_GATE_BATTERY_INPUT_MASS_EVIDENCE_SHA256 = ( "c9211cbb923e13f4850b834b5bdb1ff1de87fe9237c332b5de63f01ed417aa2d" diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index f05527ee3..79b49d543 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -886,10 +886,18 @@ "survey": "Family Resources Survey 2024-25" }, "frs_person_draws": { - "artifacts": [], + "artifacts": [ + { + "format": "json", + "kind": "public_aggregate_reference", + "resource": "take_up_contract.json", + "role": "stochastic_contract" + } + ], "grain": "person", "nonnegative_outputs": [ - "attends_private_school_random_draw" + "attends_private_school_random_draw", + "tax_free_childcare_spend_routed_share" ], "notes": "Identity-keyed seed 0 streams replace the incumbent sequential take-up seed 100; higher_earner_tie_break is intentionally not produced.", "operations": [ @@ -920,12 +928,20 @@ "kind": "assign_uniform_draw", "output": "attends_private_school_random_draw", "seed": 0 + }, + { + "contract_key": "tax_free_childcare_spend_routed_share", + "dtype": "float64", + "kind": "assign_period_constant", + "output": "tax_free_childcare_spend_routed_share", + "period_source": "build_year" } ], "outputs": [ "would_claim_marriage_allowance", "would_claim_scp", - "attends_private_school_random_draw" + "attends_private_school_random_draw", + "tax_free_childcare_spend_routed_share" ], "rewrites": [], "source": "Sourced UK take-up contract rates and identity-keyed deterministic draws.", diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json index f0794e680..7013d4cf5 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"dfd331a9aba8fd095ebb16250f90cbb5de2ea999874c22fa3bea6a7e33fa83bf","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_disability","stage_contract_sha256":"2d5ed820f9f9fbe4a45a333f5c5e1dfbdfe2b53a055584ada4c44eacb4b58954","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"frs_education_grant_split","stage_contract_sha256":"6f0fcfa6a1aa614f7ccefe39364b4ebd208c9a4ed081f7618e026b2e87f152fa","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"frs_take_up","stage_contract_sha256":"d10ca01bfa5d719640ded8e62196b0692236d3be0a2417899deeefd241088abf","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_person_draws","stage_contract_sha256":"1543fd39f943d628d224adf8a31d5379d4f498d3f3861e67ec26981a24e76d20","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","attends_private_school_random_draw"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"was_wealth","stage_contract_sha256":"c499dcb7c49a0176229dbc363b400415cb5c1da44af266ba2155f9a62a0bd2ed","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"base":"frs_brma.checkpoint","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"regional_property_uprating","stage_contract_sha256":"4304356c6c5ba91a04883148cbf9078761ee926c8387aadb6c15b6b70ebb31f6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"lcfs_consumption","stage_contract_sha256":"eb0a529c357c84290a001209a18c5a43b0a0310553c77963d6842fd0111b73ad","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"etb_vat","stage_contract_sha256":"99a6756256adfe8255672fafda89710c08ae56bd2b8f011b20c3b8381eabfa1e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"etb_services","stage_contract_sha256":"48294c9d86dd422238a723aca5845e9ceb9eda2903a3bb87bb32a86092447e19","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_spi_income_spine","stage_contract_sha256":"3db4e7361ea871ca57b52aafce48209409d7b59d836ed973eee946b5657a771a","time_period":"2024"},"population":"spi_support_channel","sources":["frs"],"structural":"none","weights":null},{"base":"spi_support_channel","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_reporter_redraw","stage_contract_sha256":"23a23df85489708d15c7c0be3d1339ff5e1fe0932abaea0f95fcbf9c6d368205","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","person_support_channel","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_capital_coherence","stage_contract_sha256":"64024e4ca8659cad2452abe5578071cf8226e693f3cb975cf4778078bf8baf17","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Run structural UK stage cgt_band_donors.","id":"cgt_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_band_donor","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_band_donors","stage_contract_sha256":"e10e10c49c0ca2a6a65048c91b683f818e8b6e207a6c6f57a20d76ea299160b0","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_band_donors.","id":"cgt_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_band_donor"]},"population":"cgt_band_donors","sources":[],"structural":"none","weights":null},{"base":"cgt_band_donors","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"20ada8d8ee94400bd160223e865a910db7aff9c40a7f0c8ee8ca8c40ed901b72","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"salary_sacrifice","stage_contract_sha256":"a4af925af21cc6766eb7c8855b6743a3aa4eeeb38df12cfc83063d7ad6890539","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","employee_pension_contributions","highest_education","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"student_loans","stage_contract_sha256":"7c4c76398c2e80b41c7f941a5f06246b57d89b5eb0c36d42e3116ac35e82e203","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"dfd331a9aba8fd095ebb16250f90cbb5de2ea999874c22fa3bea6a7e33fa83bf","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_disability","stage_contract_sha256":"2d5ed820f9f9fbe4a45a333f5c5e1dfbdfe2b53a055584ada4c44eacb4b58954","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"frs_education_grant_split","stage_contract_sha256":"6f0fcfa6a1aa614f7ccefe39364b4ebd208c9a4ed081f7618e026b2e87f152fa","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"frs_take_up","stage_contract_sha256":"d10ca01bfa5d719640ded8e62196b0692236d3be0a2417899deeefd241088abf","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_person_draws","stage_contract_sha256":"9c299a6cf69ac771667ee3e3105637ff87cd780a423db805f9002352b2f1005f","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"was_wealth","stage_contract_sha256":"c499dcb7c49a0176229dbc363b400415cb5c1da44af266ba2155f9a62a0bd2ed","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"base":"frs_brma.checkpoint","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"regional_property_uprating","stage_contract_sha256":"4304356c6c5ba91a04883148cbf9078761ee926c8387aadb6c15b6b70ebb31f6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"lcfs_consumption","stage_contract_sha256":"eb0a529c357c84290a001209a18c5a43b0a0310553c77963d6842fd0111b73ad","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"etb_vat","stage_contract_sha256":"99a6756256adfe8255672fafda89710c08ae56bd2b8f011b20c3b8381eabfa1e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"etb_services","stage_contract_sha256":"48294c9d86dd422238a723aca5845e9ceb9eda2903a3bb87bb32a86092447e19","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_spi_income_spine","stage_contract_sha256":"3db4e7361ea871ca57b52aafce48209409d7b59d836ed973eee946b5657a771a","time_period":"2024"},"population":"spi_support_channel","sources":["frs"],"structural":"none","weights":null},{"base":"spi_support_channel","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_reporter_redraw","stage_contract_sha256":"23a23df85489708d15c7c0be3d1339ff5e1fe0932abaea0f95fcbf9c6d368205","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","person_support_channel","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_capital_coherence","stage_contract_sha256":"64024e4ca8659cad2452abe5578071cf8226e693f3cb975cf4778078bf8baf17","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Run structural UK stage cgt_band_donors.","id":"cgt_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_band_donor","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_band_donors","stage_contract_sha256":"e10e10c49c0ca2a6a65048c91b683f818e8b6e207a6c6f57a20d76ea299160b0","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_band_donors.","id":"cgt_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_band_donor"]},"population":"cgt_band_donors","sources":[],"structural":"none","weights":null},{"base":"cgt_band_donors","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"20ada8d8ee94400bd160223e865a910db7aff9c40a7f0c8ee8ca8c40ed901b72","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"salary_sacrifice","stage_contract_sha256":"a4af925af21cc6766eb7c8855b6743a3aa4eeeb38df12cfc83063d7ad6890539","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","employee_pension_contributions","highest_education","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"student_loans","stage_contract_sha256":"7c4c76398c2e80b41c7f941a5f06246b57d89b5eb0c36d42e3116ac35e82e203","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 1519faa30..25f883125 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -1,171 +1,318 @@ -"""Fit UK childcare take-up rates from a local enhanced-FRS H5.""" +"""Fit four UK childcare take-up rates against the declared target registry.""" from __future__ import annotations import argparse import hashlib import json -from collections.abc import Callable +from collections.abc import Callable, Mapping from datetime import UTC, datetime from pathlib import Path +from typing import Any import numpy as np from scipy.optimize import minimize -TOOL_VERSION = 1 -TARGETS = { - "spending": { - "tfc": 0.63, - "extended": 2.5, - "targeted": 0.6, - "universal": 1.7, - }, - "caseload": { - "tfc": 985, - "extended": 740, - "targeted": 130, - "universal": 490, - }, -} -TARGET_CITATIONS = { - "tfc": "HMRC Tax-Free Childcare statistics, June 2025 release.", - "other_childcare": ( - "Department for Education dedicated schools grant national funding " - "allocations, 2024 to 2025." - ), -} -INITIAL_PARAMS = np.array([0.5, 0.5, 0.5, 0.5, 15.0, 5.0], dtype=float) -BOUNDS = ((0, 1), (0, 1), (0, 1), (0, 1), (5.0, 30.0), (1.0, 10.0)) +from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_artifact import load_ledger_consumer_artifact +from microcosm.build.ledger_targets import ( + LedgerTargetReference, + compile_ledger_target_references, +) +from microcosm.build.stochastic_assignment import ( + clipped_normal_from_uniforms, + stable_identity_uniforms, +) +from microcosm.build.uk_runtime.ledger_targets import _candidate_facts_for_reference +from microcosm.build.uk_runtime.take_up_contract import ( + UKTakeUpContract, + load_uk_take_up_contract, +) +from microcosm.calibrate import TargetRegistry +TOOL_VERSION = 2 +TARGET_IDS = ( + "hmrc.tfc.government_top_up", + "hmrc.tfc.children_with_used_accounts", + "dfe.funded_childcare.working_parent_children_2_to_4", + "dfe.funded_childcare.early_learning_2_year_olds", + "dfe.funded_childcare.universal_only_children", +) +RATE_KEYS = ( + "tax_free_childcare", + "extended_childcare", + "targeted_childcare", + "universal_childcare", +) +INITIAL_PARAMS = np.array([0.88, 0.812, 0.597, 0.563], dtype=float) +BOUNDS = ((0.0, 1.0),) * 4 SimulationRunner = Callable[ - [Path, np.ndarray, int], tuple[dict[str, float], dict[str, float]] + [Path, np.ndarray, int, int, UKTakeUpContract], Mapping[str, float] ] def draw_childcare_inputs( - benunit_count: int, params: np.ndarray, *, seed: int + benunit_ids: np.ndarray, + params: np.ndarray, + *, + seed: int, + contract: UKTakeUpContract, ) -> dict[str, np.ndarray]: - """Generate seeded childcare inputs without touching numpy global state.""" - - rng = np.random.default_rng(seed) - tfc, extended, targeted, universal, hours_mean, hours_sd = params - return { - "would_claim_tfc": rng.random(benunit_count) < tfc, - "would_claim_extended_childcare": rng.random(benunit_count) < extended, - "would_claim_targeted_childcare": rng.random(benunit_count) < targeted, - "would_claim_universal_childcare": rng.random(benunit_count) < universal, - "maximum_extended_childcare_hours_usage": np.clip( - rng.normal(hours_mean, hours_sd, benunit_count), 0, 30 + """Generate identity-keyed flags while holding the hours distribution fixed.""" + ids = np.asarray(benunit_ids) + if np.asarray(params).shape != (4,): + raise ValueError("childcare fitter accepts exactly four take-up rates") + outputs = {} + names = ( + "would_claim_tfc", + "would_claim_extended_childcare", + "would_claim_targeted_childcare", + "would_claim_universal_childcare", + ) + for output, rate in zip(names, params, strict=True): + outputs[output] = stable_identity_uniforms(ids, seed=seed, salt=output) < float( + rate + ) + hours = contract.continuous_entry("maximum_extended_childcare_hours_usage") + outputs["maximum_extended_childcare_hours_usage"] = clipped_normal_from_uniforms( + stable_identity_uniforms( + ids, seed=seed, salt="maximum_extended_childcare_hours_usage" ), + mean=float(hours["mean"]), + sd=float(hours["sd"]), + lower=float(hours["lower"]), + upper=float(hours["upper"]), + ) + return outputs + + +def compile_childcare_targets( + facts: tuple[Mapping[str, Any], ...], + *, + target_period: int, + vintage_overrides: Mapping[str, int], +) -> TargetRegistry: + """Compile only the five declared childcare rows, with explicit overrides.""" + references = { + r.name: r + for r in load_country_spec("uk").target_references + if r.name in TARGET_IDS } + missing = sorted(set(TARGET_IDS) - references.keys()) + if missing: + raise ValueError(f"childcare target declarations are missing: {missing}") + unknown = sorted(set(vintage_overrides) - set(TARGET_IDS)) + if unknown: + raise ValueError(f"unknown childcare vintage override target ids: {unknown}") + specs = [] + for target_id in TARGET_IDS: + reference = references[target_id] + period = vintage_overrides.get(target_id, target_period) + restamped = LedgerTargetReference(**{**reference.__dict__, "period": period}) + compiled = compile_ledger_target_references( + _candidate_facts_for_reference(facts, restamped), [restamped], country="uk" + ) + if len(compiled.specs) != 1: + raise ValueError(f"{target_id} did not compile to exactly one target") + specs.append(compiled.specs[0]) + return TargetRegistry(specs, country="uk") def fit_childcare_takeup( input_h5: Path, *, + ledger_facts: Path | None = None, + ledger_facts_sha256: str | None = None, + target_period: int = 2024, + vintage_overrides: Mapping[str, int] | None = None, seed: int = 42, maxiter: int = 5, + eps: float = 1e-2, runner: SimulationRunner | None = None, generated_at: str | None = None, + targets: Mapping[str, float] | None = None, + registry_version: str | None = None, ) -> dict[str, object]: - """Fit rates and return a deterministic receipt payload.""" - + """Fit rates and return a deterministic, provenance-complete receipt.""" + contract = load_uk_take_up_contract() + overrides = dict(vintage_overrides or {}) + if targets is None: + if ledger_facts is None: + raise ValueError("--ledger-facts is required to compile childcare targets") + artifact = load_ledger_consumer_artifact( + ledger_facts, expected_facts_sha256=ledger_facts_sha256 + ) + registry = compile_childcare_targets( + artifact.facts, target_period=target_period, vintage_overrides=overrides + ) + targets = {spec.name: float(spec.value) for spec in registry.specs} + registry_version = registry.version + feed_sha256 = artifact.facts_sha256 + target_metadata = { + spec.name: { + "declared_value": spec.value, + "period": spec.period, + "family": spec.family, + "source": spec.source, + } + for spec in registry.specs + } + else: + if set(targets) != set(TARGET_IDS): + raise ValueError( + "childcare targets must contain exactly the five target ids" + ) + feed_sha256 = ledger_facts_sha256 or "test-injected" + registry_version = registry_version or "test-injected" + target_metadata = { + name: {"declared_value": value, "period": target_period} + for name, value in targets.items() + } runner = runner or _policyengine_runner def objective(params: np.ndarray) -> float: - spending, caseload = runner(input_h5, params, seed) - loss = 0.0 - for key, target in TARGETS["spending"].items(): - loss += (spending[key] / target - 1) ** 2 - for key, target in TARGETS["caseload"].items(): - loss += (caseload[key] / target - 1) ** 2 - return float(loss) + achieved = runner(input_h5, params, seed, target_period, contract) + return float( + sum( + (float(achieved[name]) / float(targets[name]) - 1) ** 2 + for name in TARGET_IDS + ) + ) result = minimize( objective, INITIAL_PARAMS, bounds=BOUNDS, method="L-BFGS-B", - options={"maxiter": maxiter, "eps": 1e-2}, + options={"maxiter": maxiter, "eps": eps}, ) - spending, caseload = runner(input_h5, result.x, seed) + achieved = dict(runner(input_h5, result.x, seed, target_period, contract)) + from importlib.metadata import version + return { "tool": "fit_uk_childcare_takeup", "tool_version": TOOL_VERSION, "input_h5": str(input_h5), "input_sha256": _sha256(input_h5), "seed": seed, - "generated_at": generated_at - if generated_at is not None - else datetime.now(UTC).date().isoformat(), + "generated_at": generated_at or datetime.now(UTC).date().isoformat(), + "model_period": target_period, + "vintage_overrides": overrides, + "ledger_facts_sha256": feed_sha256, + "target_registry_version": registry_version, + "stochastic_contract_sha256": contract.resource_sha256, + "engine_version": version("policyengine-uk"), "optimizer": { "method": "L-BFGS-B", "maxiter": maxiter, + "eps": float(eps), "success": bool(result.success), "loss": float(result.fun), }, - "params": { - "tax_free_childcare": float(result.x[0]), - "extended_childcare": float(result.x[1]), - "targeted_childcare": float(result.x[2]), - "universal_childcare": float(result.x[3]), - "extended_hours_mean": float(result.x[4]), - "extended_hours_sd": float(result.x[5]), + "params": dict(zip(RATE_KEYS, map(float, result.x), strict=True)), + "targets": target_metadata, + "achieved": { + name: { + "value": float(achieved[name]), + "target": float(targets[name]), + "ratio": float(achieved[name]) / float(targets[name]), + } + for name in TARGET_IDS }, - "targets": TARGETS, - "target_citations": TARGET_CITATIONS, - "fitted": {"spending": spending, "caseload": caseload}, } +def _policyengine_runner( + input_h5: Path, + params: np.ndarray, + seed: int, + target_period: int, + contract: UKTakeUpContract, +) -> Mapping[str, float]: + from policyengine_uk import Microsimulation + + sim = Microsimulation(dataset=str(input_h5)) + benunit_ids = np.asarray(sim.calculate("benunit_id", target_period)) + for variable, values in draw_childcare_inputs( + benunit_ids, params, seed=seed, contract=contract + ).items(): + sim.set_input(variable, target_period, values) + person_count = np.asarray(sim.calculate("person_id", target_period)).shape[0] + sim.set_input( + "tax_free_childcare_spend_routed_share", + target_period, + np.full( + person_count, + contract.rate("tax_free_childcare_spend_routed_share", target_period), + ), + ) + return { + "hmrc.tfc.government_top_up": float( + sim.calculate("tax_free_childcare", target_period).sum() + ), + "hmrc.tfc.children_with_used_accounts": float( + sim.calculate("is_child_receiving_tax_free_childcare", target_period).sum() + ), + "dfe.funded_childcare.working_parent_children_2_to_4": float( + ( + sim.calculate("is_child_receiving_extended_childcare", target_period) + & (sim.calculate("age", target_period) >= 2) + ).sum() + ), + "dfe.funded_childcare.early_learning_2_year_olds": float( + sim.calculate("is_child_receiving_targeted_childcare", target_period).sum() + ), + "dfe.funded_childcare.universal_only_children": float( + sim.calculate("is_child_receiving_universal_childcare", target_period).sum() + ), + } + + +def _parse_overrides(values: list[str]) -> dict[str, int]: + result = {} + for value in values: + target_id, separator, period = value.partition("=") + if not separator: + raise ValueError("--vintage-override must be target_id=period") + result[target_id] = int(period) + return result + + def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--enhanced-frs-h5", type=Path, required=True) + parser.add_argument("--ledger-facts", type=Path, required=True) + parser.add_argument("--ledger-facts-sha256", required=True) + parser.add_argument("--target-period", type=int, default=2024) + parser.add_argument("--vintage-override", action="append", default=[]) parser.add_argument("--output", type=Path, required=True) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--maxiter", type=int, default=5) + parser.add_argument( + "--eps", + type=float, + default=1e-2, + help=( + "Finite-difference step for L-BFGS-B on the four rates. The draws " + "are identity-keyed thresholds, so a step smaller than one over the " + "eligible base flips no unit and reads as a zero gradient; the " + "targeted 2-year-old base is a few hundred sample children." + ), + ) args = parser.parse_args() receipt = fit_childcare_takeup( - args.enhanced_frs_h5, seed=args.seed, maxiter=args.maxiter + args.enhanced_frs_h5, + ledger_facts=args.ledger_facts, + ledger_facts_sha256=args.ledger_facts_sha256, + target_period=args.target_period, + vintage_overrides=_parse_overrides(args.vintage_override), + seed=args.seed, + maxiter=args.maxiter, + eps=args.eps, ) args.output.write_text(json.dumps(receipt, indent=2, sort_keys=True) + "\n") -def _policyengine_runner( - input_h5: Path, params: np.ndarray, seed: int -) -> tuple[dict[str, float], dict[str, float]]: - from policyengine_uk import Microsimulation - - sim = Microsimulation(dataset=str(input_h5)) - benunit_count = sim.calculate("benunit_id").values.shape[0] - for variable, values in draw_childcare_inputs( - benunit_count, params, seed=seed - ).items(): - sim.set_input(variable, 2024, values) - df = sim.calculate_dataframe( - [ - "is_child_receiving_tax_free_childcare", - "is_child_receiving_extended_childcare", - "is_child_receiving_universal_childcare", - "is_child_receiving_targeted_childcare", - ], - 2024, - ) - spending = { - "tfc": sim.calculate("tax_free_childcare", 2024).sum() / 1e9, - "extended": sim.calculate("extended_childcare_entitlement", 2024).sum() / 1e9, - "targeted": sim.calculate("targeted_childcare_entitlement", 2024).sum() / 1e9, - "universal": sim.calculate("universal_childcare_entitlement", 2024).sum() / 1e9, - } - caseload = { - "tfc": df["is_child_receiving_tax_free_childcare"].sum() / 1e3, - "extended": df["is_child_receiving_extended_childcare"].sum() / 1e3, - "universal": df["is_child_receiving_universal_childcare"].sum() / 1e3, - "targeted": df["is_child_receiving_targeted_childcare"].sum() / 1e3, - } - return spending, caseload - - def _sha256(path: Path) -> str: digest = hashlib.sha256() with path.open("rb") as handle: diff --git a/tools/generate_uk_target_references.py b/tools/generate_uk_target_references.py index 73d8da5d6..e921b8685 100644 --- a/tools/generate_uk_target_references.py +++ b/tools/generate_uk_target_references.py @@ -63,20 +63,6 @@ _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 the national rows in uk_population_targets.json: " @@ -102,6 +88,7 @@ def main() -> None: json.loads(args.contract.read_text()), allowed_levels=NATIONAL_GEOGRAPHY_LEVELS, ) + _validate_amount_entity_pins(contract) facts = [ json.loads(line) for line in args.ledger_facts.read_text().splitlines() @@ -120,6 +107,7 @@ def main() -> None: 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), + reference_metadata_by_target_id=_reference_metadata(contract), binding_vocabulary=POLICYENGINE_BINDING_KEYS, source_fact_feed=args.source_fact_feed or str(args.ledger_facts), ) @@ -168,6 +156,20 @@ def _filter_contract_by_geography_levels( return filtered +def _validate_amount_entity_pins(contract: Mapping[str, Any]) -> None: + missing = [ + str(target["target_id"]) + for target in contract.get("targets", ()) + if str(target.get("measurement", {}).get("concept", "")).endswith(".amount") + and not str(target.get("ledger_selector", {}).get("entity_name", "")) + ] + if missing: + raise ValueError( + "National amount targets must pin ledger_selector.entity_name: " + f"{missing!r}." + ) + + 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(): @@ -210,6 +212,8 @@ def _geography_pins(contract: Mapping[str, Any]) -> dict[str, dict[str, str]]: # substring rule: its england_* ids name their nation, and devolved_total # needs a per-nation redesign before it can activate. ("slc.support.", "england"), + ("dfe.", "england"), + ("dft.", "england"), ) @@ -257,12 +261,11 @@ def _sum_target_ids(contract: Mapping[str, Any]) -> frozenset[str]: 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)} - # ``dimensions: []`` is an exact-key-set selector pin, not a generic sum - # trigger. The UK all-ages population row is nevertheless a reviewed sum - # residue and must retain that operation explicitly. - operations["ons.population.uk_total"] = "sum" for target in contract.get("targets", ()): target_id = str(target["target_id"]) + declared = target.get("value_operation") + if declared is not None: + operations[target_id] = str(declared) if target.get("family") == "dwp_universal_credit": operations[target_id] = "calendar_year_average" return operations @@ -286,16 +289,19 @@ def _selector_pins(contract: Mapping[str, Any]) -> dict[str, dict[str, Any]]: def _signed_exclusions(contract: Mapping[str, Any]) -> dict[str, str]: target_ids = {str(target["target_id"]) for target in contract.get("targets", ())} + resource = json.loads( + Path(__file__) + .resolve() + .parents[1] + .joinpath( + "packages/microcosm-build/src/microcosm/build/uk/" + "target_reference_signed_exclusions.json" + ) + .read_text() + ) exclusions = { - "hmrc.spi.property_income.amount_by_total_income_band": ( - PROPERTY_INCOME_SIGNED_EXCLUSION_RATIONALE - ), - "ons.population.scotland_households_3plus_children": ( - "Signed out pending a Scotland household-composition fact: the " - "current selector reaches person-level ONS mid-year population " - "age rows, not households with three or more children. " - "microcosm#736 tracks the missing declaration." - ), + str(entry["target_id"]): str(entry["rationale"]) + for entry in resource["exclusions"] } return { target_id: rationale @@ -304,6 +310,16 @@ def _signed_exclusions(contract: Mapping[str, Any]) -> dict[str, str]: } +def _reference_metadata(contract: Mapping[str, Any]) -> dict[str, dict[str, str]]: + return { + str(target["target_id"]): { + "observation_basis": str(target["measurement"]["observation_basis"]) + } + for target in contract.get("targets", ()) + if target.get("measurement", {}).get("observation_basis") is not None + } + + def _fanout_name( target: Mapping[str, Any], fact: Mapping[str, Any], From db489ac0ad7705198607f612ed00afc769f8b48d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 07:57:21 +0200 Subject: [PATCH 27/33] Re-fit the childcare take-up rates with an expected-count objective and land the extended and universal rates (#834 L5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fitter no longer draws. The build keys each take-up flag on the spine's int64 benunit id at the frs_take_up stage and later stages clone and re-key rows, so no re-drawn realisation can sit on the persisted one (re-hashing the final ids agrees with the persisted universal flag on 66% of rows, chance being 51%), and the draw objective was a step function whose finite-difference step flipped no unit on the targeted row's ~157-child base. Two engine runs with the flags forced on (extended on, then off) now give each row's weighted per-row contributions; each target's expectation is linear in its own rate and bilinear with the extended rate through the engine's mutual exclusions (targeted and universal need a family that is not extended-eligible). The objective is smooth, exact for the build, and the receipt reports each row's ceiling at a take-up of one. Unit test pins the bilinear form; `--eps` is recorded in the receipt. Fitted on the L2 column twin at the 2024 base year (Jan-2025 vintage override on the extended row, routed share 0.593 from the contract, hours frozen): extended 0.812 → 0.6054 and universal 0.563 → 0.4539 land as 2024-04-06 entries with a `fitting_receipt`. `tax_free_childcare` (0.997, at its ceiling: with spend routed the two HMRC rows conflict) and `targeted_childcare` (1.0, the eligible base reaches 0.85 of the count) are held at 0.88 / 0.597 for adjudication (plan A22/A23); a rate of 1.0 would also make the persisted flag constant. Receipts Part C L5 carry the three fits, the probes and the rebuilt twin's magnitudes; the swap register signs the two moved flags as `childcare-take-up-refit-834`; the H2 graph parity fixture is regenerated (the take-up stages' node keys fold the contract sha) and the contract test's pinned rates follow. Co-Authored-By: Claude Fable 5.1 --- .../uk-childcare-fitter-834.changed.md | 2 +- experiments/834-childcare-tfc-receipts.md | 106 ++++++++- .../uk/spine_swap_signed_differences.json | 34 +++ .../microcosm/build/uk/take_up_contract.json | 106 ++++++++- .../tests/test_uk_stochastic_tools.py | 38 ++++ .../tests/test_uk_take_up_contract.py | 5 +- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- tools/fit_uk_childcare_takeup.py | 215 ++++++++++++++---- 8 files changed, 457 insertions(+), 51 deletions(-) diff --git a/changelog.d/uk-childcare-fitter-834.changed.md b/changelog.d/uk-childcare-fitter-834.changed.md index 0a70beac9..b83707c99 100644 --- a/changelog.d/uk-childcare-fitter-834.changed.md +++ b/changelog.d/uk-childcare-fitter-834.changed.md @@ -1 +1 @@ -Rewrite the UK childcare take-up fitter to compile its five targets from the calibration contract and the pinned Chronicle feed, fit the four rates only with identity-keyed draws and the hours distribution frozen by adjudication, and record an explicit finite-difference step (`--eps`) in its provenance receipt (#834). +Rewrite the UK childcare take-up fitter: targets compiled from the calibration contract and the pinned Chronicle feed, four rates only with the hours distribution frozen by adjudication, and an expected-count objective (two engine runs with the flags forced on; each row's expectation is linear in its own rate and bilinear with the extended rate through the engine's mutual exclusions) that is exact for the spine's persisted draws, smooth for the optimizer, and reports each row's ceiling at a take-up of one in its provenance receipt (#834). diff --git a/experiments/834-childcare-tfc-receipts.md b/experiments/834-childcare-tfc-receipts.md index baecd9d77..0da64ea98 100644 --- a/experiments/834-childcare-tfc-receipts.md +++ b/experiments/834-childcare-tfc-receipts.md @@ -232,7 +232,111 @@ sampling noise — for targeted, ±10–20% at this base. The exact fix — an e (rate × weight over the rules-eligible base, no draw) with an analytic gradient — is a fitter redesign outside this PR and is filed as a follow-up. -**Second run (`fit_2024_eps05.json`: maxiter 10, eps 0.05):** pending. +**Second run (`fit_2024_eps05.json`: maxiter 10, eps 0.05):** loss 0.302 → 0.077, still +`success: false` at the iteration cap, and two of the four rates on the upper bound: + +| rate | incumbent | fitted | achieved ÷ target at the fitted vector | +|---|---|---|---| +| `tax_free_childcare` | 0.88 | **1.000 (bound)** | spend 0.806, children 1.142 | +| `extended_childcare` | 0.812 | 0.562 | extended 2–4 0.948 | +| `targeted_childcare` | 0.597 | **1.000 (bound)** | targeted 0.878 | +| `universal_childcare` | 0.563 | 0.436 | universal-only 0.955 | + +The TFC objective is flat between 0.9 and 1.0 (spend 0.79–0.81 against children 1.10–1.14: the +two HMRC rows cannot both be met once spend is routed at 0.593, because the frame's spend per +child with a used account sits ~30% below HMRC's; uk-data's comparator ratios are 1.01 / 0.99 on +its own frame), so the bound hit is the optimizer sliding along a flat valley, not a measured +take-up of 100%. The targeted bound is the reachable-ceiling problem above. A rate of 1.0 also +makes the persisted `would_claim_*` column constant, which the degenerate-surface gate refuses +without a signed entry — a fit cannot sign that. + +**Third run — the fitter re-designed (`fit_2024_expected.json`, tool version 3):** the second +run's rates were landed and the spine rebuilt, and the rebuilt twin exposed a seam the receipts +must carry: the build keys every take-up flag as `seed 0 : output : int64 benunit_id` at the +`frs_take_up` stage, and later stages (SPI support channel, CGT incidence clone, age tail) +clone and re-key rows, so no re-drawn realisation can sit on the persisted one — re-hashing the +final ids agrees with the persisted universal flag on 66% of rows, chance being 51% — and the +fitter's own draws (seed 42 on the engine's int32-cast ids, 2³¹ < the spine's ids) were a third +realisation. At identical rates the universal-only count read 397 592 / 434 097 / 463 758 across +the three (fitter s42 / s0 / build). The fitter therefore no longer draws: two engine runs with +the flags forced on (extended on, then off) give each row's weighted per-row contributions, and +each target's expectation is linear in its own rate and bilinear with the extended rate through +the engine's mutual exclusions (targeted and universal need a family that is not +extended-eligible). The objective is smooth, exact for the build (the persisted flags are one +draw from it), and reports each row's ceiling at a take-up of one. Checks: at the incumbent +rates the expectations read spend 0.71, children 1.005, extended 1.32, targeted 0.49, universal +1.06 against the L3 measurements 0.70 / 1.02 / 1.28 / 0.60 / 1.10 (draw noise, amplified for +small bases by cloning); the unit test pins the bilinear form. + +| rate | incumbent | fitted (converged, loss 0.080) | expectation ÷ target | ceiling at 1.0 | +|---|---|---|---|---| +| `tax_free_childcare` | 0.88 | 0.997 | spend 0.804 · children 1.138 | 0.806 · 1.142 | +| `extended_childcare` | 0.812 | **0.6054** | 0.986 | 1.629 | +| `targeted_childcare` | 0.597 | 1.000 (bound) | 0.852 | 0.792 (0.852 at the fitted extended rate) | +| `universal_childcare` | 0.563 | **0.4539** | 1.000 | 1.581 | + +**Landed (plan A6 as exercised):** `extended_childcare` 0.6054 and `universal_childcare` +0.4539 as `2024-04-06` entries with `status: fitted_offline` and a `fitting_receipt` (receipt +sha, seed, engine 2.94.0, input sha, feed sha, contract sha at fit, optimizer block, achieved ÷ +target). `tax_free_childcare` (0.88) and `targeted_childcare` (0.597) are **held at their +incumbent values**: TFC sits at its ceiling because with spend routed at 0.593 the frame's +spend per child with a used account is ~30% below HMRC's, so the two HMRC rows cannot both be +met (spend 0.81 against children 1.14 anywhere above 0.9); targeted's eligible base — England, a +qualifying benefit or UC/TC criterion, and not extended-eligible — reaches 0.85 of the Jan-2024 +count at a take-up of one. Both are put to María (A22/A23); a rate of 1.0 would also make the +persisted flag column constant, which the degenerate-surface gate refuses. The two pairs are +separable (targeted's rate does not move the extended count; TFC touches no DfE row), so the +landed pair is the joint fit's own solution for those rows. The eps-0.05 landing above +(0.5622 / 0.4356) is superseded. + +**Rebuilt on this contract (`l5-refit-twin-b/`, sha `37280e7c…`):** 28 stages, rows +113 626 / 61 234 / 52 846, 15 / 15 spine gates; persisted shares extended 0.6053, universal +0.4512 (rates 0.6054 / 0.4539). Payload against the L2 column twin +(`l5b_vs_l2_payload.json`): benunit — the two re-fitted flags move (12 374 and 6 694 rows), the +seven other draw columns byte-equal; person — 28 `student_loan_balance` rows (the stock +top-up's selection); household — 33 imputed columns through the predictors, as in L2 vs L1 +(energy IPF 52 586 rows, property rescale 24 948 owners, wealth/consumption draws ≤ 445 rows); +time_period byte-equal. Signed in the swap register as `childcare-take-up-refit-834` +(`mechanism_change`, max |Δshare| 0.2068 / 0.1103 against the packaged reference). Release +round trip (`l5b_refit_childcare_receipt.json`, engine 2.94.0, design weights): + +| target (basis 2024 / 2025) | L3 (incumbent rates) | twin-b (landed) | expectation at the landed vector | +|---|---|---|---| +| TFC top-up £ | 0.698 / 0.772 | 0.698 / 0.772 | 0.710 | +| TFC children with used accounts | 1.020 / 0.951 | 1.020 / 0.951 | 1.005 | +| extended 2–4, England | 1.283 / 1.261 | **0.999 / 0.982** | 0.986 | +| targeted 2-year-olds, England | 0.596 / 0.738 | 0.628 / 0.772 | 0.509 | +| universal-only 3–4s, England | 1.104 / 1.177 | **1.087 / 1.157** | 1.000 | + +The extended row lands on its expectation; universal realises 9% above and targeted 23% above +theirs — the persisted flags are one identity-keyed draw and the SPI/CGT clone stages copy a +source family's flag onto every clone, so the realised count's effective sample is far smaller +than its row count on the small bases (targeted: ~157 candidate children). The expectation is +what the rate controls; the calibration weights absorb the realisation. + +### L4 — composition on `uk-publication-stack-834` + +The composition branch (`repos/populace-834-l4`, `uk-publication-stack-834` = the #834 tree plus +the publication stack's target-fit deferral register and its gate wiring, ported by hand from +stack `6d3f984a`; main's local-candidate branch of the evaluator preserved) runs +`tools/calibrate_uk_national_dataset.py` on the rebuilt twin against the pinned feed (facts +`6ae49d7d…`, manifest `dcda51d6…`), 1 500 epochs, Adam 0.02, max weight ratio 10, the packaged +measure exclusions, release id `uk-spine-assessment-834-l4`. + +**Run 1 (first landing 0.5622 / 0.4356, per-target uniform weights — superseded).** The runner +was invoked without `--target-weight-rule`, so every one of the 371 targets weighed 1.0 where +L4-pre had weighed families equally (`weight_kind: provided`, each UC cell ≈ 0.01). Loss 0.374 → +0.0135, 95.4% within 10%, ESS 8 154; the seven new rows all within 0.2%, and three of the four +deferred UC with-children cells inside 1.2% (children_5_or_more −28.3%) — but at the price the +family weighting exists to prevent: `hmrc.cgt.gains_total` −30.3% (OBR CGT exact), +`ons.savings_interest_income` −74.8%, `voa.council_tax_stock.band_a` +34.2%, +`slc.borrowers.plan_2_liable` −26.6%. The 100-row UC family dominated the solve. Kept as the +weighting-sensitivity receipt (`l4-834/run1/`), not as the composition measurement. The +terminal battery also failed closed on the ported gate (`KeyError: exclusions_evaluated_on`): +the binding's required-artifact set lacked the exclusion clock, fixed on the branch +(`7234d305`). + +**Run 2 (converged landing 0.6054 / 0.4539, `family_equal` as L4-pre):** pending. ## Part D — bus (#789) diff --git a/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json index 18e3bac54..399e7dc4c 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/spine_swap_signed_differences.json @@ -711,6 +711,40 @@ ] } } + }, + { + "id": "childcare-take-up-refit-834", + "class": "mechanism_change", + "scope": { + "surface": "nonzero_shares", + "columns": [ + "would_claim_extended_childcare", + "would_claim_universal_childcare" + ], + "entities": [ + "benunit" + ] + }, + "expectation": "column_differs", + "magnitude_evidence": "The extended and universal childcare take-up rates are re-fitted (#834 L5, plan A6) on the L2 column twin at the 2024 base year against the compiled DfE rows with the routed share in the frame: extended 0.812 -> 0.6054 and universal 0.563 -> 0.4539, expected-count fit (two engine runs, bilinear in the rates), so the persisted identity-keyed flags' nonzero shares move by the rate change (the incumbent's 0.812 / 0.561 were the pre-freeze fit). Re-measured on the rebuilt spine (sha256 37280e7c99af3f4d4f176c42722c56e1fd2c5170de8d3d97ba767db46de40b08): extended 0.6053, universal 0.4512. TFC and targeted are held at their incumbent rates (fit hit the 1.0 bound; plan A22/A23) and are not signed here.", + "evidence": "experiments/834-childcare-tfc-receipts.md#part-c--column-twin-l2-release-round-trip-l3-re-fit-l5-composition-l4", + "adjudicator": "juaristi22", + "adjudicated_on": "2026-09-05", + "quantitative": { + "shares": { + "would_claim_extended_childcare": { + "incumbent_share": 0.811982, + "direction": "candidate_below", + "max_abs_delta": 0.2068 + }, + "would_claim_universal_childcare": { + "incumbent_share": 0.561488, + "direction": "candidate_below", + "max_abs_delta": 0.1103 + } + }, + "magnitude_provenance": "max_abs_delta measured 2026-09-05 on the L5 rebuilt twin (sha256 37280e7c99af3f4d4f176c42722c56e1fd2c5170de8d3d97ba767db46de40b08) against the packaged reference, rounded up at 1e-4 grain." + } } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json b/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json index 875e5de82..1a0d2de5f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json +++ b/packages/microcosm-build/src/microcosm/build/uk/take_up_contract.json @@ -118,7 +118,8 @@ "output": "would_claim_extended_childcare", "entity": "benunit", "values": { - "2015-01-01": 0.812 + "2015-01-01": 0.812, + "2024-04-06": 0.6054 }, "source": { "source": "FRS empirical fit", @@ -127,9 +128,53 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "incumbent UK pipeline @ ebf733c", - "seed": 42, - "status": "frozen parity value" + "source": "tools/fit_uk_childcare_takeup.py (microcosm#834 L5, licensed lane)", + "tool_version": 3, + "receipt_sha256": "c56ca568ef446f07f773ea03253bc2f9d878aeea6bc781ee38ed268d1fedde96", + "seed": 0, + "engine_version": "2.94.0", + "model_period": 2024, + "vintage_overrides": { + "dfe.funded_childcare.working_parent_children_2_to_4": 2025 + }, + "input_h5_sha256": "c2804c18c0fc6a1c00e2ccc68f5eda5cd8b739906970dcb95ca82471d9d436b8", + "ledger_facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", + "stochastic_contract_sha256_at_fit": "ba3daedade4c9e0115307eab2575e98c6921fb09357664ae3ea15644a86939e0", + "optimizer": { + "eps": 1e-06, + "loss": 0.07969210950295769, + "maxiter": 50, + "method": "L-BFGS-B", + "success": true + }, + "achieved": { + "dfe.funded_childcare.early_learning_2_year_olds": { + "target": 115852.0, + "value": 98692.247, + "ratio": 0.8519 + }, + "dfe.funded_childcare.universal_only_children": { + "target": 416537.0, + "value": 416536.695, + "ratio": 1.0 + }, + "dfe.funded_childcare.working_parent_children_2_to_4": { + "target": 621482.0, + "value": 612914.443, + "ratio": 0.9862 + }, + "hmrc.tfc.children_with_used_accounts": { + "target": 1085020.0, + "value": 1235197.414, + "ratio": 1.1384 + }, + "hmrc.tfc.government_top_up": { + "target": 632200000.0, + "value": 508305122.499, + "ratio": 0.804 + } + }, + "status": "fitted on the L2 column twin at the 2024 base year (A6); hours distribution frozen; the same fit drove tax_free_childcare and targeted_childcare to the 1.0 bound, which are held at their incumbent values pending adjudication (plan A22/A23)" } }, { @@ -137,7 +182,8 @@ "output": "would_claim_universal_childcare", "entity": "benunit", "values": { - "2015-01-01": 0.563 + "2015-01-01": 0.563, + "2024-04-06": 0.4539 }, "source": { "source": "FRS empirical fit", @@ -146,9 +192,53 @@ "status": "fitted_offline" }, "fitting_receipt": { - "source": "incumbent UK pipeline @ ebf733c", - "seed": 42, - "status": "frozen parity value" + "source": "tools/fit_uk_childcare_takeup.py (microcosm#834 L5, licensed lane)", + "tool_version": 3, + "receipt_sha256": "c56ca568ef446f07f773ea03253bc2f9d878aeea6bc781ee38ed268d1fedde96", + "seed": 0, + "engine_version": "2.94.0", + "model_period": 2024, + "vintage_overrides": { + "dfe.funded_childcare.working_parent_children_2_to_4": 2025 + }, + "input_h5_sha256": "c2804c18c0fc6a1c00e2ccc68f5eda5cd8b739906970dcb95ca82471d9d436b8", + "ledger_facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", + "stochastic_contract_sha256_at_fit": "ba3daedade4c9e0115307eab2575e98c6921fb09357664ae3ea15644a86939e0", + "optimizer": { + "eps": 1e-06, + "loss": 0.07969210950295769, + "maxiter": 50, + "method": "L-BFGS-B", + "success": true + }, + "achieved": { + "dfe.funded_childcare.early_learning_2_year_olds": { + "target": 115852.0, + "value": 98692.247, + "ratio": 0.8519 + }, + "dfe.funded_childcare.universal_only_children": { + "target": 416537.0, + "value": 416536.695, + "ratio": 1.0 + }, + "dfe.funded_childcare.working_parent_children_2_to_4": { + "target": 621482.0, + "value": 612914.443, + "ratio": 0.9862 + }, + "hmrc.tfc.children_with_used_accounts": { + "target": 1085020.0, + "value": 1235197.414, + "ratio": 1.1384 + }, + "hmrc.tfc.government_top_up": { + "target": 632200000.0, + "value": 508305122.499, + "ratio": 0.804 + } + }, + "status": "fitted on the L2 column twin at the 2024 base year (A6); hours distribution frozen; the same fit drove tax_free_childcare and targeted_childcare to the 1.0 bound, which are held at their incumbent values pending adjudication (plan A22/A23)" } }, { diff --git a/packages/microcosm-build/tests/test_uk_stochastic_tools.py b/packages/microcosm-build/tests/test_uk_stochastic_tools.py index cb659d549..732e20968 100644 --- a/packages/microcosm-build/tests/test_uk_stochastic_tools.py +++ b/packages/microcosm-build/tests/test_uk_stochastic_tools.py @@ -83,6 +83,44 @@ def runner(path: Path, params: np.ndarray, seed: int, period: int, contract): assert set(first["achieved"]) == set(tool.TARGET_IDS) +def test_childcare_expected_counts_are_bilinear_in_the_extended_rate() -> None: + tool = _load_tool("fit_uk_childcare_takeup") + # Two rows: the first family is extended-eligible (loses targeted and + # universal when it claims extended), the second is not. + with_ext = { + "hmrc.tfc.government_top_up": np.array([100.0, 50.0]), + "hmrc.tfc.children_with_used_accounts": np.array([1.0, 1.0]), + "dfe.funded_childcare.working_parent_children_2_to_4": np.array([1.0, 0.0]), + "dfe.funded_childcare.early_learning_2_year_olds": np.array([0.0, 1.0]), + "dfe.funded_childcare.universal_only_children": np.array([0.0, 1.0]), + } + without_ext = { + **with_ext, + "dfe.funded_childcare.early_learning_2_year_olds": np.array([1.0, 1.0]), + "dfe.funded_childcare.universal_only_children": np.array([1.0, 1.0]), + } + basis = tool.ChildcareExpectationBasis( + with_extended=with_ext, without_extended=without_ext, rows=2 + ) + # RATE_KEYS order: tfc, extended, targeted, universal + expected = tool.expected_childcare_counts(basis, np.array([0.5, 0.25, 1.0, 0.4])) + + assert expected["hmrc.tfc.government_top_up"] == pytest.approx(75.0) + assert expected["hmrc.tfc.children_with_used_accounts"] == pytest.approx(1.0) + assert expected["dfe.funded_childcare.working_parent_children_2_to_4"] == ( + pytest.approx(0.25) + ) + # targeted: family 1 is eligible only when it does not claim extended. + assert expected["dfe.funded_childcare.early_learning_2_year_olds"] == ( + pytest.approx(1.0 * (0.75 + 1.0)) + ) + assert expected["dfe.funded_childcare.universal_only_children"] == ( + pytest.approx(0.4 * (0.75 + 1.0)) + ) + ceiling = tool.expected_childcare_counts(basis, np.ones(4)) + assert ceiling["dfe.funded_childcare.early_learning_2_year_olds"] == 1.0 + + def test_childcare_fitter_family_allow_list_excludes_entitlement_spending() -> None: tool = _load_tool("fit_uk_childcare_takeup") diff --git a/packages/microcosm-build/tests/test_uk_take_up_contract.py b/packages/microcosm-build/tests/test_uk_take_up_contract.py index 402410eef..d52f201b9 100644 --- a/packages/microcosm-build/tests/test_uk_take_up_contract.py +++ b/packages/microcosm-build/tests/test_uk_take_up_contract.py @@ -46,8 +46,8 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.55, 0.5, 0.88, - 0.812, - 0.563, + 0.6054, + 0.4539, 0.597, 0.97, 0.85, @@ -67,6 +67,7 @@ def test_year_selection_uses_latest_value_at_or_before_build_year() -> None: assert contract.rate("child_benefit", 2021) == 0.97 assert contract.rate("child_benefit", 2023) == 0.89 assert contract.rate("tax_free_childcare", 2024) == 0.88 + assert contract.rate("tax_free_childcare", 2023) == 0.586 assert contract.rate("tv_licence_evasion_rate", 2024) == 0.1252 assert contract.rate("tax_free_childcare_spend_routed_share", 2017) == 0.359 assert contract.rate("tax_free_childcare_spend_routed_share", 2024) == 0.593 diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json index 7013d4cf5..101ad7a8b 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"dfd331a9aba8fd095ebb16250f90cbb5de2ea999874c22fa3bea6a7e33fa83bf","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_disability","stage_contract_sha256":"2d5ed820f9f9fbe4a45a333f5c5e1dfbdfe2b53a055584ada4c44eacb4b58954","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"frs_education_grant_split","stage_contract_sha256":"6f0fcfa6a1aa614f7ccefe39364b4ebd208c9a4ed081f7618e026b2e87f152fa","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"frs_take_up","stage_contract_sha256":"d10ca01bfa5d719640ded8e62196b0692236d3be0a2417899deeefd241088abf","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_person_draws","stage_contract_sha256":"9c299a6cf69ac771667ee3e3105637ff87cd780a423db805f9002352b2f1005f","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"was_wealth","stage_contract_sha256":"c499dcb7c49a0176229dbc363b400415cb5c1da44af266ba2155f9a62a0bd2ed","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"base":"frs_brma.checkpoint","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"regional_property_uprating","stage_contract_sha256":"4304356c6c5ba91a04883148cbf9078761ee926c8387aadb6c15b6b70ebb31f6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"lcfs_consumption","stage_contract_sha256":"eb0a529c357c84290a001209a18c5a43b0a0310553c77963d6842fd0111b73ad","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"etb_vat","stage_contract_sha256":"99a6756256adfe8255672fafda89710c08ae56bd2b8f011b20c3b8381eabfa1e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"etb_services","stage_contract_sha256":"48294c9d86dd422238a723aca5845e9ceb9eda2903a3bb87bb32a86092447e19","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_spi_income_spine","stage_contract_sha256":"3db4e7361ea871ca57b52aafce48209409d7b59d836ed973eee946b5657a771a","time_period":"2024"},"population":"spi_support_channel","sources":["frs"],"structural":"none","weights":null},{"base":"spi_support_channel","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_reporter_redraw","stage_contract_sha256":"23a23df85489708d15c7c0be3d1339ff5e1fe0932abaea0f95fcbf9c6d368205","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","person_support_channel","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_capital_coherence","stage_contract_sha256":"64024e4ca8659cad2452abe5578071cf8226e693f3cb975cf4778078bf8baf17","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Run structural UK stage cgt_band_donors.","id":"cgt_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_band_donor","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_band_donors","stage_contract_sha256":"e10e10c49c0ca2a6a65048c91b683f818e8b6e207a6c6f57a20d76ea299160b0","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_band_donors.","id":"cgt_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_band_donor"]},"population":"cgt_band_donors","sources":[],"structural":"none","weights":null},{"base":"cgt_band_donors","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"20ada8d8ee94400bd160223e865a910db7aff9c40a7f0c8ee8ca8c40ed901b72","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"salary_sacrifice","stage_contract_sha256":"a4af925af21cc6766eb7c8855b6743a3aa4eeeb38df12cfc83063d7ad6890539","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","employee_pension_contributions","highest_education","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"student_loans","stage_contract_sha256":"7c4c76398c2e80b41c7f941a5f06246b57d89b5eb0c36d42e3116ac35e82e203","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"dfd331a9aba8fd095ebb16250f90cbb5de2ea999874c22fa3bea6a7e33fa83bf","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_disability","stage_contract_sha256":"2d5ed820f9f9fbe4a45a333f5c5e1dfbdfe2b53a055584ada4c44eacb4b58954","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"frs_education_grant_split","stage_contract_sha256":"6f0fcfa6a1aa614f7ccefe39364b4ebd208c9a4ed081f7618e026b2e87f152fa","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"frs_take_up","stage_contract_sha256":"d10ca01bfa5d719640ded8e62196b0692236d3be0a2417899deeefd241088abf","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_person_draws","stage_contract_sha256":"e87b779c3977aa520c298f9bca54b675a8cacb8baed0b58412a1f783b42968ff","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"was_wealth","stage_contract_sha256":"c499dcb7c49a0176229dbc363b400415cb5c1da44af266ba2155f9a62a0bd2ed","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"base":"frs_brma.checkpoint","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"regional_property_uprating","stage_contract_sha256":"4304356c6c5ba91a04883148cbf9078761ee926c8387aadb6c15b6b70ebb31f6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"lcfs_consumption","stage_contract_sha256":"eb0a529c357c84290a001209a18c5a43b0a0310553c77963d6842fd0111b73ad","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"stage":"etb_vat","stage_contract_sha256":"99a6756256adfe8255672fafda89710c08ae56bd2b8f011b20c3b8381eabfa1e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"etb_services","stage_contract_sha256":"48294c9d86dd422238a723aca5845e9ceb9eda2903a3bb87bb32a86092447e19","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_spi_income_spine","stage_contract_sha256":"3db4e7361ea871ca57b52aafce48209409d7b59d836ed973eee946b5657a771a","time_period":"2024"},"population":"spi_support_channel","sources":["frs"],"structural":"none","weights":null},{"base":"spi_support_channel","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_reporter_redraw","stage_contract_sha256":"23a23df85489708d15c7c0be3d1339ff5e1fe0932abaea0f95fcbf9c6d368205","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","person_support_channel","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"uc_capital_coherence","stage_contract_sha256":"64024e4ca8659cad2452abe5578071cf8226e693f3cb975cf4778078bf8baf17","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Run structural UK stage cgt_band_donors.","id":"cgt_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_band_donor","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_band_donors","stage_contract_sha256":"e10e10c49c0ca2a6a65048c91b683f818e8b6e207a6c6f57a20d76ea299160b0","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_band_donors.","id":"cgt_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_band_donor"]},"population":"cgt_band_donors","sources":[],"structural":"none","weights":null},{"base":"cgt_band_donors","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"20ada8d8ee94400bd160223e865a910db7aff9c40a7f0c8ee8ca8c40ed901b72","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"stage":"salary_sacrifice","stage_contract_sha256":"a4af925af21cc6766eb7c8855b6743a3aa4eeeb38df12cfc83063d7ad6890539","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","employee_pension_contributions","highest_education","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"stage":"student_loans","stage_contract_sha256":"7c4c76398c2e80b41c7f941a5f06246b57d89b5eb0c36d42e3116ac35e82e203","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 25f883125..38b66b49f 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -30,7 +30,7 @@ ) from microcosm.calibrate import TargetRegistry -TOOL_VERSION = 2 +TOOL_VERSION = 3 TARGET_IDS = ( "hmrc.tfc.government_top_up", "hmrc.tfc.children_with_used_accounts", @@ -58,7 +58,8 @@ def draw_childcare_inputs( seed: int, contract: UKTakeUpContract, ) -> dict[str, np.ndarray]: - """Generate identity-keyed flags while holding the hours distribution fixed.""" + """Identity-keyed flags with the hours distribution fixed (diagnostic helper; + the fit itself uses the expected-count objective).""" ids = np.asarray(benunit_ids) if np.asarray(params).shape != (4,): raise ValueError("childcare fitter accepts exactly four take-up rates") @@ -125,9 +126,9 @@ def fit_childcare_takeup( ledger_facts_sha256: str | None = None, target_period: int = 2024, vintage_overrides: Mapping[str, int] | None = None, - seed: int = 42, - maxiter: int = 5, - eps: float = 1e-2, + seed: int = 0, + maxiter: int = 50, + eps: float = 1e-6, runner: SimulationRunner | None = None, generated_at: str | None = None, targets: Mapping[str, float] | None = None, @@ -195,6 +196,7 @@ def objective(params: np.ndarray) -> float: "input_h5": str(input_h5), "input_sha256": _sha256(input_h5), "seed": seed, + "objective": "expected_count", "generated_at": generated_at or datetime.now(UTC).date().isoformat(), "model_period": target_period, "vintage_overrides": overrides, @@ -219,24 +221,109 @@ def objective(params: np.ndarray) -> float: } for name in TARGET_IDS }, + "ceilings_at_rate_1": _ceilings(input_h5, target_period, targets), } -def _policyengine_runner( - input_h5: Path, - params: np.ndarray, - seed: int, - target_period: int, - contract: UKTakeUpContract, -) -> Mapping[str, float]: +def _ceilings( + input_h5: Path, target_period: int, targets: Mapping[str, float] +) -> dict[str, dict[str, float]] | None: + """Each row's expectation with every rate at 1.0 (the frame's reach).""" + + basis = _BASIS_CACHE.get((str(Path(input_h5).resolve()), int(target_period))) + if basis is None: + return None + ceiling = expected_childcare_counts(basis, np.ones(4)) + return { + name: {"value": ceiling[name], "ratio": ceiling[name] / float(targets[name])} + for name in TARGET_IDS + } + + +FLAG_OUTPUTS = ( + "would_claim_tfc", + "would_claim_extended_childcare", + "would_claim_universal_childcare", + "would_claim_targeted_childcare", +) +OWN_RATE_BY_TARGET = { + "hmrc.tfc.government_top_up": "tax_free_childcare", + "hmrc.tfc.children_with_used_accounts": "tax_free_childcare", + "dfe.funded_childcare.working_parent_children_2_to_4": "extended_childcare", + "dfe.funded_childcare.early_learning_2_year_olds": "targeted_childcare", + "dfe.funded_childcare.universal_only_children": "universal_childcare", +} + + +class ChildcareExpectationBasis: + """Per-row weighted contributions with the take-up flags forced on. + + ``with_extended`` holds each target's weighted per-row values when every + flag is True; ``without_extended`` the same with the extended flag False. + The engine's only cross-scheme interactions are its mutual exclusions + (targeted and universal require a family that is not extended-eligible), + so at rates ``r`` a target's expected value is + ``r_own * sum(with_ext * r_e + without_ext * (1 - r_e))`` — linear in the + own rate, bilinear with the extended rate — and the extended row is + ``r_e * sum(with_ext)``. The expectation is the quantity a take-up *rate* + controls: the spine's persisted flags are one draw from it, and later + stages clone and re-key rows, so no re-drawn realisation can sit on the + build's own — the expectation can. + """ + + __slots__ = ("with_extended", "without_extended", "rows") + + def __init__( + self, + *, + with_extended: Mapping[str, np.ndarray], + without_extended: Mapping[str, np.ndarray], + rows: int, + ) -> None: + self.with_extended = dict(with_extended) + self.without_extended = dict(without_extended) + self.rows = int(rows) + + +def expected_childcare_counts( + basis: ChildcareExpectationBasis, params: np.ndarray +) -> dict[str, float]: + """Expected weighted aggregates at ``params`` (ordered as RATE_KEYS).""" + + rates = dict( + zip(RATE_KEYS, map(float, np.asarray(params, dtype=float)), strict=True) + ) + extended = rates["extended_childcare"] + expected: dict[str, float] = {} + for target, own in OWN_RATE_BY_TARGET.items(): + with_ext = basis.with_extended[target] + if own == "extended_childcare": + expected[target] = extended * float(with_ext.sum()) + continue + without_ext = basis.without_extended[target] + expected[target] = rates[own] * float( + (with_ext * extended + without_ext * (1.0 - extended)).sum() + ) + return expected + + +def _weighted_rows( + sim: Any, values: np.ndarray, entity: str, period: int +) -> np.ndarray: + weights = np.asarray(sim.calculate(f"{entity}_weight", period), dtype=float) + return np.asarray(values, dtype=float) * weights + + +def _basis_side( + input_h5: Path, target_period: int, contract: UKTakeUpContract, *, extended: bool +) -> dict[str, np.ndarray]: from policyengine_uk import Microsimulation sim = Microsimulation(dataset=str(input_h5)) - benunit_ids = np.asarray(sim.calculate("benunit_id", target_period)) - for variable, values in draw_childcare_inputs( - benunit_ids, params, seed=seed, contract=contract - ).items(): - sim.set_input(variable, target_period, values) + benunit_count = np.asarray(sim.calculate("benunit_id", target_period)).shape[0] + for variable in FLAG_OUTPUTS: + on = extended if variable == "would_claim_extended_childcare" else True + sim.set_input(variable, target_period, np.full(benunit_count, on, dtype=bool)) person_count = np.asarray(sim.calculate("person_id", target_period)).shape[0] sim.set_input( "tax_free_childcare_spend_routed_share", @@ -246,28 +333,73 @@ def _policyengine_runner( contract.rate("tax_free_childcare_spend_routed_share", target_period), ), ) + variables = sim.tax_benefit_system.variables + + def rows(variable: str, values: np.ndarray | None = None) -> np.ndarray: + entity = variables[variable].entity.key + raw = ( + np.asarray(sim.calculate(variable, target_period)) + if values is None + else values + ) + return _weighted_rows(sim, raw, entity, target_period) + + age = np.asarray(sim.calculate("age", target_period)) + extended_receiving = np.asarray( + sim.calculate("is_child_receiving_extended_childcare", target_period) + ) return { - "hmrc.tfc.government_top_up": float( - sim.calculate("tax_free_childcare", target_period).sum() - ), - "hmrc.tfc.children_with_used_accounts": float( - sim.calculate("is_child_receiving_tax_free_childcare", target_period).sum() + "hmrc.tfc.government_top_up": rows("tax_free_childcare"), + "hmrc.tfc.children_with_used_accounts": rows( + "is_child_receiving_tax_free_childcare" ), - "dfe.funded_childcare.working_parent_children_2_to_4": float( - ( - sim.calculate("is_child_receiving_extended_childcare", target_period) - & (sim.calculate("age", target_period) >= 2) - ).sum() + "dfe.funded_childcare.working_parent_children_2_to_4": rows( + "is_child_receiving_extended_childcare", extended_receiving & (age >= 2) ), - "dfe.funded_childcare.early_learning_2_year_olds": float( - sim.calculate("is_child_receiving_targeted_childcare", target_period).sum() + "dfe.funded_childcare.early_learning_2_year_olds": rows( + "is_child_receiving_targeted_childcare" ), - "dfe.funded_childcare.universal_only_children": float( - sim.calculate("is_child_receiving_universal_childcare", target_period).sum() + "dfe.funded_childcare.universal_only_children": rows( + "is_child_receiving_universal_childcare" ), } +def compute_childcare_basis( + input_h5: Path, target_period: int, contract: UKTakeUpContract +) -> ChildcareExpectationBasis: + """Two engine runs (extended flag on / off, every other flag on).""" + + with_extended = _basis_side(input_h5, target_period, contract, extended=True) + without_extended = _basis_side(input_h5, target_period, contract, extended=False) + return ChildcareExpectationBasis( + with_extended=with_extended, + without_extended=without_extended, + rows=int(with_extended["hmrc.tfc.children_with_used_accounts"].shape[0]), + ) + + +_BASIS_CACHE: dict[tuple[str, int], ChildcareExpectationBasis] = {} + + +def _policyengine_runner( + input_h5: Path, + params: np.ndarray, + seed: int, + target_period: int, + contract: UKTakeUpContract, +) -> Mapping[str, float]: + """Expected-count objective; ``seed`` is unused (no draw is taken).""" + + del seed + key = (str(Path(input_h5).resolve()), int(target_period)) + basis = _BASIS_CACHE.get(key) + if basis is None: + basis = compute_childcare_basis(input_h5, target_period, contract) + _BASIS_CACHE[key] = basis + return expected_childcare_counts(basis, params) + + def _parse_overrides(values: list[str]) -> dict[str, int]: result = {} for value in values: @@ -286,17 +418,24 @@ def main() -> None: parser.add_argument("--target-period", type=int, default=2024) parser.add_argument("--vintage-override", action="append", default=[]) parser.add_argument("--output", type=Path, required=True) - parser.add_argument("--seed", type=int, default=42) - parser.add_argument("--maxiter", type=int, default=5) + parser.add_argument( + "--seed", + type=int, + default=0, + help=( + "Recorded in the receipt; the expected-count objective takes no " + "draw (identity draws are a diagnostic helper only)." + ), + ) + parser.add_argument("--maxiter", type=int, default=50) parser.add_argument( "--eps", type=float, - default=1e-2, + default=1e-6, help=( - "Finite-difference step for L-BFGS-B on the four rates. The draws " - "are identity-keyed thresholds, so a step smaller than one over the " - "eligible base flips no unit and reads as a zero gradient; the " - "targeted 2-year-old base is a few hundred sample children." + "Finite-difference step for L-BFGS-B on the four rates. The " + "expected-count objective is smooth (bilinear in the rates), so " + "a small step is exact; recorded in the receipt." ), ) args = parser.parse_args() From 612991da31a3f630ef268d1e10094b88715fbc48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 08:15:55 +0200 Subject: [PATCH 28/33] =?UTF-8?q?Record=20the=20L4=20composition=20receipt?= =?UTF-8?q?s=20for=20#834=20(runs=201=E2=80=934,=20register=20verdict)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Run 1 is the weighting-sensitivity receipt (per-target uniform weights); run 2 the family-equal composition, equal to L4-pre to the second decimal with the seven new rows binding within 0.5%; run 4 reproduces it on a payload-identical rebuild with the seam supplying the exclusion clock, so the ported target-fit register renders its verdict: the four UC with-children cells defer, OBR CGT and the two state-pension bands fail unsigned, the private-pension band entry reads stale. The runner's --build-record-json is the seam's own output; the note records how run 2 overwrote the twin's spine sidecar and why the twin was rebuilt. Co-Authored-By: Claude Fable 5.1 --- experiments/834-childcare-tfc-receipts.md | 62 ++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/experiments/834-childcare-tfc-receipts.md b/experiments/834-childcare-tfc-receipts.md index 0da64ea98..623a620f3 100644 --- a/experiments/834-childcare-tfc-receipts.md +++ b/experiments/834-childcare-tfc-receipts.md @@ -336,7 +336,67 @@ terminal battery also failed closed on the ported gate (`KeyError: exclusions_ev the binding's required-artifact set lacked the exclusion clock, fixed on the branch (`7234d305`). -**Run 2 (converged landing 0.6054 / 0.4539, `family_equal` as L4-pre):** pending. +**Run 2 (converged landing 0.6054 / 0.4539, `family_equal` as L4-pre; `l4-834/run2/`).** Loss +0.352 → 0.0235, 90.0% of 371 targets within 10%, ESS 5 868 — L4-pre read 0.374 → 0.0259, 90.7% +of 364, 5 733. The seven new rows all bind and fit (initial → final): + +| row | initial | final | +|---|---|---| +| `hmrc.tfc.government_top_up` (£599.8m, FY2025-26) | 0.767 | 0.999 | +| `hmrc.tfc.children_with_used_accounts` (1 151 515) | 0.945 | 0.999 | +| `dfe.funded_childcare.working_parent_children_2_to_4` (621 482) | 0.975 | 1.000 | +| `dfe.funded_childcare.early_learning_2_year_olds` (95 031) | 0.766 | 0.997 | +| `dfe.funded_childcare.universal_only_children` (396 965) | 1.149 | 0.995 | +| `dft.bus_fare_receipts.england` (£3.417bn) | 0.569 | 0.999 | +| `dft.bus_net_support.england` (£3.025bn) | 0.712 | 1.002 | + +The pre-existing surface is where L4-pre left it, to the second decimal: the seven cells +outside `uk_target_fit`'s 25% are the same seven — OBR CGT +44.2% (A21), the four UC +with-children cells (single_with_children −35.3%, children_1 −28.9%, children_2 −38.9%, +children_5_or_more −28.6%; signed on the stack's register to 2026-09-30) and the two +state-pension SPI bands (+34.6% / +25.3%; the 50–70k deferral the stack retired as stale +twice, back outside the bound here); UC caseload −13.4% (L4-pre −12.7%); the two HMRC CGT +totals within 0.3%; the Scotland youngest-child row +0.3%; the private-pension 100–150k band ++24.7% (L4-pre +24.9%). So the childcare and bus rows are reachable by the weights on this +frame (targeted's 0.77× at design weights closes to 0.997 — the A22 row needs no deferral), +and the port neither helps nor harms the #145 residuals. Against uk-data 1.57.2's release ratios +at 2024 (universal 0.93, extended 1.16, targeted 0.78, TFC children 1.01, spend 0.99) the +composed surface binds the 2025 counterparts to within 0.5% each. + +The terminal battery on run 2 reports `uk_target_fit` as `evidence_absent` (missing +`exclusions_evaluated_on`): the ported gate reads the run clock from the battery's artifacts, +and main's calibration seam (`calibration_run.py`) supplies the clock only to the spine build's +battery, where the stack's own runner supplied it to the seam. Fixed on the composition +branch (the seam now passes the evaluation date, as the rowwise candidate build does). + +**Run 3 → run 4.** The re-run refused at the input sidecar: the runner's `--build-record-json` +is the seam's own output record, not the input's sidecar (the seam reads that from the H5's +`.build.json` path), and runs 1–2 had been pointed at the twin's spine record, so run 2 had +overwritten `l5-refit-b.build.json` with the seam's record (kept as +`l4-834/run2/calibration_build_record.json`). The H5, gate report and shares were untouched. +The twin is rebuilt into `l5-refit-twin-b2/` (sha `c63d824f…`; `l5b2_vs_l5b_payload.json`: +`payload_identical: true` — benunit, household, person and time_period byte-equal to twin-b, +the twin-determinism property of the 686 receipts holding on this tree) and +run 4 measures that build on the rebased composition branch (`91d740d6`, `385efc4d`, +`955c5dd2` on `db489ac0`); the solve is seeded, so run 4 reproduces run 2's numbers and adds +the gate verdict. + +**Run 4 (`l4-834/run4/`, twin-b2, the composition measurement).** Every final ratio equals run +2's (max |difference| 0.0). Terminal battery with the ported register, evaluated 2026-09-05: +`uk_target_fit` **fails** and blocks at the terminal phase — + +| disposition | cells | +|---|---| +| deferred (in force to 2026-09-30, microcosm#796) | the four UC with-children cells: single_with_children −35.3%, children_1 −28.9%, children_2 −38.9%, children_5_or_more −28.6% | +| failing, unsigned | `obr.capital_gains_tax` +44.2% (A21); `hmrc/state_pension_income_band_50_000_to_70_000` +34.6% (the deferral the stack retired as "measured stale twice", outside the bound again here as at L4-pre's +33.2%); `hmrc/state_pension_income_band_20_000_to_30_000` +25.3% (L4-pre +26.7%) | +| stale (back inside the bound; the rot rule says remove) | `hmrc/private_pension_income_count_income_band_100_000_to_150_000` +24.7% | + +None of the four is a #834 row: the seven new rows pass, and the A22 question (would the +targeted row need a deferral?) is answered no. The three unsigned failures and the stale entry +are the publication stack's open register questions — A21 for the CGT year; the two +state-pension bands and the pension-band entry for the stack's next re-cut — and are put to +María with this receipt rather than signed here. `release_candidate: false` throughout: the +seam never signs shippability. ## Part D — bus (#789) From c5b59c83c38f6bb03fe252e4a871cb8ce672367f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 08:40:35 +0200 Subject: [PATCH 29/33] Fix the two full-tree funnel findings: cite uk-data, and carry the new reference fields in monetary-binding receipts (#834) The live-tree guard refuses the incumbent package name: the signed target-reference exclusions register now cites uk-data#230 and the uk-data PR as every other live file does. The monetary binding's activated-reference receipt is an exact key set; LedgerTargetReference gained value_operands and expected_member_count for the multi-member childcare rows, so the receipt contract and its hermetic fixture carry them. Co-Authored-By: Claude Fable 5.1 --- changelog.d/uk-childcare-bus-targets-834-789.added.md | 1 + .../build/uk/target_reference_signed_exclusions.json | 4 ++-- .../src/microcosm/calibrate/monetary_binding.py | 6 ++++++ packages/microcosm-calibrate/tests/test_monetary_binding.py | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/changelog.d/uk-childcare-bus-targets-834-789.added.md b/changelog.d/uk-childcare-bus-targets-834-789.added.md index 051722815..c1a3bacae 100644 --- a/changelog.d/uk-childcare-bus-targets-834-789.added.md +++ b/changelog.d/uk-childcare-bus-targets-834-789.added.md @@ -1 +1,2 @@ Add five UK childcare calibration targets and two active England bus-finance targets, with six signed bus exclusions (#834, #789). +The activated-reference receipt of monetary bindings now carries the reference's `value_operands` and `expected_member_count`, so a multi-member declaration stays byte-identical through activation. diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json index 50b8eb618..5981d7d25 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json @@ -4,8 +4,8 @@ { "target_id": "hmrc.spi.property_income.amount_by_total_income_band", "reason_id": "property_income_undercount_adjustment_missing", - "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.", - "tracking": "policyengine-uk-data#230", + "rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface.", + "tracking": "uk-data#230", "approved_by": "juaristi22", "approved_on": "2026-09-05" }, diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/monetary_binding.py b/packages/microcosm-calibrate/src/microcosm/calibrate/monetary_binding.py index ff41bd38e..a5f0a82d1 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/monetary_binding.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/monetary_binding.py @@ -64,6 +64,12 @@ class MonetaryBindingIntegrityError(RuntimeError): "uprating_index", "uprating_from_period", "uprating_to_period", + # #834: multi-member references (a sum or difference over declared + # operands) carry their operand roles and member-count guard in the + # receipt, so the activated reference stays byte-identical to the + # declaration that compiled it. + "value_operands", + "expected_member_count", } ) _PREPARED_KEYS = frozenset( diff --git a/packages/microcosm-calibrate/tests/test_monetary_binding.py b/packages/microcosm-calibrate/tests/test_monetary_binding.py index 4ad41637b..aac21acb7 100644 --- a/packages/microcosm-calibrate/tests/test_monetary_binding.py +++ b/packages/microcosm-calibrate/tests/test_monetary_binding.py @@ -84,6 +84,8 @@ def _target(values=(2.0, 4.0), ids=(1, 2)): "ledger_source_record_id": "synthetic.fact", "ledger_selector": {}, "value_operation": "identity", + "value_operands": [], + "expected_member_count": None, "entity": target.entity, "measure": target.measure, "filter": target.filter, From fb2571f7bb5a8e3466847babeca5ac775684c2bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 15:06:21 +0200 Subject: [PATCH 30/33] Record the signed CGT deferral and run 5 in the #834 receipts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit María ruled A21 as option 1 on 2026-09-05: the facts stay bound as published and obr.capital_gains_tax@2025 is signed on the publication stack's register under microcosm#875 (window to 2026-10-05). Run 5 reproduces run 4 and the battery now defers five cells; the two state-pension bands and the stale private-pension band entry remain the stack's open questions. Co-Authored-By: Claude Fable 5.1 --- experiments/834-childcare-tfc-receipts.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/experiments/834-childcare-tfc-receipts.md b/experiments/834-childcare-tfc-receipts.md index 623a620f3..b3d53ab49 100644 --- a/experiments/834-childcare-tfc-receipts.md +++ b/experiments/834-childcare-tfc-receipts.md @@ -392,12 +392,23 @@ the gate verdict. | stale (back inside the bound; the rot rule says remove) | `hmrc/private_pension_income_count_income_band_100_000_to_150_000` +24.7% | None of the four is a #834 row: the seven new rows pass, and the A22 question (would the -targeted row need a deferral?) is answered no. The three unsigned failures and the stale entry -are the publication stack's open register questions — A21 for the CGT year; the two -state-pension bands and the pension-band entry for the stack's next re-cut — and are put to -María with this receipt rather than signed here. `release_candidate: false` throughout: the +targeted row need a deferral?) is answered no. `release_candidate: false` throughout: the seam never signs shippability. +**Run 5 (`l4-834/run5/`, the signed CGT deferral).** María ruled A21 as option 1 on 2026-09-05: +the facts stay bound as published and the OBR miss is signed on the stack register — +`obr.capital_gains_tax@2025`, adjudication microcosm#875 (the declared 2024-25 → 2025 +translation of the gains total: the index ruling, applying `uprating_index` in the compile +step, the taxpayer count flat at 584k under the £3 000 exempt amount, the cash-lag mapping for +self-assessed OBR lines), window 2026-09-05 → 2026-10-05, on `uk-publication-stack-834` +(`7aab6959`); #736's "CGT 2025 level" item points at it. Every final ratio equals run 4's +(max |difference| 0.0); the battery now reads five in-force deferrals (the four UC +with-children cells and the CGT cell), two unsigned failures — the state-pension SPI bands +50–70k +34.6% and 20–30k +25.3% — and the private-pension 100–150k entry stale (+24.7%). Those +three are the stack's, not #834's, and stay open for its next re-cut. While the CGT entry is +in force the calibrated 2025-26 base carries ~40% more CGT liability than OBR expects; the +publication's known issues must say so. + ## Part D — bus (#789) E9's Part D (`experiments/685-net-new-stages-receipts.md`) is the sizing evidence: at design From f3b49f30345c8ae284ef443ba19f4b266ad00ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 15:28:40 +0200 Subject: [PATCH 31/33] Regenerate the national membership report after the uk-data citation fix (#834) The membership report embeds the signed-exclusion rationale, so the citation fix in the register moved its digest; the references themselves are byte-identical. The packaged-report test carries the uk-data wording. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/uk/target_reference_membership.json | 4 ++-- packages/microcosm-build/tests/test_uk_target_references.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 637fbc254..23c33a2d3 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 @@ -4082,7 +4082,7 @@ "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." + "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." } ] }, @@ -8013,7 +8013,7 @@ "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." + "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." }, { "family": "ons_population", diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index 28c0cefd4..2e46a2d5b 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -560,8 +560,8 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: "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, " + "The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI " + "covers only taxpayers with liability, " "and HMRC Property Rental Income Statistics show GBP 46.68bn " "versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI " "facts would knowingly calibrate to 10/19 of the incumbent " From 6a457b375d895e5fb401d42dd4212351074889c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 15:31:30 +0200 Subject: [PATCH 32/33] Approve the merged tree's uv.lock digest for the primary-QRF worker identity (#834) Main's #871 attests the workspace lock; this branch's policyengine-uk floor bump (>=2.93, lock 2.94.0) changed uv.lock, so the merged tree's digest is approved. No derived identity moved: the spec-engine identity, legacy adapter, re-emission, field-usage and inventory-coverage suites pass on the approved digest without a re-pin. Co-Authored-By: Claude Fable 5.1 --- .../src/microcosm/build/us_runtime/worker_identity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py b/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py index 1df039486..17104fd29 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py @@ -28,7 +28,7 @@ PRIMARY_QRF_WORKER_MODULE = "microcosm.build.us_runtime.puf_qrf_worker" PRIMARY_QRF_INTERPRETER_PLACEHOLDER = "{python_interpreter}" APPROVED_UV_LOCK_SHA256 = ( - "1c1444045960e111433b064abeeb40eebbf55984b7132931d9987697a6f4b606" + "ca9305fcebb5854d8d8369eb10fd134c918da7a79ab90f21c932c946b35165e5" ) LEGACY_CAMPAIGN_UV_LOCK_SHA256 = ( "27f47e385cfa35e2644a37410d1804b361ad9aee123577551c8421547bda65ee" From 8de6bf44d7bd4a5b6ce5c8c24add4501c0944824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:13:01 +0200 Subject: [PATCH 33/33] Let the childcare fitter's receipt run without the engine installed (#834) The provenance receipt read policyengine-uk's version unconditionally, so the hermetic determinism test with an injected runner failed in CI's no-engine lanes (fast spine-uk, wheels) while every engine lane passed. The version is recorded as absent when the distribution is missing; a real fit still needs the engine for its basis runs. Co-Authored-By: Claude Fable 5.1 --- tools/fit_uk_childcare_takeup.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tools/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 38b66b49f..219e02a19 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -188,7 +188,6 @@ def objective(params: np.ndarray) -> float: options={"maxiter": maxiter, "eps": eps}, ) achieved = dict(runner(input_h5, result.x, seed, target_period, contract)) - from importlib.metadata import version return { "tool": "fit_uk_childcare_takeup", @@ -203,7 +202,7 @@ def objective(params: np.ndarray) -> float: "ledger_facts_sha256": feed_sha256, "target_registry_version": registry_version, "stochastic_contract_sha256": contract.resource_sha256, - "engine_version": version("policyengine-uk"), + "engine_version": _engine_version(), "optimizer": { "method": "L-BFGS-B", "maxiter": maxiter, @@ -225,6 +224,22 @@ def objective(params: np.ndarray) -> float: } +def _engine_version() -> str | None: + """The installed policyengine-uk version, or None when it is absent. + + A real fit needs the engine (the basis runs import it); the receipt's + provenance field must not make a hermetic run with an injected runner + depend on the engine being installed. + """ + + from importlib.metadata import PackageNotFoundError, version + + try: + return version("policyengine-uk") + except PackageNotFoundError: + return None + + def _ceilings( input_h5: Path, target_period: int, targets: Mapping[str, float] ) -> dict[str, dict[str, float]] | None: