diff --git a/PROGRESS-chronicle-dual-accept-round2.md b/PROGRESS-chronicle-dual-accept-round2.md new file mode 100644 index 000000000..8406d02f9 --- /dev/null +++ b/PROGRESS-chronicle-dual-accept-round2.md @@ -0,0 +1,89 @@ +# 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 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 + +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)` +- [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. diff --git a/PROGRESS-chronicle-dual-accept.md b/PROGRESS-chronicle-dual-accept.md new file mode 100644 index 000000000..604b9ec9a --- /dev/null +++ b/PROGRESS-chronicle-dual-accept.md @@ -0,0 +1,163 @@ +# 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. + +> **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 +*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` + + *(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. + +**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 the PR body and +in the lane's report. PR #849, open, do not merge. + +## Done + +- `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. + + *(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`, + `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 + 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`. + +## 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 + +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 + +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 new file mode 100644 index 000000000..0af1451c3 --- /dev/null +++ b/changelog.d/chronicle-dual-accept.added.md @@ -0,0 +1 @@ +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. 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..c1a3bacae --- /dev/null +++ b/changelog.d/uk-childcare-bus-targets-834-789.added.md @@ -0,0 +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/changelog.d/uk-childcare-fitter-834.changed.md b/changelog.d/uk-childcare-fitter-834.changed.md new file mode 100644 index 000000000..b83707c99 --- /dev/null +++ b/changelog.d/uk-childcare-fitter-834.changed.md @@ -0,0 +1 @@ +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/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/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/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/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..b3d53ab49 --- /dev/null +++ b/experiments/834-childcare-tfc-receipts.md @@ -0,0 +1,450 @@ +# #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) + +### 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):** 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; `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. `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 +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/logbook/README.md b/logbook/README.md index a148dd142..81dc42fdd 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 (`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 +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` 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-build/src/microcosm/build/__init__.py b/packages/microcosm-build/src/microcosm/build/__init__.py index 352f53b74..b50754703 100644 --- a/packages/microcosm-build/src/microcosm/build/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/__init__.py @@ -49,6 +49,22 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: _assert_frame_compatible(_frame_version, _REQUIRED_FRAME_SERIES) +from microcosm.build.chronicle_epoch import ( # noqa: E402 - after the compat gate + 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, +) from microcosm.build.country_spec import ( # noqa: E402 - after the compat gate CountryResourceRow, CountrySpec, @@ -126,6 +142,15 @@ 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_names, +) from microcosm.build.monetary_profile import ( # noqa: E402 - after compat gate MonetaryTargetContract, MonetaryTargetProfile, @@ -196,6 +221,14 @@ 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", + "DECLARED_IDENTITIES", + "DECLARED_IDENTITY_EPOCHS", + "EPOCHS", + "LEDGER_EPOCH", + "UNDECLARED", "LedgerConsumerArtifact", "LedgerTargetMapping", "LedgerTargetSelection", @@ -204,6 +237,13 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: "MonetaryTargetProfile", "PreparedMonetaryMeasure", "add_ledger_artifact_args", + "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", "area_support_gate", "column_implication_gate", 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..86fdf09a3 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/chronicle_epoch.py @@ -0,0 +1,585 @@ +"""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 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 +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. **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 + 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. + +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 + +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", + "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_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", + "parse_fact_key", + "row_fact_key_epochs", +] + +#: The ledger era: everything Chronicle issued under its former name. +LEDGER_EPOCH = "ledger" + +#: 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) + +#: 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.v3" +) + +#: 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" + +#: 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 +} +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( + _identities_of(CONSUMER_ARTIFACT_SCHEMA_IDENTITY_KIND) +) +ACCEPTED_CONSUMER_FACT_SCHEMA_VERSIONS = frozenset( + _identities_of(CONSUMER_FACT_SCHEMA_IDENTITY_KIND) +) + +#: 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] = { + 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 +#: 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"), + ("lineage", "source_row_keys"), +) + +#: Nested single-key paths. +_FACT_KEY_NESTED_PATHS: tuple[tuple[str, ...], ...] = ( + ("concept_alignment", "concept_alignment_key"), +) + + +@dataclass(frozen=True) +class FactKeyIdentity: + """The structure of a Chronicle-shaped key, ``:``. + + ``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 + namespace: str + family: str + 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 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 + 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 + 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=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 *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 *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 epoch label appearing in one consumer-fact row's Chronicle keys. + + 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. + """ + 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, ...]: + """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. 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(label for label in FACT_KEY_EPOCH_LABELS if label in observed) + + +def is_accepted_consumer_artifact_schema_version(value: object) -> bool: + """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 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 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 _schema_epoch(value, CONSUMER_FACT_SCHEMA_IDENTITY_KIND) + + +def describe_accepted_consumer_artifact_schema_versions() -> str: + """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: + """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 _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)) + + 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: + 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..815da04a7 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -1,16 +1,39 @@ -"""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. + +**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. 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 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 @@ -22,7 +45,18 @@ from pathlib import Path from typing import Any +from microcosm.build.chronicle_epoch import ( + ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, + 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, +) + __all__ = [ + "ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS", "ALLOWED_LEDGER_ASSERTIONS", "CONSUMER_ARTIFACT_SCHEMA_VERSION", "DEFAULT_LEDGER_ASSERTION", @@ -32,21 +66,30 @@ "resolve_ledger_artifact", ] -CONSUMER_ARTIFACT_SCHEMA_VERSION = "policyengine_ledger.consumer_artifact.v1" +#: 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" @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 +103,65 @@ 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, ...]: + """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. 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. + + 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]: - """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, + 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, "fact_row_count": self.fact_row_count, @@ -82,6 +182,10 @@ 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) + payload["undeclared_fact_key_domains"] = list(self.undeclared_fact_key_domains) + payload["fact_schema_versions"] = list(self.fact_schema_versions) return payload @@ -123,11 +227,17 @@ 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 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 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 +332,17 @@ 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__}." ) + # 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/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/logbook.py b/packages/microcosm-build/src/microcosm/build/logbook.py index 5047bb77a..6cfb75d12 100644 --- a/packages/microcosm-build/src/microcosm/build/logbook.py +++ b/packages/microcosm-build/src/microcosm/build/logbook.py @@ -7,12 +7,17 @@ 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 +``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 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 @@ -28,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 ``POPULACE_LEDGER_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. @@ -56,6 +61,14 @@ from urllib.parse import urlencode, urlsplit from urllib.request import HTTPRedirectHandler, Request, build_opener +from microcosm.build.logbook_env import ( + LEGACY_API_KEY_ENV, + LOGBOOK_API_KEY_ENV, + LOGBOOK_KEY_ENV, + LOGBOOK_URL_ENV, + logbook_env, +) + __all__ = [ "BUILD_DISPOSITIONS", "LOGBOOK_ROW_FIELDS", @@ -91,7 +104,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.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( { "build_id", @@ -820,11 +837,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 = logbook_env(LOGBOOK_URL_ENV) + key = logbook_env(LOGBOOK_KEY_ENV) if not url or not key: return None - api_key = os.environ.get(LEDGER_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/logbook_env.py b/packages/microcosm-build/src/microcosm/build/logbook_env.py new file mode 100644 index 000000000..6a7ff6f9b --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/logbook_env.py @@ -0,0 +1,150 @@ +"""Dual-read for the Logbook (formerly Ledger) environment variables. + +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:`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. + +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 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 + +import os +import threading +import warnings +from collections.abc import Mapping + +__all__ = [ + "LEGACY_API_KEY_ENV", + "LEGACY_EXPORT_KEY_ENV", + "LEGACY_KEY_ENV", + "LEGACY_URL_ENV", + "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, 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. +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. +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 logbook_env( + name: str, + default: str | None = None, + *, + environ: Mapping[str, str] | None = None, +) -> str | None: + """Read one Logbook variable, preferring ``name`` over its legacy spelling. + + ``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 + 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 LOGBOOK_ENV_LEGACY_NAMES: + raise KeyError( + 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 LOGBOOK_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 logbook_env_names(name: str) -> tuple[str, ...]: + """The preferred name followed by every legacy name still honored.""" + if name not in LOGBOOK_ENV_LEGACY_NAMES: + raise KeyError( + f"{name!r} is not a Logbook environment variable; expected one of " + f"{sorted(LOGBOOK_ENV_LEGACY_NAMES)}." + ) + return (name, *LOGBOOK_ENV_LEGACY_NAMES[name]) + + +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 + 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 LOGBOOK_ENV_LEGACY_NAMES[name] + ) + return f"{preferred} (legacy {legacy} still honored)" + + +def reset_logbook_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 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, + stacklevel=3, + ) 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 7629404be..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 = "" @@ -99,6 +102,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 = "" @@ -432,6 +438,7 @@ def target_references_resource( "allowed_value_operations": [ "identity", "sum", + "difference", "calendar_year_average", "latest_plateau", "count_x_mean", @@ -538,6 +545,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") @@ -721,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") @@ -731,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 ab237d33e..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": 170, + "calibration_drift": 172, "fixture_only": 267, - "ledger_only": 38 + "ledger_only": 45 }, - "difference_count": 475, + "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, @@ -2161,7 +2210,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 +2218,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 +2226,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 +2234,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 +2242,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 +2250,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 +2258,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 +2266,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 +2274,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 +2282,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 +2290,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 +2298,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 +2306,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 +2314,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 +2322,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 +2330,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 +2338,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 +2346,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 +2354,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 +2362,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 +2370,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 +2378,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 +2386,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 +2394,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 +2402,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 +2410,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 +2418,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 +2426,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 +2434,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 +2442,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 +2450,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 +2458,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 +2466,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 +2474,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 +2482,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 +2490,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 +2498,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 +2506,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 +2514,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 +2522,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 +2530,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 +2538,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 +2546,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 +2554,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 +2562,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 +2570,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 +2578,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 +2586,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 +2594,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 +2602,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 +2610,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 +2618,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 +2626,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 +2634,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 +2642,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 +2650,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 +2674,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 +2682,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 +2690,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 +2698,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 +2706,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 +2714,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 +2722,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 +2730,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 +2738,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 +2746,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 +2754,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 +2762,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 +2770,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 +2778,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 +2786,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 +2794,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 +2802,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 +2810,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 +2818,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 +2826,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 +2834,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 +2842,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 +2850,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 +2858,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 +2866,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 +2874,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 +2882,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 +2890,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 +2898,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 +2906,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 +2914,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 +2922,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 +2930,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 +2938,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 +2946,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 +2954,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 +2962,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 +2970,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 +2978,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 +2986,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 +2994,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 +3002,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 +3010,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 +3018,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 +3026,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 +3034,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 +3042,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 +3050,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 +3058,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 +3066,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 +3074,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 +3082,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 +3090,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..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, @@ -884,18 +884,53 @@ }, { "kind": "ledger_only", - "ledger_value": 65937000000.0, + "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, "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." }, + { + "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_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..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" @@ -398732,6 +398733,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/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..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 @@ -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", @@ -686,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 a48ce8ec0..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 @@ -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" }, @@ -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)" } }, { @@ -161,7 +251,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 +355,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 +394,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 ec507a413..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 @@ -1,14 +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, - "multi_fact": 1, + "active": 415, "no_fact_at_or_before_period": 7, - "signed_excluded": 1 + "signed_excluded": 8 }, "geography_pins": { "obr.income_tax": { @@ -766,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", @@ -1574,12 +1626,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 +1661,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" }, { @@ -2651,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": { @@ -4015,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." } ] }, @@ -4700,12 +4767,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 +4782,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 +4896,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 +4911,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 +4926,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 +4941,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 +4956,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 +4971,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 +4986,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 +5001,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 +5016,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 +5031,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 +5286,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 +5541,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 +5796,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 +6051,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 +7036,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 +7058,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 +7073,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 +7088,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 +7103,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 +7118,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 +7133,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 +7148,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 +7163,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 +7178,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 +7193,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 +7805,184 @@ "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" + } + ] + }, + "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." } ] } @@ -7769,16 +8013,14 @@ "family": "hmrc_spi", "target_id": "hmrc.spi.property_income.amount_by_total_income_band", "status": "signed_excluded", - "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is policyengine-uk-data PR #311 / issue policyengine-uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." - } - ], - "multi_fact_rationales": [ + "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." + }, { "family": "ons_population", "target_id": "ons.population.scotland_households_3plus_children", - "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_reference_signed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json new file mode 100644 index 000000000..5981d7d25 --- /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 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" + }, + { + "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 d7cdb07f0..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,8 +4,10 @@ "allowed_value_operations": [ "identity", "sum", + "difference", "calendar_year_average", - "latest_plateau" + "latest_plateau", + "count_x_mean" ], "target_references": [ { @@ -13,6 +15,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.income_tax", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -31,6 +34,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_total", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -49,6 +53,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_employee", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -67,6 +72,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_employer", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -85,6 +91,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.ni_self_employed", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -103,6 +110,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.vat", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -121,6 +129,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.fuel_duties", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -139,6 +148,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.capital_gains_tax", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -157,6 +167,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.sdlt", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -175,6 +186,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.attendance_allowance", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -193,6 +205,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.carers_allowance", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -211,6 +224,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.child_benefit", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -247,6 +261,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.incapacity_benefits", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -266,6 +281,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.housing_benefit", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -284,6 +300,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.jobseekers_allowance", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -302,6 +319,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.pension_credit", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -320,6 +338,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.dla_and_pip", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -338,6 +357,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.state_pension", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -356,6 +376,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.statutory_maternity_pay", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -374,6 +395,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.tv_licence_fee", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -392,6 +414,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.universal_credit_in_cap", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -410,6 +433,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.universal_credit_outside_cap", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -428,6 +452,7 @@ "ledger_selector": { "source_name": "obr", "source_concept": "obr.winter_fuel_payment", + "entity_name": "person", "geography_level": "country", "geography_id": "K02000001" }, @@ -621,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": { @@ -644,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": { @@ -667,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": { @@ -690,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": { @@ -713,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": { @@ -736,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": { @@ -759,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": { @@ -782,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": { @@ -805,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": { @@ -828,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": { @@ -851,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": { @@ -874,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": { @@ -897,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": { @@ -1219,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": { @@ -1242,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": { @@ -1265,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": { @@ -1288,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": { @@ -1311,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": { @@ -1334,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": { @@ -1357,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": { @@ -1380,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": { @@ -1403,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": { @@ -1426,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": { @@ -1449,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": { @@ -1472,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": { @@ -1495,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": { @@ -1817,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": { @@ -1840,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": { @@ -1863,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": { @@ -1886,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": { @@ -1909,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": { @@ -1932,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": { @@ -1955,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": { @@ -1978,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": { @@ -2001,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": { @@ -2024,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": { @@ -2047,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": { @@ -2070,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": { @@ -2093,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": { @@ -2714,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": { @@ -2737,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": { @@ -2760,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": { @@ -2783,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": { @@ -2806,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": { @@ -2829,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": { @@ -2852,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": { @@ -2875,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": { @@ -2898,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": { @@ -2921,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": { @@ -2944,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": { @@ -2967,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": { @@ -2990,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": { @@ -3312,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": { @@ -3335,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": { @@ -3358,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": { @@ -3381,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": { @@ -3404,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": { @@ -3427,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": { @@ -3450,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": { @@ -3473,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": { @@ -3496,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": { @@ -3519,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": { @@ -3542,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": { @@ -3565,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": { @@ -3588,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": { @@ -3909,6 +3999,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 +4011,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 +4019,8 @@ "ledger_selector": { "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" }, @@ -3939,7 +4032,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 +4145,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 +4162,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 +4172,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 +4189,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 +4199,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 +4216,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 +4226,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 +4243,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 +4253,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 +4270,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 +4280,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 +4297,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 +4307,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 +4324,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 +4334,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 +4351,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 +4361,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 +4378,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 +4388,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 +4407,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 +4417,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 +4436,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 +4446,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 +4465,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 +4475,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 +4494,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 +4504,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 +4523,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 +4533,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 +4552,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 +4562,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 +4581,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 +4591,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 +4610,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 +4620,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 +4639,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 +4649,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 +4668,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 +4678,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 +4697,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 +4707,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 +4726,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 +4736,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 +4755,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 +4765,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 +4784,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 +4794,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 +4813,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 +4823,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 +4842,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 +4852,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 +4871,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 +4881,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 +4900,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 +4910,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 +4929,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 +4939,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 +4958,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 +4968,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 +4987,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 +4997,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 +5016,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 +5026,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 +5045,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 +5055,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 +5074,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 +5084,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 +5103,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 +5113,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 +5132,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 +5142,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 +5161,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 +5171,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 +5190,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 +5200,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 +5219,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 +5229,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 +5248,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 +5258,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 +5277,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 +5287,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 +5306,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 +5316,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 +5335,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 +5345,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 +5364,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 +5374,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 +5393,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 +5403,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 +5422,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 +5432,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 +5451,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 +5461,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 +5480,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 +5490,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 +5509,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 +5519,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 +5538,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 +5548,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 +5567,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 +5577,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 +5596,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 +5606,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 +5625,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 +5635,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 +5654,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 +5664,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 +5683,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 +5693,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 +5712,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 +5722,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 +5741,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 +5751,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 +5770,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 +5780,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 +5799,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 +5809,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 +5828,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 +5838,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 +5857,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 +5867,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 +5886,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 +5896,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 +5915,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 +5925,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 +5944,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 +5954,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 +5973,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 +5983,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 +6002,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 +6012,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 +6031,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 +6041,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 +6060,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 +6070,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 +6089,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 +6099,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 +6118,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 +6128,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 +6147,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 +6157,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 +6176,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 +6186,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 +6205,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 +6215,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 +6234,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 +6244,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 +6263,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 +6273,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 +6292,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 +6302,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 +6321,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 +6331,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 +6350,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 +6360,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 +6379,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 +6389,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 +6408,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 +6418,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 +6437,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 +6447,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 +6466,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 +6476,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 +6495,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 +6505,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 +6524,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 +6534,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 +6553,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 +6563,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 +6582,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 +6592,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 +6611,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 +6621,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 +6640,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 +6650,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 +6669,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 +6679,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 +6698,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 +6708,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 +6727,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 +6737,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 +6756,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 +6766,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 +6785,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 +6795,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 +6814,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 +6824,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 +6843,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 +6853,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 +6872,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 +6882,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 +6901,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 +6911,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 +6930,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 +6940,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 +6959,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 +6969,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 +6988,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 +6998,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 +7017,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 +7027,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 +7046,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 +7056,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 +7075,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 +7085,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 +7104,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 +7114,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 +7133,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 +7143,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 +7162,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 +7172,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 +7191,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 +7201,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 +7220,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 +7230,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 +7249,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 +7259,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 +7278,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,6 +7288,9 @@ "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 }, @@ -6673,7 +7305,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 }, { @@ -7063,6 +7696,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7101,6 +7735,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7139,6 +7774,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7177,6 +7813,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7215,6 +7852,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7253,6 +7891,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7291,6 +7930,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7329,6 +7969,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7367,6 +8008,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 10, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7402,6 +8044,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7437,6 +8080,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7472,6 +8116,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7507,6 +8152,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7542,6 +8188,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7577,6 +8224,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7612,6 +8260,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7647,6 +8296,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7682,6 +8332,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7717,6 +8368,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7752,6 +8404,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7787,6 +8440,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7822,6 +8476,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7857,6 +8512,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7892,6 +8548,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7927,6 +8584,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7962,6 +8620,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -7997,6 +8656,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8028,6 +8688,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 1, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8063,6 +8724,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8098,6 +8760,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8133,6 +8796,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8168,6 +8832,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8203,6 +8868,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8238,6 +8904,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8273,6 +8940,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8308,6 +8976,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8343,6 +9012,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8378,6 +9048,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8413,6 +9084,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8448,6 +9120,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8483,6 +9156,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8518,6 +9192,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8553,6 +9228,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8588,6 +9264,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8623,6 +9300,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8658,6 +9336,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 5, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8689,6 +9368,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 1, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8733,6 +9413,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 16, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -8762,6 +9443,7 @@ "measure_kind": "prepared_column" }, "value_operation": "sum", + "expected_member_count": 1, "uprating_from_period": "2024", "uprating_to_period": 2025 }, @@ -9325,6 +10007,7 @@ "dimension_values": { "social_security_line": "scottish_child_payment" }, + "entity_name": "person", "geography_level": "country", "geography_id": "S92000003" }, @@ -9343,6 +10026,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.ukea_haxv", + "entity_name": "household", "geography_level": "country", "geography_id": "K02000001" }, @@ -9379,6 +10063,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.e44r", + "entity_name": "institutional_sector", "geography_level": "country", "geography_id": "K02000001" }, @@ -9398,6 +10083,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.e44n", + "entity_name": "institutional_sector", "geography_level": "country", "geography_id": "K02000001" }, @@ -9417,6 +10103,7 @@ "ledger_selector": { "source_name": "ons", "source_concept": "ons.e43b", + "entity_name": "institutional_sector", "geography_level": "country", "geography_id": "K02000001" }, @@ -9439,6 +10126,7 @@ "source_measure_id": [ "total_higher_education" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9462,6 +10150,7 @@ "source_measure_id": [ "plan_1" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9486,6 +10175,7 @@ "plan_2_full_time", "plan_2_part_time" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9510,6 +10200,7 @@ "plan_3_postgraduate_masters", "plan_3_postgraduate_doctoral" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9534,6 +10225,7 @@ "plan_5_full_time", "plan_5_part_time" ], + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9665,6 +10357,7 @@ "ledger_selector": { "source_name": "slc", "source_concept": "slc.maintenance_loan_amount_paid", + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9709,6 +10402,7 @@ "dimension_values": { "student_support_product": "parents_learning_allowance" }, + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9753,6 +10447,7 @@ "dimension_values": { "student_support_product": "adult_dependants_grant" }, + "entity_name": "person", "geography_level": "country", "geography_id": "E92000001" }, @@ -9772,6 +10467,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" }, @@ -9786,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_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..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" } }, { @@ -3080,7 +3137,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 +3179,9 @@ }, "ledger_selector": { "source_name": "hmrc", - "source_concept": "hmrc.cgt_gains_total" + "source_concept": "hmrc.cgt_gains_total", + "groupby_dimension": "hmrc.cgt_table1_line", + "entity_name": "tax_unit" } }, { @@ -3464,6 +3524,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 +3583,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 +3642,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 +3701,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 +3760,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 +3814,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 +3868,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 +3922,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 +3976,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 +4030,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 +4085,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 +4140,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 +4195,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" } @@ -4153,7 +4256,7 @@ } ], "value_variable": "household_count", - "notes": "Scottish UC households with a child under 1 (compute/benefits.py:24-30)." + "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", @@ -4165,6 +4268,9 @@ "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 } @@ -4815,6 +4921,7 @@ }, { "target_id": "ons.population.uk_total", + "value_operation": "sum", "family": "ons_population", "geography_levels": [ "country" @@ -8582,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", @@ -9706,7 +9813,8 @@ "source_concept": "scotgov.social_security_assistance_spending", "dimension_values": { "social_security_line": "scottish_child_payment" - } + }, + "entity_name": "person" } }, { @@ -9736,7 +9844,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.ukea_haxv" + "source_concept": "ons.ukea_haxv", + "entity_name": "household" } }, { @@ -9804,7 +9913,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.e44r" + "source_concept": "ons.e44r", + "entity_name": "institutional_sector" } }, { @@ -9831,7 +9941,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.e44n" + "source_concept": "ons.e44n", + "entity_name": "institutional_sector" } }, { @@ -9858,7 +9969,8 @@ }, "ledger_selector": { "source_name": "ons", - "source_concept": "ons.e43b" + "source_concept": "ons.e43b", + "entity_name": "institutional_sector" } }, { @@ -9888,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" } }, { @@ -9935,7 +10048,8 @@ "groupby_dimension": "slc.repayment_plan", "source_measure_id": [ "total_higher_education" - ] + ], + "entity_name": "person" } }, { @@ -9990,7 +10104,8 @@ "groupby_dimension": "slc.repayment_plan", "source_measure_id": [ "plan_1" - ] + ], + "entity_name": "person" } }, { @@ -10048,7 +10163,8 @@ "source_measure_id": [ "plan_2_full_time", "plan_2_part_time" - ] + ], + "entity_name": "person" } }, { @@ -10106,7 +10222,8 @@ "source_measure_id": [ "plan_3_postgraduate_masters", "plan_3_postgraduate_doctoral" - ] + ], + "entity_name": "person" } }, { @@ -10164,7 +10281,8 @@ "source_measure_id": [ "plan_5_full_time", "plan_5_part_time" - ] + ], + "entity_name": "person" } }, { @@ -10430,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" } }, { @@ -10508,7 +10627,8 @@ "source_concept": "slc.targeted_support_amount_awarded", "dimension_values": { "student_support_product": "parents_learning_allowance" - } + }, + "entity_name": "person" } }, { @@ -10586,7 +10706,8 @@ "source_concept": "slc.targeted_support_amount_awarded", "dimension_values": { "student_support_product": "adult_dependants_grant" - } + }, + "entity_name": "person" } }, { @@ -10618,7 +10739,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,305 +10749,892 @@ }, "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" } }, { - "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": { "metric_name": "age/10_20", @@ -11687,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", @@ -11711,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", @@ -11735,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", @@ -11759,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", @@ -11783,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", @@ -11807,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", @@ -11831,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", @@ -11855,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/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 6a53e5c5a..acd88b247 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 @@ -921,23 +921,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/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/firm_generation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/firm_generation.py index 8e4da91cb..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 @@ -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.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 +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/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/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/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/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/src/microcosm/build/us_runtime/source_coverage.py b/packages/microcosm-build/src/microcosm/build/us_runtime/source_coverage.py index 76214ad50..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 @@ -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.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 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..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 @@ -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,19 @@ 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.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 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 every row's ``source.extraction_method`` and the artifact manifest's @@ -39,6 +52,13 @@ import pandas as pd +from microcosm.build.chronicle_epoch import ( + ACCEPTED_CONSUMER_ARTIFACT_SCHEMA_VERSIONS, + LEDGER_CONSUMER_FACT_SCHEMA_VERSION, + MICROCOSM_CONSUMER_ARTIFACT_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 +70,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 +159,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 = 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 — +#: 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 +613,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 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.") + 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 +662,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/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" diff --git a/packages/microcosm-build/tests/conftest.py b/packages/microcosm-build/tests/conftest.py index e3c4e53ae..3f874491a 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 @@ -106,6 +108,114 @@ def ods() -> ODSBuilder: 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"]) + + @pytest.fixture(scope="session") def _session_primary_qrf_worker_identities(): """Attest the real installed worker once; retain pristine identities by key. 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 54781fa5c..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"} @@ -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_chronicle_epoch.py b/packages/microcosm-build/tests/test_chronicle_epoch.py new file mode 100644 index 000000000..53d5516bb --- /dev/null +++ b/packages/microcosm-build/tests/test_chronicle_epoch.py @@ -0,0 +1,701 @@ +"""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. + +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 + +import hashlib +import json +import re +from pathlib import Path + +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, + CHRONICLE_FACT_KEY_DOMAINS, + CHRONICLE_NAMESPACES, + DECLARED_IDENTITIES, + DECLARED_IDENTITY_EPOCHS, + EPOCHS, + FACT_KEY_FIELDS, + 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, + 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" + +#: 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 = { + "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. + + 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_FACT_KEY_DOMAINS["source_cell"] + ":cell" + ] + row.update(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() + 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_observed_domain_map_covers_the_captured_feed() -> None: + """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) + } + + assert observed + assert observed <= set(LEDGER_FACT_KEY_DOMAINS.values()), sorted( + observed - set(LEDGER_FACT_KEY_DOMAINS.values()) + ) + + +@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. + + 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. + """ + 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", + "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: + """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_FACT_KEY_DOMAINS["source_cell"] + ":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_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 == { + 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, + } + 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 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"), _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 +) -> 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_every_accepted_id(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 + 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( + "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(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] + + +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) + ) + + 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, 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_FACT_KEY_DOMAINS["source_row"] + ":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. + """ + rows = _captured_feed_rows() + 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,) 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 cd46e2cad..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 ): @@ -2939,3 +3085,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.v2: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_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/packages/microcosm-build/tests/test_logbook_env.py b/packages/microcosm-build/tests/test_logbook_env.py new file mode 100644 index 000000000..5357f2591 --- /dev/null +++ b/packages/microcosm-build/tests/test_logbook_env.py @@ -0,0 +1,205 @@ +"""The LOGBOOK_* / POPULACE_LEDGER_* environment dual-read window. + +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 + +import warnings + +import pytest + +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, + 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, +) + +PAIRS = ( + (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), +) + + +@pytest.fixture(autouse=True) +def _clean_env(monkeypatch): + for preferred, legacy in PAIRS: + monkeypatch.delenv(preferred, raising=False) + monkeypatch.delenv(legacy, raising=False) + reset_logbook_env_deprecation_warnings() + yield + 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, "logbook-value") + monkeypatch.setenv(legacy, "ledger-value") + + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + assert logbook_env(preferred) == "logbook-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 logbook_env(preferred) == "ledger-value" + + message = str(record[0].message) + assert legacy in message + assert preferred in message + assert "microcosm#632" 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 logbook_env(LOGBOOK_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") + logbook_env(LOGBOOK_URL_ENV) + logbook_env(LOGBOOK_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 logbook_env(LOGBOOK_URL_ENV) is None + assert logbook_env(LOGBOOK_URL_ENV, "fallback") == "fallback" + + monkeypatch.setenv(LOGBOOK_URL_ENV, "") + monkeypatch.setenv(LEGACY_URL_ENV, "https://ledger.example") + with pytest.warns(DeprecationWarning): + 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 ( + 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 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 logbook_env_names(LOGBOOK_URL_ENV) == (LOGBOOK_URL_ENV, LEGACY_URL_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 ( + LOGBOOK_URL_ENV, + LOGBOOK_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(LOGBOOK_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(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://logbook.example", + "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_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 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 ff0313fd5..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." @@ -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_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_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"] 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_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_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..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, @@ -228,19 +229,30 @@ 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"}, "assertion": "observation", + "entity": {"name": selector.get("entity_name", reference.entity)}, "dimensions": dimensions, "geography": { "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 +354,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 +879,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..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"]) @@ -522,7 +566,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_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..732e20968 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,88 @@ 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_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") + + 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 +163,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..d52f201b9 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 @@ -45,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, @@ -56,6 +57,7 @@ def test_uk_contract_loads_and_selects_build_year_rates() -> None: 0.1252, 0.384, 0.0385, + 0.593, ] @@ -65,7 +67,20 @@ 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 + 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 +103,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 +133,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 d9ee9d216..2e46a2d5b 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -7,7 +7,12 @@ from __future__ import annotations +import hashlib import json +import os +import subprocess +import sys +from dataclasses import replace from importlib import resources as importlib_resources from pathlib import Path @@ -16,6 +21,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,16 +30,18 @@ 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, ) -ACTIVE_REFERENCE_COUNT = 408 +ACTIVE_REFERENCE_COUNT = 415 UK_DATA_REPO = "policyengine-" + "uk-data" FIXTURE_REFERENCE_NAMES = { @@ -45,12 +53,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 +70,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 +181,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", @@ -102,8 +213,10 @@ 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", ] assert len(names) == len(set(names)) @@ -128,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 ( @@ -141,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") @@ -176,12 +364,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: @@ -280,10 +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, - "multi_fact": 1, + "active": 415, "no_fact_at_or_before_period": 7, - "signed_excluded": 1, + "signed_excluded": 8, } assert membership["genuine_sum_residue"] assert membership["uprating_holds"] @@ -341,31 +560,27 @@ 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 " "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 +593,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 +655,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" + + 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_uc_benefit_unit_targets() -> None: +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 +748,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 +770,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/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-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_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() diff --git a/packages/microcosm-build/tests/test_us_trade_facts.py b/packages/microcosm-build/tests/test_us_trade_facts.py index f20d443f6..e7b233669 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_FACT_SCHEMA_VERSION, + MICROCOSM_CONSUMER_ARTIFACT_SCHEMA_VERSION, +) from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.ledger_targets import ( LedgerTargetReference, @@ -813,3 +818,71 @@ 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"] == 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( + 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", + ) 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, 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-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-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/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..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"}],"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":"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/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/fit_uk_childcare_takeup.py b/tools/fit_uk_childcare_takeup.py index 1519faa30..219e02a19 100644 --- a/tools/fit_uk_childcare_takeup.py +++ b/tools/fit_uk_childcare_takeup.py @@ -1,169 +1,470 @@ -"""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 = 3 +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 + """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") + 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, *, - seed: int = 42, - maxiter: int = 5, + ledger_facts: Path | None = None, + ledger_facts_sha256: str | None = None, + target_period: int = 2024, + vintage_overrides: Mapping[str, int] | None = None, + 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, + 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)) + 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(), + "objective": "expected_count", + "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": _engine_version(), "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}, + "ceilings_at_rate_1": _ceilings(input_h5, target_period, targets), } -def main() -> None: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--enhanced-frs-h5", type=Path, required=True) - parser.add_argument("--output", type=Path, required=True) - parser.add_argument("--seed", type=int, default=42) - parser.add_argument("--maxiter", type=int, default=5) - args = parser.parse_args() - receipt = fit_childcare_takeup( - args.enhanced_frs_h5, seed=args.seed, maxiter=args.maxiter +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: + """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) ) - args.output.write_text(json.dumps(receipt, indent=2, sort_keys=True) + "\n") + 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 _policyengine_runner( - input_h5: Path, params: np.ndarray, seed: int -) -> tuple[dict[str, float], dict[str, float]]: +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_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, + 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", + target_period, + np.full( + person_count, + contract.rate("tax_free_childcare_spend_routed_share", target_period), + ), ) - 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, + 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": rows("tax_free_childcare"), + "hmrc.tfc.children_with_used_accounts": rows( + "is_child_receiving_tax_free_childcare" + ), + "dfe.funded_childcare.working_parent_children_2_to_4": rows( + "is_child_receiving_extended_childcare", extended_receiving & (age >= 2) + ), + "dfe.funded_childcare.early_learning_2_year_olds": rows( + "is_child_receiving_targeted_childcare" + ), + "dfe.funded_childcare.universal_only_children": rows( + "is_child_receiving_universal_childcare" + ), } - return spending, caseload + + +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: + 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=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-6, + help=( + "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() + receipt = fit_childcare_takeup( + 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 _sha256(path: Path) -> str: 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..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,8 +107,9 @@ 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=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 +132,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) @@ -164,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(): @@ -206,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"), ) @@ -238,7 +246,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( @@ -251,9 +262,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)} 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": + 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 @@ -263,9 +276,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 +288,36 @@ 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"]) + 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 = { + str(entry["target_id"]): str(entry["rationale"]) + for entry in resource["exclusions"] + } + return { + target_id: rationale + for target_id, rationale in exclusions.items() + if target_id in target_ids + } + + +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 } - 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 +455,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/logbook.py b/tools/logbook.py index 78aaee9d4..852ca3946 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 ``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 +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. """ @@ -17,7 +20,6 @@ import argparse import json -import os import re import sys from pathlib import Path @@ -36,6 +38,16 @@ render_markdown, urlopen, ) +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, + describe_logbook_env, + logbook_env, +) ROOT = Path(__file__).resolve().parents[1] #: Archives live at ``logbook//.jsonl`` — one hash chain per @@ -46,8 +58,12 @@ #: 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 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 # Mirror of logbook.chain_scope() in # supabase/migrations/20260818000000_logbook_chain_scopes.sql. The legacy US @@ -102,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." ), ) @@ -243,13 +265,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 = 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 POPULACE_LEDGER_URL, " - f"{REMOTE_EXPORT_KEY_ENV}, and {REMOTE_API_KEY_ENV}" + "remote export requires " + + describe_logbook_env( + LOGBOOK_URL_ENV, LOGBOOK_EXPORT_KEY_ENV, LOGBOOK_API_KEY_ENV + ) ) rows: list[LogbookRow] = [] @@ -288,11 +312,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( 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. 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]]