From 85914e53f6d65f4b8191a75450eaebde5cdff7a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Wed, 2 Sep 2026 21:18:57 +0200 Subject: [PATCH 01/26] Sign the #762 binding adjudications and the two micro-LA support exclusions (PR B) Maria's rulings of 2026-09-02: accept the SPI-frame proxy, the unbanded-only HMRC surface, the ONS total-population universe for age structure, and the VOA household proxy for council-tax bands; replace the UC household-grain basis with benefit-unit grain; re-word the census disclosure-control record to cover the local-authority leg the ladder binds; and exclude the Isles of Scilly and the City of London from the local-authority support floor on the measured K=4 and K=10 shortfalls. Windows to 2026-12-02. Co-Authored-By: Claude Fable 5.1 --- .../uk/local_area_support_exclusions.json | 17 ++++++++- .../build/uk/local_binding_adjudications.json | 37 ++++++++++++++++++- .../tests/test_uk_battery_bindings.py | 31 +++++++++++----- .../tests/test_uk_local_rowwise.py | 9 ++++- .../tests/test_uk_rowwise_candidate.py | 16 +++++++- 5 files changed, 96 insertions(+), 14 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json index 2cc9d22cb..eb8028e69 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json @@ -1,5 +1,20 @@ { "schema_version": 2, "description": "Reviewed UK local-area support-floor exclusions. The register ships empty in PR A; each future entry must carry measured shortfalls and an in-force adjudication.", - "exclusions": {} + "exclusions": { + "local_authority/E06000053": { + "reason": "Reviewed exclusion of the local-authority support floor for Isles of Scilly (E06000053): population-proportional ladder assignment gives the area 7 positive-weight rows at the ruled K=4 (17 at K=10; microcosm#761 receipts section R1, identical on spine-i and spine-k), so the 50-row / ESS-50 / 50-source floor is unreachable by clone count. The area stays in the solve with its measured support and is flagged support_below_floor in area_support_summary.csv; consumers must treat its estimates as unsupported. Re-measured on every candidate; a passing area retires this entry (a stale exclusion fails the gate).", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A4, ruling 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" + }, + "local_authority/E09000001": { + "reason": "Reviewed exclusion of the local-authority support floor for City of London (E09000001): population-proportional ladder assignment gives the area 14 positive-weight rows at the ruled K=4 (49 at K=10; microcosm#761 receipts section R1, identical on spine-i and spine-k), so the 50-row / ESS-50 / 50-source floor is unreachable by clone count. The area stays in the solve with its measured support and is flagged support_below_floor in area_support_summary.csv; consumers must treat its estimates as unsupported. Re-measured on every candidate; a passing area retires this entry (a stale exclusion fails the gate).", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A4, ruling 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" + } + } } diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_binding_adjudications.json b/packages/microcosm-build/src/microcosm/build/uk/local_binding_adjudications.json index 703e4f915..e288d012f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_binding_adjudications.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_binding_adjudications.json @@ -3,11 +3,46 @@ "description": "Reviewed adjudications of the UK local binding fences (uk_local_target_census.json binding_fences). Binding a target family whose fence has no in-force entry here fails in the rowwise doctrine solve before any solve runs. Keys are fence ids; the reason states the ruling (accept the stated basis, or replace it with the named alternative) and cites the evidence.", "exclusions": { "census_disclosure_control_noise": { - "reason": "Accept the stated basis: constituency household counts bind to the published disclosure-controlled census values as-is — ONS/NRS cell-key perturbation and NISRA flexible-table-builder noise is documented, and the measured cross-grain deltas at review (constituency sums vs national totals: E&W +105, Scotland -554, NI +3) are accepted. When a national same-concept control is bound in the same solve, the standing cross-grain rule rescales the constituency values to it before calibration; country is the winning grain. The rule and bridges are declared in microcosm.build.uk_runtime.ledger_targets and implemented by microcosm.build.cross_grain; rationale and evidence are recorded in docs/uk-local-cross-grain-reconciliation-802.md. Fence evidence: uk_local_target_census.json#/binding_fences/census_disclosure_control_noise.", + "reason": "Accept the stated basis: constituency and local-authority household counts bind to the published disclosure-controlled census values as-is — ONS/NRS cell-key perturbation and NISRA flexible-table-builder noise is documented, and the measured cross-grain deltas at review (constituency sums vs national totals: E&W +105, Scotland -554, NI +3) are accepted. When a national same-concept control is bound in the same solve, the standing cross-grain rule rescales the constituency and local-authority values to it before calibration; country is the winning grain. The rule and bridges are declared in microcosm.build.uk_runtime.ledger_targets and implemented by microcosm.build.cross_grain; rationale and evidence are recorded in docs/uk-local-cross-grain-reconciliation-802.md. Fence evidence: uk_local_target_census.json#/binding_fences/census_disclosure_control_noise. Re-worded 2026-09-02 (microcosm#762) to cover the local-authority leg the first calibrated rowwise candidate binds from the same ladder; window unchanged.", "approved_by": "juaristi22", "adjudication": "microcosm#802", "approved_on": "2026-08-31", "expires_on": "2026-11-30" + }, + "hmrc_spi_frame_model_proxy": { + "reason": "Accept the stated basis: the constituency and local-authority HMRC families bind on the modeled income_tax > 0 frame, the same SPI-frame proxy the national hmrc.* surface binds through (uk_population_targets.json bindings), so both grains share one frame and the standing cross-grain rule can reconcile them. The proxy's known biases (zero-liability taxpayers excluded; modeled liabilities the SPI would not observe included) are accepted for the first candidate and re-measured per family in the microcosm#762 receipts. Fence evidence: uk_local_target_census.json#/binding_fences/hmrc_spi_frame_model_proxy.", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A1, rulings 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" + }, + "full_frs_tei_band_unavailable": { + "reason": "Accept the stated basis: the hmrc_income_by_area family binds only the unbanded per-area employment and self-employment amount/count references (count_x_mean over the SPI by-area record sets); the published by-area SPI facts carry no total-income band dimension, so no Total-Income-banded local reference exists or may be minted while the 208 national banded facts remain fenced exclusions of the HMRC replay classification. Fence evidence: uk_local_target_census.json#/binding_fences/full_frs_tei_band_unavailable; membership: local_target_reference_membership.json (no banded target ids).", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A1, rulings 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" + }, + "population_universe_private_households": { + "reason": "Accept the stated basis: age-structure targets at constituency and local-authority grain bind the ONS mid-2024 total-usual-resident universe as published, the same universe the national ons.population.age_*_by_region controls bind, so any cross-grain reconciliation happens on one universe. The private-household vs communal-establishment gap (about 1.8% of population in Census 2021, concentrated in the 20-29 and 80+ bands) is recorded as the expected direction of residual error and is not rescaled locally; a declared communal-establishment adjustment would be a chronicle fact request, never a runtime correction. Fence evidence: uk_local_target_census.json#/binding_fences/population_universe_private_households.", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A1, rulings 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" + }, + "uc_unit_vs_household_grain": { + "reason": "Replace the stated basis with the named alternative: the uc_households family binds at benefit-unit grain. uc_households per area counts UC benefit units mapped to their households (the DWP claim-household definition) and the four children bands classify each UC benefit unit by its own num_children (benunit-to-household sum), matching the national dwp.uc.households* re-bind of PR #813; the household-children basis is retired. Fence evidence: uk_local_target_census.json#/binding_fences/uc_unit_vs_household_grain; runtime: microcosm.build.uk_runtime.local_targets.compute_household_metrics.", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A1, rulings 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" + }, + "voa_dwellings_vs_household_frame": { + "reason": "Accept the household proxy: VOA chargeable-dwelling counts by band bind as the local-authority household count per band, with the dwelling-vs-occupied-household gap (empty properties and second homes, about 2-3% nationally and higher in coastal and rural authorities) recorded as the expected residual and reconciled to the national council-tax controls by the standing cross-grain rule where a country leg is bound. Fence evidence: uk_local_target_census.json#/binding_fences/voa_dwellings_vs_household_frame; lineage: uk-data#371 and the microcosm#147 A3 review on PR #831.", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A1, rulings 2026-09-02)", + "approved_on": "2026-09-02", + "expires_on": "2026-12-02" } } } diff --git a/packages/microcosm-build/tests/test_uk_battery_bindings.py b/packages/microcosm-build/tests/test_uk_battery_bindings.py index ff0313fd5..3460ec7ad 100644 --- a/packages/microcosm-build/tests/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/test_uk_battery_bindings.py @@ -57,7 +57,7 @@ #: The shared exclusion-expiry clock, fixed inside the committed register's #: validity window (approved 2026-08-10, expires 2027-02-10) so the suite #: never drifts across an expiry boundary. -CLOCK = date(2026, 9, 1) +CLOCK = date(2026, 9, 15) VALIDATE_REFERENCE = ( "microcosm.build.uk_runtime.weighted_integrity." @@ -1040,14 +1040,23 @@ def test_area_support_binding_resolves_register_and_rejects_expired_entry( entry = {entry.id: entry for entry in uk_gates.gates}["uk_local_area_support"] binding = UK_GATE_REGISTRY["area_support"] + # The committed register carries the two micro local authorities Maria + # excluded on the measured K=4 shortfalls (microcosm#762 A4); the + # synthetic roster carries them below the floor so the committed entries + # apply instead of reading as unknown. support = pd.DataFrame( { - "geography_level": ["constituency", "local_authority"], - "area_code": ["E14000001", "E06000001"], - "assigned_households": [50, 50], - "nonzero_households": [50, 50], - "effective_sample_size": [50.0, 50.0], - "nonzero_source_households": [50, 50], + "geography_level": [ + "constituency", + "local_authority", + "local_authority", + "local_authority", + ], + "area_code": ["E14000001", "E06000001", "E06000053", "E09000001"], + "assigned_households": [50, 50, 7, 14], + "nonzero_households": [50, 50, 7, 14], + "effective_sample_size": [50.0, 50.0, 6.8, 12.1], + "nonzero_source_households": [50, 50, 7, 14], } ) monkeypatch.setattr( @@ -1055,7 +1064,7 @@ def test_area_support_binding_resolves_register_and_rejects_expired_entry( "_local_area_roster", lambda _resource, _levels: { "constituency": ("E14000001",), - "local_authority": ("E06000001",), + "local_authority": ("E06000001", "E06000053", "E09000001"), }, ) context = EvidenceContext( @@ -1067,7 +1076,11 @@ def test_area_support_binding_resolves_register_and_rejects_expired_entry( committed = binding.evaluate(context, entry.parameters) assert committed.passed is True - assert committed.details["reviewed_exclusions"] == {} + assert set(committed.details["reviewed_exclusions"]) == { + "local_authority/E06000053", + "local_authority/E09000001", + } + assert committed.details["excluded_area_count"] == 2 monkeypatch.setattr( battery_bindings, diff --git a/packages/microcosm-build/tests/test_uk_local_rowwise.py b/packages/microcosm-build/tests/test_uk_local_rowwise.py index 583932e08..592c60d09 100644 --- a/packages/microcosm-build/tests/test_uk_local_rowwise.py +++ b/packages/microcosm-build/tests/test_uk_local_rowwise.py @@ -482,7 +482,13 @@ def test_rowwise_doctrine_solve_uses_base_weights_directly() -> None: assert ( receipt["register_resource"] == UK_LOCAL_BINDING_ADJUDICATION_REGISTER_RESOURCE ) - assert receipt["dormant"] == [] + assert receipt["dormant"] == [ + "full_frs_tei_band_unavailable", + "hmrc_spi_frame_model_proxy", + "population_universe_private_households", + "uc_unit_vs_household_grain", + "voa_dwellings_vs_household_frame", + ] stood_on = receipt["stood_on"]["census_households/constituency"] seed = stood_on["census_disclosure_control_noise"] assert seed["approved_by"] == "juaristi22" @@ -679,6 +685,7 @@ def test_rowwise_binding_refuses_unadjudicated_committed_fence() -> None: require_adjudicated_uk_local_binding( ["uc_households/constituency"], problem.target_frame, + register={}, ) diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index ecba443d0..41e4cd1e8 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -388,7 +388,13 @@ def test_candidate_build_writes_calibrated_h5_and_evidence( assert seed["adjudication"] == "microcosm#802" assert seed["approved_on"] == "2026-08-31" assert seed["expires_on"] == "2026-11-30" - assert adjudications["dormant"] == [] + assert adjudications["dormant"] == [ + "full_frs_tei_band_unavailable", + "hmrc_spi_frame_model_proxy", + "population_universe_private_households", + "uc_unit_vs_household_grain", + "voa_dwellings_vs_household_frame", + ] cross_grain = manifest["cross_grain"] assert cross_grain["bound_national_targets"] == [] assert cross_grain["bound_higher_targets"] == [] @@ -556,7 +562,13 @@ def forbidden(*_args, **_kwargs): "census_disclosure_control_noise" in adjudications["stood_on"]["census_households/constituency"] ) - assert adjudications["dormant"] == [] + assert adjudications["dormant"] == [ + "full_frs_tei_band_unavailable", + "hmrc_spi_frame_model_proxy", + "population_universe_private_households", + "uc_unit_vs_household_grain", + "voa_dwellings_vs_household_frame", + ] cross_grain = plan["cross_grain"] assert cross_grain["bound_national_targets"] == [] assert cross_grain["bound_higher_targets"] == [] From bcd7b9d01026dee893dec576364330abc256e797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Wed, 2 Sep 2026 22:32:50 +0200 Subject: [PATCH 02/26] Sign the Welsh council-tax deferral: no Wales country control in the feed (#762 A13, PR B) The sixth licensed dry-run reached the cross-grain reconciliation and the engine refused the council-tax band groups: England and Scotland carry country-grain stock-by-band controls, Wales carries none in the pinned feed, so the 174 active Welsh local-authority cells form an unparented leg. Per Maria's A13 ruling those cells are signed-deferred (council_tax_wales_country_control_absent) until a Wales control exists; no Welsh control is minted from the local cells. Deferring an available fact needs an explicit opt-in on the area deferral (defer_if_compiles), scoped to this adjudication; ordinary missing-cell deferrals still go stale when their cell compiles. Surface 19,618 -> 19,444 active; council tax 2,541 -> 2,367; pins moved accordingly. Co-Authored-By: Claude Fable 5.1 --- .../build/target_reference_authoring.py | 24 +- .../uk/local_target_reference_membership.json | 1665 ++++---- .../build/uk/local_target_references.json | 3480 ----------------- .../build/uk/uk_local_target_census.json | 6 +- .../build/uk_runtime/local_target_census.py | 32 +- .../tests/test_target_reference_authoring.py | 42 +- .../tests/test_uk_battery_bindings.py | 6 +- .../tests/test_uk_council_tax_targets.py | 43 +- .../tests/test_uk_local_target_census.py | 6 +- tools/generate_uk_local_target_references.py | 39 +- tools/score_uk_local_candidate.py | 2 +- 11 files changed, 928 insertions(+), 4417 deletions(-) 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..1eb4309e6 100644 --- a/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py +++ b/packages/microcosm-build/src/microcosm/build/target_reference_authoring.py @@ -62,13 +62,19 @@ class TargetReferenceAuthoringConfig: @dataclass(frozen=True) class AreaSignedDeferral: - """Signed area-level compile deferral for one contract target.""" + """Signed area-level compile deferral for one contract target. + + Missing cells are the default use. ``defer_if_compiles`` is an explicit + opt-in for a separate adjudication that prevents an available fact from + binding; ordinary deferrals remain stale once their cell compiles. + """ target_id: str geography_level: str reason_id: str rationale: str area_ids: tuple[str, ...] + defer_if_compiles: bool = False def __post_init__(self) -> None: if not self.target_id: @@ -330,12 +336,25 @@ def author_area_target_references( entry["signed_reason_id"] = signed_deferral.reason_id entry["signed_rationale"] = signed_deferral.rationale else: - if signed_deferral is not None: + if ( + signed_deferral is not None + and not signed_deferral.defer_if_compiles + ): raise ValueError( "Stale area signed deferral for " f"{target_id!r} at {geography_level!r}/{area_id!r}: " "the candidate now compiles." ) + if signed_deferral is not None: + entry.update( + { + "status": "signed_deferred", + "signed_reason_id": signed_deferral.reason_id, + "signed_rationale": signed_deferral.rationale, + } + ) + candidates.append(entry) + continue spec = registry.specs[0] resolved_period = str(spec.metadata.get("ledger_fact_period", "")) _apply_uprating_hold(row, resolved_period, config.target_period) @@ -406,6 +425,7 @@ def author_area_target_references( "reason_id": deferral.reason_id, "rationale": deferral.rationale, "area_ids": list(deferral.area_ids), + **({"defer_if_compiles": True} if deferral.defer_if_compiles else {}), } for deferral in config.area_signed_deferrals ], 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..b524e94ca 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,12 +3,13 @@ "target_period": 2025, "candidate_count": 21519, "contract_target_count": 33, - "active_reference_count": 19618, + "active_reference_count": 19444, "status_counts": { - "active": 19618, + "active": 19444, "no_fact_at_or_before_period": 314, "no_fact_for_area": 1586, - "signed_deferral_compile_error": 1 + "signed_deferral_compile_error": 1, + "signed_deferred": 174 }, "areas_by_geography_level": { "constituency": [ @@ -2392,6 +2393,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_a", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", @@ -2451,6 +2483,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_b", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", @@ -2510,6 +2573,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_c", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", @@ -2569,6 +2663,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_d", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", @@ -2628,6 +2753,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_e", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", @@ -2687,6 +2843,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_f", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", @@ -2746,6 +2933,37 @@ "N09000011" ] }, + { + "target_id": "voa.council_tax_stock.by_area.band_g", + "geography_level": "local_authority", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", + "area_ids": [ + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", @@ -2806,22 +3024,43 @@ ] }, { - "target_id": "voa.council_tax_stock.by_area.band_a", + "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", - "reason_id": "council_tax_city_of_london_band_a_suppressed", - "rationale": "The pinned 2025 VOA local-authority record set publishes bands B-H and all-properties for E09000001 but suppresses its Band A cell; 317/318 England/Wales Band A cells compile.", + "reason_id": "council_tax_wales_country_control_absent", + "rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024.", "area_ids": [ - "E09000001" - ] + "W06000001", + "W06000002", + "W06000003", + "W06000004", + "W06000005", + "W06000006", + "W06000008", + "W06000009", + "W06000010", + "W06000011", + "W06000012", + "W06000013", + "W06000014", + "W06000015", + "W06000016", + "W06000018", + "W06000019", + "W06000020", + "W06000021", + "W06000022", + "W06000023", + "W06000024" + ], + "defer_if_compiles": true }, { - "target_id": "voa.council_tax_stock.by_area.band_h", + "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", - "reason_id": "council_tax_wales_band_h_absent", - "rationale": "The pinned 2025 VOA local-authority record set publishes no Band H cell for W06000019 or W06000024; 316/318 England/Wales Band H cells compile.", + "reason_id": "council_tax_city_of_london_band_a_suppressed", + "rationale": "The pinned 2025 VOA local-authority record set publishes bands B-H and all-properties for E09000001 but suppresses its Band A cell; 317/318 England/Wales Band A cells compile.", "area_ids": [ - "W06000019", - "W06000024" + "E09000001" ] }, { @@ -385237,286 +385476,242 @@ "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4950.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_30e21f2a411e38eca3b86d60" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000002", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9310.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3ab1a0efc9feac32509f559a" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000003", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5460.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d61b61780164db08eaccbcd3" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000004", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4160.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_565e3d25b955fb2d949bd68f" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000005", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4520.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_552c54913d7b6bf805c079ce" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000006", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4510.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1c8cbb5a67dbb7177f9b4aae" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000008", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1760.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a050b711ccab14bd5a46628f" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000009", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6710.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6c257d681db1401e8f1b86e7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000010", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9330.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5666825038936f4c0e6dd5f8" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000011", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 17690.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_608fa81e49e7c233e75e4796" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000012", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13770.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f0b618bb880e832a395a5b7c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000013", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10600.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4dc65ab47c6bb64ebd4476c4" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000014", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1520.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2578b44ab387814437f6caf6" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000015", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5320.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d912053f1ff45113a09ca6d6" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000016", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 47070.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5075c79069f283087416773b" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000018", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 15560.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_344b6ef03f5ef6a383964a92" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000019", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 19180.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4a3d39816b4f3e6bd45a7c54" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000020", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6300.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_825e1c75b7f9cf1842267963" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000021", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 520.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_803cde56ed214889693dfb95" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000022", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6910.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_05c1799baff35861dbcfa6af" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000023", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6080.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8800cca65cdb0ef2a0dfdb84" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_a@W06000024", "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 14150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a5d233e11bc5ba25c01fa338" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -389898,286 +390093,242 @@ "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6930.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_539425fde93562617789e084" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000002", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 15790.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a9abf79e22a52d8da8e6df19" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000003", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8340.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9ecfcd28ccf5abb8bb0eab91" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000004", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7420.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_34c1a90b4bf52733aba6c3d7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000005", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9650.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b00d87265eae413f1fb7fe85" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000006", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 12770.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6722d172f88a7375fb9589e9" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000008", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4980.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1babc6b04b47e651dffba370" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000009", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9450.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ad3c44074fd3723fdf841998" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000010", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 24530.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5bf28ded080ab26e4614dbe5" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000011", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 28640.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_930d6e12a50a1124940fc4c0" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000012", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 27490.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_957e939426a449b3a48a1a99" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000013", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 15370.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_42478d0301199f6bf436e152" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000014", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6680.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f2b2eebfae28264db0585733" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000015", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20430.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6f2d4fcfeb71d47ea739478c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000016", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 25480.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6e8c826b2a836603bbc22853" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000018", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 26890.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_98b727324b464c9946fd95a7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000019", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a3be12dec7ca868f30292793" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000020", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e17031bdc1e9f9250e2203c7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000021", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3460.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0f015ace474412454cee27de" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000022", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 15400.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2929c90a7de737080f0b2399" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000023", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9440.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7673b6968f864d6c90392079" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_b@W06000024", "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6680.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_310da6cb995fb572747416d5" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -394559,286 +394710,242 @@ "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7200.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e627dc8f8f48fdad5a4a7019" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000002", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 12700.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d1d5e826d56a6d0935552951" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000003", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 15610.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_938807fcab1b87c2c0c64e42" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000004", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 14960.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0e1cbdf834edd39e0cf9bdaa" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000005", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20980.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cccf617b8e601dd070ff4d1a" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000006", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 17250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_333a7959d923d65398a93f23" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000008", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7700.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_40d725c1c8d6ec5289940618" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000009", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 14510.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0cb0216e1e3ade42f68f2ef7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000010", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 18890.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_230df87947d658bef3e9cdd3" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000011", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 25010.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ba881383cb02db5e6ec92e15" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000012", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 11720.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f46846e827c57ba60398ddbf" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000013", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 14830.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6f1c0ede950e7c4924327471" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000014", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 14530.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_885ce8159ce851be605d226f" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000015", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 34920.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4bc6de464fe24992cf9c446e" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000016", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 17510.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_482389254f639ef973b0aadb" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000018", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 18930.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d2434f01ea3787d708ecce8d" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000019", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2720.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b721c2159d4695684125a8bf" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000020", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 12050.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c5065b2939607000f3351bae" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000021", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_334d2ac4a088e2a625836404" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000022", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 18480.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8e095a26b38c4c5e64745ff9" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000023", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13340.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_13651597fafc9228ea02432c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_c@W06000024", "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2270.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_57caf6389eef5ae832a376ff" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -399220,286 +399327,242 @@ "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7380.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d784023aeaf5c3411405713c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000002", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10690.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f867d9ab42137232e217bcbd" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000003", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 11970.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_08181347077516e9616dd5e9" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000004", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8050.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8671346edc72cf534de8058f" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000005", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13400.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_08c5c85a076a3b8d3181f120" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000006", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10350.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e802d83dac62aa5e39ec650c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000008", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7540.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d53427da3c191c165b5743bb" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000009", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 11490.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_fa2fb6162055cacfa9e088c5" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000010", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 14660.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8af2daecc212106e6c5ff74e" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000011", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 17330.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_826f90f6b5e17f553cae4034" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000012", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7430.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5983969418ff95824de6833d" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000013", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 11050.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b3ed6fcb207b172a2ef4aa08" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000014", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 11910.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_37f9a60caed1e64a8a21e849" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000015", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 37370.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d979e03ed40fb4955782bed9" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000016", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9650.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9c17b72fa74d74f0c8b0a7af" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000018", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9540.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_019556cc2d5ed69a58455de7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000019", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1800.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e0be05321ebf5ee29c784460" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000020", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4350.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0c9773f02d3e35470ab53224" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000021", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9460.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b13c7d0b3d4abb932c9ec961" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000022", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13000.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c8e9e77ac3edb89184ce1bed" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000023", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10630.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_dc4d312d8c237d5d5f235fd8" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_d@W06000024", "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2210.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_472d7b342be3119ef610a9c2" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -403881,286 +403944,242 @@ "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5530.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a02329605c763f78112deba3" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000002", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8280.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4e6f961695e358bdd03d7125" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000003", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9300.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_315cf4c92bdc8543ca7e25bc" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000004", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5640.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_350df620afcd86aff540a1bc" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000005", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 11150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_47c959c9dd8c4cc922d62ab9" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000006", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8260.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ea282619e243fdcd1f38db3d" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000008", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_25bbd04f142084e853dd08ba" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000009", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 12480.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_48d5888ae3f3abc0f2df5cb3" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000010", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13370.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0a753d2c5efd744e35953122" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000011", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 13190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d51f8d5fa8f0cf99453deb6e" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000012", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4580.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4ccee1072820acc910f2230d" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000013", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8020.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_065c1eca0d2000897101eec7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000014", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10790.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6c5a3335e594ed82de7febee" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000015", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 31540.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e4b2bb234709f5e9f4666f8c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000016", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7130.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7ff914fa2fcd11e54f245a3e" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000018", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6830.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9fbccacf24dee8617cb1431c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000019", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 890.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_356c4e5cb20530dc6a111010" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000020", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4330.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a1a65d2184c3263173f0b12c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000021", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7650.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_80a3d7bbca442b6a1b49f708" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000022", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8550.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b0d5be50411fd5364ce5e4b6" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000023", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 12650.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5380c49d9a66ff7da059615d" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_e@W06000024", "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1560.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_dcfbadb7a15773be20ccd3a5" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -408542,286 +408561,242 @@ "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2770.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e5f7827747e2645382559a44" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000002", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4030.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d49db7ddd9d661170c4ed6b1" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000003", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9bd600326fba1a60385b5741" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000004", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3900.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a0a92336bb6796b840026ee7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000005", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7830.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2d90d6174e403eef68770ad8" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000006", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5180.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_fafb499399c540115dfa84e7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000008", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3870.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_688ca065813cb542c6a43a0b" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000009", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6050.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_235704a6b428d1a29424b344" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000010", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6660.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_21530829e46e0be66de70140" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000011", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8170.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3ea6d4f8ed654d8dd86d4413" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000012", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1520.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4be8b9806a570e0b14558f79" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000013", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4480.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c8e5095d15d8184bc4c0d333" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000014", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 7730.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_378915f65029d2d301951092" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000015", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 22240.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9541838ad6a12f4ae7037ff4" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000016", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3510.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1fd089f7af9cb80e8a288190" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000018", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2430.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_db08ed682d43ee4451e5dbcf" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000019", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 350.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d11416557e2903f7f8304e91" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000020", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2410.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1f0f541243f548bd1872bb76" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000021", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 8080.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_64a4a6404b554dad62cc4525" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000022", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6090.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e72cec6cbe093c80913cac72" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000023", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9670.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a6421a69ad2ade26b164215d" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_f@W06000024", "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 580.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_716e27136e8fa10bb1fccf25" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -413203,286 +413178,242 @@ "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1080.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7e8cd0ed1aae3303e1ffb1bf" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000002", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1270.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a3bfbc95051f47b949e916ad" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000003", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1940.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3f223b21735adc0537da7b56" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000004", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2050.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_efff46c975cc37c8b70be060" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000005", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3230.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_84dde10db6635f6c3eb9ddf0" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000006", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2540.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_45c526f056429563f1009873" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000008", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 970.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f9678024910325610c837a30" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000009", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_91c58ca995dfc01828253117" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000010", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b3dac6153ebac79a5f6f74e2" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000011", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3880.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e7993f95e26096e6158ab051" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000012", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 530.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9081eb2c93a1da587db54235" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000013", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1520.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_de208029e162ce9a2a0bffcf" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000014", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5900.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ef624530a37ef6bc7e92715e" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000015", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10610.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_45a42e45282f69f2bf68c8e7" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000016", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_971ad2fc6ad8a6d7b17c52a9" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000018", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 840.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_75507c9b7d590fcdfbe2b17c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000019", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1cd3f356f2900b53250d5ee1" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000020", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 690.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_892d9433f30f018b88a94902" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000021", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 5500.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ae0253dc8a859d75fb725745" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000022", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2720.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b4a71efdd9899db95f477b8f" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000023", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4160.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4e22d1d44d0eb003f30d4d5c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_g@W06000024", "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "W06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 160.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_35c6584474426509792bc940" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } @@ -417864,208 +417795,176 @@ "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 170.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0c627cc49d38b8270970c788" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000002", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 210.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6f341b2fa579f5e01fdfc332" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000003", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 430.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_be64f02da87973949d060f77" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000004", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 320.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b9c01b01759599735a36bd78" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000005", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 600.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9d9d3b7ced47e28f038996d0" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000006", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 720.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_43dff2e96c915d21fe71b0f2" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000008", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6e76efb89067d894ac8c7ad8" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000009", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 340.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_66a0439381072102cc77bc72" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000010", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 300.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_65ff8a79483f8711fd07727a" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000011", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1200.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_89afb75047d2ffd90374f78f" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000012", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d6804422aebe57c204adb92b" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000013", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 300.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5beccc434000d29e7b7fb075" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000014", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2260.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_da1e91f6a2e69b3cd3283170" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000015", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2870.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f9495d6d2bee6f9f05169903" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000016", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f83eeb380a7176ff58cfbf1c" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000018", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 90.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_09775265a55931e58c921fd5" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000019", @@ -418076,60 +417975,52 @@ "matched_fact_count_overall": 0, "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", - "signed_reason_id": "council_tax_wales_band_h_absent", - "signed_rationale": "The pinned 2025 VOA local-authority record set publishes no Band H cell for W06000019 or W06000024; 316/318 England/Wales Band H cells compile." + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000020", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c0222796e86a0adba7ec50cc" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000021", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1790.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7a4402cba76841baba3167b1" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000022", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 560.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7c884ba7d3b812fcadd44273" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000023", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "W06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 570.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_551d970f8b926682f997d2e8" + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." }, { "name": "voa.council_tax_stock.by_area.band_h@W06000024", @@ -418140,8 +418031,8 @@ "matched_fact_count_overall": 0, "matched_fact_count_at_or_before_period": 0, "error": "ledger_reference_compile_status_no_fact_for_area", - "signed_reason_id": "council_tax_wales_band_h_absent", - "signed_rationale": "The pinned 2025 VOA local-authority record set publishes no Band H cell for W06000019 or W06000024; 316/318 England/Wales Band H cells compile." + "signed_reason_id": "council_tax_wales_country_control_absent", + "signed_rationale": "The pinned feed carries no Wales country-level council-tax stock-by-band fact, so the Welsh local-authority leg has no parent control under the standing UK_CROSS_GRAIN_RULE (country > constituency > la; unparented legs fail closed). Bands A-H cannot bind for Wales until a Wales country control is supplied; the Chronicle ask is filed under microcosm#762 / A13. For Band H, this mask subsumes the prior two-cell absence for W06000019 and W06000024." } ] } 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..21e6ef11b 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 @@ -404632,446 +404632,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_a@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_b@E06000001", "ledger_selector": { @@ -410992,446 +410552,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_b@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_c@E06000001", "ledger_selector": { @@ -417352,446 +416472,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_c@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_d@E06000001", "ledger_selector": { @@ -423712,446 +422392,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_d@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_e@E06000001", "ledger_selector": { @@ -430072,446 +428312,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_e@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_f@E06000001", "ledger_selector": { @@ -436432,446 +434232,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_f@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_g@E06000001", "ledger_selector": { @@ -442792,446 +440152,6 @@ "geography_id": "E09000033" } }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000019" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_g@W06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000024" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000024" - } - }, { "name": "voa.council_tax_stock.by_area.band_h@E06000001", "ledger_selector": { @@ -449151,406 +446071,6 @@ "geography_level": "local_authority", "geography_id": "E09000033" } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000001" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000002" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000003" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000004" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000005" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000006" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000008" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000009" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000010" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000011" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000012" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000013" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000014" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000015" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000016" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000018" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000020" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000021" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000022" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@W06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "W06000023" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "W06000023" - } } ] } 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..36687c026 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 @@ -119,7 +119,7 @@ "doctrine": { "acceptance_criteria_to_mechanism": { "binding_requires_review": "require_adjudicated_uk_local_binding refuses a family whose declared fences lack an in-force local_binding_adjudications row.", - "every_target_accounted": "The local target compiler requires a compiled reference or an AreaSignedDeferral for every metric-by-area cell; unsigned and stale deferrals raise.", + "every_target_accounted": "The local target compiler requires a compiled reference or an AreaSignedDeferral for every metric-by-area cell; unsigned and stale missing-data deferrals raise, while a separately adjudicated compilable deferral requires an explicit opt-in.", "intentional_zeros_preserved": "Finite zero facts compile unchanged and are distinguished from missing or unreachable nonzero targets.", "missing_cells_masked_deliberately": "AreaSignedDeferral is the deliberate compile-time mask; the solve accepts only finite rows.", "no_silent_target_fabrication": "The compiler reads only the sha-pinned Ledger feed, and the devolved_housing population-share allocation is a reviewed non-port." @@ -127,7 +127,7 @@ "masked_missing": { "enforcement_point": "Both refusals fire inside the reference compiler, which runs only when the surface is regenerated against the pinned consumer feed (a licensed, untracked input passed explicitly to tools/generate_uk_local_target_references.py). CI verifies the committed compile through the census and membership drift gates; it cannot re-run the compiler, so a feed that later carries new facts is caught at the next regeneration, not continuously.", "incumbent_comparison": "This supersedes uk-data's per-cell NaN mask with a stronger, reviewable compile-time accounting contract.", - "rule": "A missing local target is represented at compile time by an AreaSignedDeferral carrying a signed reason and explicit area ids. Unsigned absence raises, and a deferral becomes stale and raises as soon as the pinned feed can compile that cell.", + "rule": "A local target excluded at compile time is represented by an AreaSignedDeferral carrying a signed reason and explicit area ids. Unsigned absence raises, and a missing-data deferral becomes stale and raises as soon as the pinned feed can compile that cell. A separate adjudication may defer a compilable lower-grain fact only through the explicit defer_if_compiles opt-in.", "solve_semantics": "The solve surface remains dense and finite by design; local_rowwise.py refuses non-finite targets rather than treating NaN as an implicit loss mask." }, "never_fabricate": { @@ -724,7 +724,7 @@ "source_commit": "33ca98a", "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.", + "notes": "The pinned feed record-set spec uk.local_geography.council_tax_stock.by_local_authority.v1 supplies 2,541 locally compilable band cells. After the A13 cross-grain ruling, 2,367 English cells bind: bands B-H cover all 296 English crosswalk authorities and band A covers 295 because E09000001 is suppressed. All 176 Welsh A-H cells are signed deferred because the feed has no Wales country-level stock-by-band parent control; 174 have local facts and the two Band H cells 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 521 excluded cells are signed deferrals. The feed has no comparable 2025 LA net series across the roster, so council_tax/net is not declared.", "product": "Council Tax stock of properties, 2025: local-authority counts by valuation band.", "publisher": "Valuation Office Agency", "source_id": "voa_council_tax_stock_la", 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..09c0e5baf 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 @@ -470,14 +470,17 @@ "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." + "supplies 2,541 locally compilable band cells. After the A13 " + "cross-grain ruling, 2,367 English cells bind: bands B-H cover " + "all 296 English crosswalk authorities and band A covers 295 " + "because E09000001 is suppressed. All 176 Welsh A-H cells are " + "signed deferred because the feed has no Wales country-level " + "stock-by-band parent control; 174 have local facts and the two " + "Band H cells 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 521 excluded cells are signed " + "deferrals. The feed has no comparable 2025 LA net series across " + "the roster, so council_tax/net is not declared." ), }, ) @@ -679,10 +682,12 @@ _DOCTRINE: dict[str, Any] = { "masked_missing": { "rule": ( - "A missing local target is represented at compile time by an " - "AreaSignedDeferral carrying a signed reason and explicit area ids. " - "Unsigned absence raises, and a deferral becomes stale and raises " - "as soon as the pinned feed can compile that cell." + "A local target excluded at compile time is represented by an " + "AreaSignedDeferral carrying a signed reason and explicit area " + "ids. Unsigned absence raises, and a missing-data deferral becomes " + "stale and raises as soon as the pinned feed can compile that " + "cell. A separate adjudication may defer a compilable lower-grain " + "fact only through the explicit defer_if_compiles opt-in." ), "enforcement_point": ( "Both refusals fire inside the reference compiler, which runs only " @@ -731,7 +736,8 @@ "every_target_accounted": ( "The local target compiler requires a compiled reference or an " "AreaSignedDeferral for every metric-by-area cell; unsigned and " - "stale deferrals raise." + "stale missing-data deferrals raise, while a separately " + "adjudicated compilable deferral requires an explicit opt-in." ), "missing_cells_masked_deliberately": ( "AreaSignedDeferral is the deliberate compile-time mask; the solve " diff --git a/packages/microcosm-build/tests/test_target_reference_authoring.py b/packages/microcosm-build/tests/test_target_reference_authoring.py index 9bf4b633b..5376d9c53 100644 --- a/packages/microcosm-build/tests/test_target_reference_authoring.py +++ b/packages/microcosm-build/tests/test_target_reference_authoring.py @@ -208,6 +208,44 @@ def test_author_area_target_references_refuses_stale_signing() -> None: ) +def test_author_area_target_references_records_signed_compilable_deferral() -> None: + contract = _single_age_contract() + facts = [ + _area_fact("ons", "population", 10.0, area_id="A1", fact_key="a1-age-0"), + ] + + authored = author_area_target_references( + contract, + facts, + _area_config( + areas=("A1",), + value_operation_by_target_id={"ons.age.0_10": "sum"}, + area_signed_deferrals=( + AreaSignedDeferral( + target_id="ons.age.0_10", + geography_level="constituency", + reason_id="separate_adjudication", + rationale=( + "The local fact compiles but a separately adjudicated " + "constraint prevents it from binding." + ), + area_ids=("A1",), + defer_if_compiles=True, + ), + ), + ), + ) + + assert authored.references == () + assert authored.status_counts == {"signed_deferred": 1} + candidate = _candidate(authored.membership_report, "ons.age.0_10", "A1") + assert candidate["status"] == "signed_deferred" + assert candidate["signed_reason_id"] == "separate_adjudication" + assert ( + authored.membership_report["signed_deferrals"][0]["defer_if_compiles"] is True + ) + + def test_author_area_target_references_refuses_signed_area_outside_roster() -> None: contract = _single_age_contract() @@ -252,7 +290,8 @@ def test_generate_uk_local_target_references_cli_refuses_incomplete_contract( encoding="utf-8", ) # The council-tax country masks refuse a local-authority roster that does - # not carry the declared 32 Scottish and 11 Northern Irish authorities + # not carry the declared 32 Scottish, 11 Northern Irish, and 22 Welsh + # authorities # (covered by test_council_tax_country_masks_refuse_roster_count_drift). # This test is about the *contract* refusal, so give it a roster those # masks accept and let the missing target id be what fails. @@ -264,6 +303,7 @@ def test_generate_uk_local_target_references_cli_refuses_incomplete_contract( "local_authority": { "area_ids": [f"S{index:08d}" for index in range(32)] + [f"N{index:08d}" for index in range(11)] + + [f"W{index:08d}" for index in range(22)] }, } } diff --git a/packages/microcosm-build/tests/test_uk_battery_bindings.py b/packages/microcosm-build/tests/test_uk_battery_bindings.py index 3460ec7ad..fec146cb9 100644 --- a/packages/microcosm-build/tests/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/test_uk_battery_bindings.py @@ -1000,14 +1000,14 @@ def test_local_default_target_surface_uses_metric_names_and_signed_deferrals( ) assert result.passed is True - assert result.details["candidate_targets"] == 19_618 + assert result.details["candidate_targets"] == 19_444 assert result.details["reference_targets"] == 22_530 - # 1,901 signed area deferrals from the membership file plus the 1,011 + # 2,075 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) == 2_075 + 1_011 households = [ name for name in exclusions if str(name).startswith("households@") ] diff --git a/packages/microcosm-build/tests/test_uk_council_tax_targets.py b/packages/microcosm-build/tests/test_uk_council_tax_targets.py index 456052398..fae6ee623 100644 --- a/packages/microcosm-build/tests/test_uk_council_tax_targets.py +++ b/packages/microcosm-build/tests/test_uk_council_tax_targets.py @@ -29,14 +29,14 @@ def _membership() -> dict: def test_council_tax_band_cells_activate_and_defer_as_measured() -> None: membership = _membership() expected_active = { - "a": 317, - "b": 318, - "c": 318, - "d": 318, - "e": 318, - "f": 318, - "g": 318, - "h": 316, + "a": 295, + "b": 296, + "c": 296, + "d": 296, + "e": 296, + "f": 296, + "g": 296, + "h": 296, } for band, active_count in expected_active.items(): target_id = f"voa.council_tax_stock.by_area.band_{band}" @@ -65,13 +65,27 @@ def test_council_tax_signed_deferrals_pin_exact_gaps() -> None: assert by_reason["council_tax_city_of_london_band_a_suppressed"][0]["area_ids"] == [ "E09000001" ] - assert by_reason["council_tax_wales_band_h_absent"][0]["area_ids"] == [ - "W06000019", - "W06000024", - ] + wales = by_reason["council_tax_wales_country_control_absent"] + expected_wales = tuple( + area_id + for area_id in _crosswalk()["levels"]["local_authority"]["area_ids"] + if area_id.startswith("W") + ) + assert len(wales) == 8 + assert {row["target_id"] for row in wales} == { + f"voa.council_tax_stock.by_area.band_{band}" for band in "abcdefgh" + } + assert {tuple(row["area_ids"]) for row in wales} == {expected_wales} + assert len(expected_wales) == 22 + assert {row["defer_if_compiles"] for row in wales} == {True} + assert { + "no Wales country-level council-tax stock-by-band fact" in row["rationale"] + for row in wales + } == {True} + assert "council_tax_wales_band_h_absent" not in by_reason -def test_council_tax_activation_adds_2541_references() -> None: +def test_council_tax_activation_adds_2367_references() -> None: membership = _membership() active = 0 for band in "abcdefgh": @@ -80,7 +94,7 @@ def test_council_tax_activation_adds_2541_references() -> None: "local_authority" ]["candidates"] active += sum(row["status"] == "active" for row in candidates) - assert active == 2_541 + assert active == 2_367 def test_declared_deferral_roster_matching_no_crosswalk_area_refuses() -> None: @@ -97,6 +111,7 @@ def test_declared_deferral_roster_matching_no_crosswalk_area_refuses() -> None: [ ("S", 32, "Scottish"), ("N", 11, "Northern Ireland"), + ("W", 22, "Welsh"), ], ) def test_council_tax_country_masks_refuse_roster_count_drift( 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..6c9748e3d 100644 --- a/packages/microcosm-build/tests/test_uk_local_target_census.py +++ b/packages/microcosm-build/tests/test_uk_local_target_census.py @@ -160,7 +160,11 @@ def test_council_tax_source_and_fence_pin_measured_coverage() -> None: sources = {row["source_id"]: row for row in census["sources"]} source = sources["voa_council_tax_stock_la"] assert source["status"] == SOURCE_STATUS_PINNED_IN_LEDGER_FACTS - assert "2,541 active band cells" in source["notes"] + assert "2,541 locally compilable band cells" in source["notes"] + assert "2,367 English cells bind" in source["notes"] + assert "All 176 Welsh A-H cells are signed deferred" in source["notes"] + assert "no Wales country-level stock-by-band parent control" in source["notes"] + assert "all 521 excluded cells are signed deferrals" in source["notes"] assert "E09000001" in source["notes"] assert "W06000019 and W06000024" in source["notes"] assert "council_tax/net is not declared" in source["notes"] diff --git a/tools/generate_uk_local_target_references.py b/tools/generate_uk_local_target_references.py index 8065f4e8c..f5185786c 100644 --- a/tools/generate_uk_local_target_references.py +++ b/tools/generate_uk_local_target_references.py @@ -177,6 +177,9 @@ def _area_signed_deferrals( scottish_local_authorities = tuple( area_id for area_id in local_authority_ids if area_id[:1] == "S" ) + welsh_local_authorities = tuple( + area_id for area_id in local_authority_ids if area_id[:1] == "W" + ) if len(scottish_local_authorities) != 32: raise ValueError( "Scottish council-tax deferral mask expected 32 crosswalk local " @@ -187,10 +190,14 @@ def _area_signed_deferrals( "Northern Ireland council-tax deferral mask expected 11 crosswalk " f"local authorities; measured {len(ni_local_authorities)}." ) + if len(welsh_local_authorities) != 22: + raise ValueError( + "Welsh council-tax deferral mask expected 22 crosswalk local " + f"authorities; measured {len(welsh_local_authorities)}." + ) council_tax_ni_area_ids = ni_local_authorities council_tax_scotland_area_ids = scottish_local_authorities council_tax_city_band_a_area_ids = ("E09000001",) - council_tax_wales_band_h_area_ids = ("W06000019", "W06000024") pipr_lad_absent_area_ids = ( "E06000053", "E08000016", @@ -213,6 +220,7 @@ def add( rationale: str, area_ids: tuple[str, ...], allow_empty: bool = False, + defer_if_compiles: bool = False, ) -> None: if target_id not in target_ids: raise ValueError( @@ -239,6 +247,7 @@ def add( reason_id=reason_id, rationale=rationale, area_ids=matched_area_ids, + defer_if_compiles=defer_if_compiles, ) ) @@ -327,6 +336,23 @@ def add( ), area_ids=council_tax_ni_area_ids, ) + add( + target_id=target_id, + geography_level="local_authority", + reason_id="council_tax_wales_country_control_absent", + rationale=( + "The pinned feed carries no Wales country-level council-tax " + "stock-by-band fact, so the Welsh local-authority leg has no " + "parent control under the standing UK_CROSS_GRAIN_RULE " + "(country > constituency > la; unparented legs fail closed). " + "Bands A-H cannot bind for Wales until a Wales country control " + "is supplied; the Chronicle ask is filed under microcosm#762 / " + "A13. For Band H, this mask subsumes the prior two-cell absence " + "for W06000019 and W06000024." + ), + area_ids=welsh_local_authorities, + defer_if_compiles=True, + ) add( target_id="voa.council_tax_stock.by_area.band_a", geography_level="local_authority", @@ -338,17 +364,6 @@ def add( ), area_ids=council_tax_city_band_a_area_ids, ) - add( - target_id="voa.council_tax_stock.by_area.band_h", - geography_level="local_authority", - reason_id="council_tax_wales_band_h_absent", - rationale=( - "The pinned 2025 VOA local-authority record set publishes no " - "Band H cell for W06000019 or W06000024; 316/318 England/Wales " - "Band H cells compile." - ), - area_ids=council_tax_wales_band_h_area_ids, - ) add( target_id="ons.rent.private_rent", geography_level="local_authority", diff --git a/tools/score_uk_local_candidate.py b/tools/score_uk_local_candidate.py index beb278116..80bf65c55 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_444 UK_LOCAL_SCORE_TARGET_PERIOD = 2025 #: The incumbent is scored from published weights, never re-solved, so no #: incumbent holdout exists to place beside the candidate's rotation. From 1a6cda5d8ec86cb0c3d1240165e550f0b758872c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Wed, 2 Sep 2026 23:42:38 +0200 Subject: [PATCH 03/26] Sign the band-H and support-floor deferrals (#762 A14, PR B) and start the receipts Measured at f100 on spine-m: K=4 refused 172 constituency UC child-band cells with zero support; K=10 cleared every constituency cell and refused 86 local-authority cells, 84 of them council-tax band H, because the spine carries 170 band-H households from 49 raw FRS sources. Per Maria's A14 ruling the 296 band-H local-authority cells are signed-deferred (council_tax_band_h_spine_support_absent) and the two support-floor exclusion areas' own local-authority cells are signed-deferred (local_authority_support_floor_excluded); the exclusion reasons record the amendment. Surface 19,444 -> 19,105 active; pins moved accordingly. The receipts document opens with R0-R5 (identity, dry-run K sweep and cross-grain receipt, f001, f010, the K=4 refusal, the K=10 measurement). Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 96 + .../uk/local_area_support_exclusions.json | 4 +- .../uk/local_target_reference_membership.json | 3608 ++++----- .../build/uk/local_target_references.json | 6862 ----------------- .../build/uk/uk_local_target_census.json | 2 +- .../build/uk_runtime/local_target_census.py | 13 +- .../tests/test_target_reference_authoring.py | 6 +- .../tests/test_uk_battery_bindings.py | 15 +- .../tests/test_uk_council_tax_targets.py | 89 +- .../tests/test_uk_local_target_census.py | 7 +- tools/generate_uk_local_target_references.py | 61 +- tools/score_uk_local_candidate.py | 2 +- 12 files changed, 1895 insertions(+), 8870 deletions(-) create mode 100644 experiments/762-uk-rowwise-candidate-receipts.md diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md new file mode 100644 index 000000000..fb6750276 --- /dev/null +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -0,0 +1,96 @@ +# First calibrated rowwise UK local candidate — receipts (#762, #495 increment 6) + +Plan: `repos/uk-762-rowwise-candidate-plan.md` (approved 2026-09-02). Machinery: PR #852 (PR A). Registers, deferrals and these receipts: PR B (`uk-rowwise-candidate-762-b`). Spine of record: spine-m. Every run below is the **joint solve**: local register cells + ladder census household rows + the activated national families as rows of one matrix over the K-cloned spine, engine resolved on every cloned row, one `calibrate()` call under the local doctrine. + +## R0 — identity + +| item | value | +|---|---| +| spine | `spine-m.h5` (`data/ukds/acceptance/spine-m-832/`), sha256 `fb053cd2157702969c6e055278b5d5c10fbcc389d5c06eb80f6a3b345570713a`, 154,942,842 bytes, 52,846 households, `importance` weights, mass 29,247,433.0; sidecar + 14/14 spine gates bound | +| ladder | `uk_oa_ladder_2021.npz`, sha256 `9c6d56b90d2e975d750106b175020a54c5ec6acf42ef8909d304a9d7fc3868a7`, `matches_local_area_crosswalk_pin: true` | +| ledger facts | chronicle consumer artifact `1cab809`, facts sha256 `226358e73e7c449e71a3f6dc91a72e8e3941e0f14265943d81c990edb21c2a6c`, manifest `aadc0105…`; 107,550 rows | +| survey / calibration year | 2024 (FRS 2024-25) / **2025** | +| registers in force | `local_binding_adjudications.json`: 6 fences (2026-09-02 → 2026-12-02; census fence to 2026-11-30); `local_area_support_exclusions.json`: E06000053, E09000001 | +| surface | 19,444 active local register cells (19,618 − 174 Welsh council-tax cells signed-deferred, A13) + 1,011 ladder household rows + 364 activated national references | +| code | PR A `1ddb0e27` / PR B `effdc6e8` (this document's runs; later runs cite their own pins) | + +## R1 — f100 dry-run K sweep (2026-09-02, ninth attempt completed) + +No engine, no solve, no write. 81 s, 5.0 GB peak RSS through pins, both registry compiles, the K=4 clone, surface assembly, cross-grain reconciliation and the sweep. + +Matrix at K=4: **20,819 rows × 211,384 households** (20,455 local incl. ladder; 364 national). + +| K | constituency min rows / ESS / sources | LA min rows / ESS / sources | +|--:|---|---| +| 1 | 28 / 15.3 / 28 | 1 / 1.0 / 1 | +| 2 | 42 / 28.8 / 42 | 3 / 2.4 / 3 | +| 4 | 101 / 86.4 / 97 | 7 / 6.8 / 7 | + +Identical to the #761 tables (spine-i, spine-k): the assignment surface is value-column-independent and the roster/region/weight inputs are preserved on spine-m. + +Cross-grain receipt (39 groups in force): +- 8 age-band bridges at both grains, factor 1.0000 (ONS by-area sums equal the UK totals). +- UC caseload bridge: by-area UC counts rescale ×1.0276 at both grains (2025-05 area facts → 2025-12 caseload). +- 12 constituency-over-LA exact matches (HMRC amounts, age bands, UC count): LA cells rescale to constituency sums, factors 0.992–1.022. +- England council-tax controls (8 bands) over 296 LAs, factors within 0.1 % of one; Scotland's 8 controls: licensed empty legs (every Scottish LA cell signed-deferred); Wales: no rows (A13). +- Household-composition partition bridge **unbound** (three cells are #791 reviewed exclusions) → census households bind as published, 2021/22 vintage (A11, published to #736). +- 15 fan-out national targets receipted as distributions, not controls. + +Vintages behind the 2025 period: UC 2025-05 (3,510 cells), HMRC tax-year 2023 (4,035), age mid-2024 (8,088), tenure 2021 (1,316) / 2022 (128), council tax 2025 (no hold). + +## R2 — f001 smoke (K=4, 1 %, sample seed 578; 2026-09-02) + +Machinery end to end on the licensed spine: sample 52,846 → 501 households (156 source families; mass renormalized ×105.29 to the full total), clone ×4 → 2,004 households / 4,352 persons / 2,496 benunits, engine resolved on the cloned frame (46 national inputs, 18 + 30 local metrics), surface restricted for the rung (1,223 cells whose area drew no rows; 10,429 covered cells with zero metric support), **9,167 targets × 2,004 households** (7,854 register + 949 ladder + 364 national), one solve (uniform, 512 epochs), battery run with ladder-only enforcement, 5-fold rotated holdout, atomic bundle, Logbook row chained on the `uk/local` tail. + +| measure | value | +|---|---| +| wall / peak RSS | 101 s / 3.1 GB | +| loss initial → final | 1.375 → 0.418 | +| median / max abs relative error | 0.347 / 926 | +| past-cap (all rows) | 147 at init, 8 at final, 139 escaped, 0 pushed out | +| realized max weight ratio vs design | 6.29 (bound 100) | +| calibration mass change | 29,247,433 → 14,385,130 (×0.492, free mass) | +| holdout fold losses | 0.676, 0.641, 0.679, 0.674, 0.659 | +| gates | ladder passed; area_support / target_fit / per_family_fit failed (recorded, not enforced below f100); weight_ess, weight_ratio passed | +| releasable | false (rung) | + +A 1 % rung has no fit meaning; it establishes that every stage runs on the real spine and sizes the cost. Support-limited-miss diagnostic ran (constituency: 2,411 failing cells, 14 % in the bottom-ESS decile, Spearman −0.04). + +## R3 — f010 development rung (K=4, 10 %, sample seed 578; 2026-09-02) + +Sample 52,846 → 5,247 households (1,622 source families; mass renormalized ×10.07), clone ×4 → 20,988 households / 45,248 persons / 24,680 benunits; rung surface: 22 cells whose area drew no rows, 1,848 covered cells with zero metric support dropped; **18,585 targets × 20,988 households** (17,575 register + 1,010 ladder + 364 national). + +| measure | value | +|---|---| +| wall / peak RSS | 214 s / 4.3 GB (f001: 101 s / 3.1 GB) | +| loss initial → final | 0.524 → 0.139 | +| median / max abs relative error | 0.032 / 249 (City of London band H) | +| past-cap (all rows) | 46 at init, 16 at final, 30 escaped, 0 pushed out | +| realized max weight ratio vs design | 57.3 (bound 100) | +| calibration mass change | 29,247,433 → 28,165,560 (×0.963, free mass) | +| holdout fold losses | 0.431, 0.436, 0.422, 0.442, 0.471 | +| local fit within 10 % / 25 % | age 69 % / 82 % (7,985 cells); census households 85 % / 98 % (1,010); council tax 72 % / 84 % (1,893) | +| gates | ladder, per_family_fit, weight_ess, weight_ratio passed; area_support and target_fit failed (recorded, not enforced below f100) | +| support-limited misses | constituency: 1,704 failing cells, Spearman(worst error, ESS) −0.38; LA: 1,577, −0.50 | +| releasable | false (rung) | + +Sizing for f100 from f001 → f010: about +1.2 GB per 19k cloned rows on top of a 3 GB base → ≈ 16 GB peak at 211,384 rows; wall scales with the engine run and the five holdout solves. + +## R4 — f100 at the ruled K=4: refused on support (2026-09-02, attempt `ff0faa2d`, Logbook row `219cb604…`, disposition failed) + +Sampling none (f100), clone ×4 → 211,384 households, engine resolved on every cloned row in one block (154 s to the refusal, **7.6 GB** peak RSS — the f001 → f010 extrapolation of 16 GB was pessimistic). The strict f100 builder refused: **172 cells with a nonzero target and zero household support**, all in the UC child-band family (`uc_hh_2_children` in the listed examples: E14001084, E14001107, E14001156, E14001318, S14000027 — Na h-Eileanan an Iar, the smallest constituency at 101 rows). A UC benefit unit with exactly two children is ~2 % of cloned rows, so a 101-row constituency has ~13 % odds of carrying none; the miss is support-limited by construction, which is the D7 trigger: "if Run U shows misses concentrated where ESS is lowest, a K=10 run under the identical doctrine is the measured comparison". K=10 (≈ 250 rows in the smallest constituency) should leave only a handful of such cells; those that remain are target-side work (signed deferral of the specific zero-support cells) rather than a clone multiplier. + +Consequence for the K ruling (A4): K=4 cannot bind the full UC child-band surface at f100; the K=10 measurement below is the evidence for re-adjudicating the declared `--n-clones`. + +## R5 — f100 at K=10 (the D7 escalation measurement; 2026-09-02, attempt chained on R4's failed row) + +Clone ×10 → 528,460 households; engine resolved per clone block (`--engine-blocks 10`, each block a declared subset of the cloned mass); **192 s to the refusal, 9.9 GB peak RSS**. The strict f100 builder refused **86 cells**, all at local-authority grain: 84 × `council_tax/band_h` (84 of the 296 active band-H authorities), plus Isles of Scilly `age/0_10` and `council_tax/band_f`. **Every constituency-grain cell is supported at K=10** — the 172 UC child-band cells unreachable at K=4 are gone. + +Why band H is not a clone-count problem: spine-m carries **170 band-H households, from 49 raw FRS households** (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1); 49 sources cannot populate 296 authorities at any affordable K. The Scilly cells are the A4 support-exclusion area (7 rows at K=4, 17 at K=10) carrying 30 metrics. + +| K | wall to refusal / peak | unreachable nonzero cells | where | +|--:|---|--:|---| +| 4 | 154 s / 7.6 GB | 172 | constituency UC child bands (small constituencies) | +| 10 | 192 s / 9.9 GB (10 engine blocks) | 86 | LA: band H × 84, Scilly × 2 | + +Proposed dispositions (A14, María): K=10 for the first candidate (measured); sign a deferral for the 296 band-H LA cells (`voa.council_tax_stock.by_area.band_h`, spine support 49 raw sources); amend A4 so the two support-excluded authorities' cells are signed-deferred as well (they stay in the solve through the other families' rows; their own cells are unsupported by the exclusion's own evidence). diff --git a/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json index eb8028e69..f39cc541d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/local_area_support_exclusions.json @@ -3,14 +3,14 @@ "description": "Reviewed UK local-area support-floor exclusions. The register ships empty in PR A; each future entry must carry measured shortfalls and an in-force adjudication.", "exclusions": { "local_authority/E06000053": { - "reason": "Reviewed exclusion of the local-authority support floor for Isles of Scilly (E06000053): population-proportional ladder assignment gives the area 7 positive-weight rows at the ruled K=4 (17 at K=10; microcosm#761 receipts section R1, identical on spine-i and spine-k), so the 50-row / ESS-50 / 50-source floor is unreachable by clone count. The area stays in the solve with its measured support and is flagged support_below_floor in area_support_summary.csv; consumers must treat its estimates as unsupported. Re-measured on every candidate; a passing area retires this entry (a stale exclusion fails the gate).", + "reason": "Reviewed exclusion of the local-authority support floor for Isles of Scilly (E06000053): population-proportional ladder assignment gives the area 7 positive-weight rows at the ruled K=4 (17 at K=10; microcosm#761 receipts section R1, identical on spine-i and spine-k), so the 50-row / ESS-50 / 50-source floor is unreachable by clone count. The area stays in the solve with its measured support and is flagged support_below_floor in area_support_summary.csv; consumers must treat its estimates as unsupported. Re-measured on every candidate; a passing area retires this entry (a stale exclusion fails the gate). Per microcosm#762 A14 the authority's own local-authority cells are signed-deferred (`local_authority_support_floor_excluded`).", "approved_by": "juaristi22", "adjudication": "microcosm#762 (A4, ruling 2026-09-02)", "approved_on": "2026-09-02", "expires_on": "2026-12-02" }, "local_authority/E09000001": { - "reason": "Reviewed exclusion of the local-authority support floor for City of London (E09000001): population-proportional ladder assignment gives the area 14 positive-weight rows at the ruled K=4 (49 at K=10; microcosm#761 receipts section R1, identical on spine-i and spine-k), so the 50-row / ESS-50 / 50-source floor is unreachable by clone count. The area stays in the solve with its measured support and is flagged support_below_floor in area_support_summary.csv; consumers must treat its estimates as unsupported. Re-measured on every candidate; a passing area retires this entry (a stale exclusion fails the gate).", + "reason": "Reviewed exclusion of the local-authority support floor for City of London (E09000001): population-proportional ladder assignment gives the area 14 positive-weight rows at the ruled K=4 (49 at K=10; microcosm#761 receipts section R1, identical on spine-i and spine-k), so the 50-row / ESS-50 / 50-source floor is unreachable by clone count. The area stays in the solve with its measured support and is flagged support_below_floor in area_support_summary.csv; consumers must treat its estimates as unsupported. Re-measured on every candidate; a passing area retires this entry (a stale exclusion fails the gate). Per microcosm#762 A14 the authority's own local-authority cells are signed-deferred (`local_authority_support_floor_excluded`).", "approved_by": "juaristi22", "adjudication": "microcosm#762 (A4, ruling 2026-09-02)", "approved_on": "2026-09-02", 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 b524e94ca..eef112a75 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,13 +3,13 @@ "target_period": 2025, "candidate_count": 21519, "contract_target_count": 33, - "active_reference_count": 19444, + "active_reference_count": 19105, "status_counts": { - "active": 19444, + "active": 19105, "no_fact_at_or_before_period": 314, "no_fact_for_area": 1586, "signed_deferral_compile_error": 1, - "signed_deferred": 174 + "signed_deferred": 513 }, "areas_by_geography_level": { "constituency": [ @@ -3054,6 +3054,311 @@ ], "defer_if_compiles": true }, + { + "target_id": "voa.council_tax_stock.by_area.band_h", + "geography_level": "local_authority", + "reason_id": "council_tax_band_h_spine_support_absent", + "rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14).", + "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", + "E06000053", + "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", + "E08000016", + "E08000017", + "E08000018", + "E08000019", + "E08000021", + "E08000022", + "E08000023", + "E08000024", + "E08000025", + "E08000026", + "E08000027", + "E08000028", + "E08000029", + "E08000030", + "E08000031", + "E08000032", + "E08000033", + "E08000034", + "E08000035", + "E08000036", + "E08000037", + "E09000001", + "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" + ], + "defer_if_compiles": true + }, { "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", @@ -3455,6 +3760,265 @@ "N09000010", "N09000011" ] + }, + { + "target_id": "hmrc.self_employment_income.amount", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "hmrc.self_employment_income.count", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "hmrc.employment_income.amount", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "hmrc.employment_income.count", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.0_10", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.10_20", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.20_30", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.30_40", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.40_50", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.50_60", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.60_70", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.age.70_80", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "dwp.uc.households_by_area", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.tenure.owned_outright", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.tenure.owned_mortgage", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.tenure.private_rent", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "ons.tenure.social_rent", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_a", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_b", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_c", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_d", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_e", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_f", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true + }, + { + "target_id": "voa.council_tax_stock.by_area.band_g", + "geography_level": "local_authority", + "reason_id": "local_authority_support_floor_excluded", + "rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4).", + "area_ids": [ + "E06000053", + "E09000001" + ], + "defer_if_compiles": true } ], "uprating_holds": [ @@ -10738,14 +11302,6 @@ "from": "2023", "to": "2025" }, - { - "name": "hmrc.self_employment_income.amount@E09000001", - "target_id": "hmrc.self_employment_income.amount", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2023", - "to": "2025" - }, { "name": "hmrc.self_employment_income.amount@E09000002", "target_id": "hmrc.self_employment_income.amount", @@ -18810,14 +19366,6 @@ "from": "2023", "to": "2025" }, - { - "name": "hmrc.self_employment_income.count@E09000001", - "target_id": "hmrc.self_employment_income.count", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2023", - "to": "2025" - }, { "name": "hmrc.self_employment_income.count@E09000002", "target_id": "hmrc.self_employment_income.count", @@ -26882,14 +27430,6 @@ "from": "2023", "to": "2025" }, - { - "name": "hmrc.employment_income.amount@E09000001", - "target_id": "hmrc.employment_income.amount", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2023", - "to": "2025" - }, { "name": "hmrc.employment_income.amount@E09000002", "target_id": "hmrc.employment_income.amount", @@ -34954,14 +35494,6 @@ "from": "2023", "to": "2025" }, - { - "name": "hmrc.employment_income.count@E09000001", - "target_id": "hmrc.employment_income.count", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2023", - "to": "2025" - }, { "name": "hmrc.employment_income.count@E09000002", "target_id": "hmrc.employment_income.count", @@ -41330,14 +41862,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.0_10@E06000053", - "target_id": "ons.age.0_10", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.0_10@E06000054", "target_id": "ons.age.0_10", @@ -43042,14 +43566,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.0_10@E09000001", - "target_id": "ons.age.0_10", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.0_10@E09000002", "target_id": "ons.age.0_10", @@ -49418,14 +49934,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.10_20@E06000053", - "target_id": "ons.age.10_20", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.10_20@E06000054", "target_id": "ons.age.10_20", @@ -51130,14 +51638,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.10_20@E09000001", - "target_id": "ons.age.10_20", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.10_20@E09000002", "target_id": "ons.age.10_20", @@ -57506,14 +58006,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.20_30@E06000053", - "target_id": "ons.age.20_30", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.20_30@E06000054", "target_id": "ons.age.20_30", @@ -59218,14 +59710,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.20_30@E09000001", - "target_id": "ons.age.20_30", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.20_30@E09000002", "target_id": "ons.age.20_30", @@ -65594,14 +66078,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.30_40@E06000053", - "target_id": "ons.age.30_40", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.30_40@E06000054", "target_id": "ons.age.30_40", @@ -67306,14 +67782,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.30_40@E09000001", - "target_id": "ons.age.30_40", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.30_40@E09000002", "target_id": "ons.age.30_40", @@ -73682,14 +74150,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.40_50@E06000053", - "target_id": "ons.age.40_50", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.40_50@E06000054", "target_id": "ons.age.40_50", @@ -75394,14 +75854,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.40_50@E09000001", - "target_id": "ons.age.40_50", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.40_50@E09000002", "target_id": "ons.age.40_50", @@ -81770,14 +82222,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.50_60@E06000053", - "target_id": "ons.age.50_60", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.50_60@E06000054", "target_id": "ons.age.50_60", @@ -83482,14 +83926,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.50_60@E09000001", - "target_id": "ons.age.50_60", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.50_60@E09000002", "target_id": "ons.age.50_60", @@ -89858,14 +90294,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.60_70@E06000053", - "target_id": "ons.age.60_70", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.60_70@E06000054", "target_id": "ons.age.60_70", @@ -91570,14 +91998,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.60_70@E09000001", - "target_id": "ons.age.60_70", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.60_70@E09000002", "target_id": "ons.age.60_70", @@ -97946,14 +98366,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.70_80@E06000053", - "target_id": "ons.age.70_80", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.70_80@E06000054", "target_id": "ons.age.70_80", @@ -99658,14 +100070,6 @@ "from": "2024", "to": "2025" }, - { - "name": "ons.age.70_80@E09000001", - "target_id": "ons.age.70_80", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2024", - "to": "2025" - }, { "name": "ons.age.70_80@E09000002", "target_id": "ons.age.70_80", @@ -105890,14 +106294,6 @@ "from": "2025-05", "to": "2025" }, - { - "name": "dwp.uc.households_by_area@E06000053", - "target_id": "dwp.uc.households_by_area", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2025-05", - "to": "2025" - }, { "name": "dwp.uc.households_by_area@E06000054", "target_id": "dwp.uc.households_by_area", @@ -107602,14 +107998,6 @@ "from": "2025-05", "to": "2025" }, - { - "name": "dwp.uc.households_by_area@E09000001", - "target_id": "dwp.uc.households_by_area", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2025-05", - "to": "2025" - }, { "name": "dwp.uc.households_by_area@E09000002", "target_id": "dwp.uc.households_by_area", @@ -128914,14 +129302,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.owned_outright@E06000053", - "target_id": "ons.tenure.owned_outright", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.owned_outright@E06000054", "target_id": "ons.tenure.owned_outright", @@ -130626,14 +131006,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.owned_outright@E09000001", - "target_id": "ons.tenure.owned_outright", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.owned_outright@E09000002", "target_id": "ons.tenure.owned_outright", @@ -131802,14 +132174,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.owned_mortgage@E06000053", - "target_id": "ons.tenure.owned_mortgage", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.owned_mortgage@E06000054", "target_id": "ons.tenure.owned_mortgage", @@ -133514,14 +133878,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.owned_mortgage@E09000001", - "target_id": "ons.tenure.owned_mortgage", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.owned_mortgage@E09000002", "target_id": "ons.tenure.owned_mortgage", @@ -134690,14 +135046,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.private_rent@E06000053", - "target_id": "ons.tenure.private_rent", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.private_rent@E06000054", "target_id": "ons.tenure.private_rent", @@ -136402,14 +136750,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.private_rent@E09000001", - "target_id": "ons.tenure.private_rent", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.private_rent@E09000002", "target_id": "ons.tenure.private_rent", @@ -137578,14 +137918,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.social_rent@E06000053", - "target_id": "ons.tenure.social_rent", - "geography_level": "local_authority", - "geography_id": "E06000053", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.social_rent@E06000054", "target_id": "ons.tenure.social_rent", @@ -139290,14 +139622,6 @@ "from": "2021", "to": "2025" }, - { - "name": "ons.tenure.social_rent@E09000001", - "target_id": "ons.tenure.social_rent", - "geography_level": "local_authority", - "geography_id": "E09000001", - "from": "2021", - "to": "2025" - }, { "name": "ons.tenure.social_rent@E09000002", "target_id": "ons.tenure.social_rent", @@ -140076,27 +140400,27 @@ } ], "holds_by_target": { - "dwp.uc.households_by_area": 982, + "dwp.uc.households_by_area": 980, "dwp.uc.households_by_area_children_0": 632, "dwp.uc.households_by_area_children_1": 632, "dwp.uc.households_by_area_children_2": 632, "dwp.uc.households_by_area_children_3plus": 632, - "hmrc.employment_income.amount": 1009, - "hmrc.employment_income.count": 1009, - "hmrc.self_employment_income.amount": 1008, - "hmrc.self_employment_income.count": 1009, - "ons.age.0_10": 1011, - "ons.age.10_20": 1011, - "ons.age.20_30": 1011, - "ons.age.30_40": 1011, - "ons.age.40_50": 1011, - "ons.age.50_60": 1011, - "ons.age.60_70": 1011, - "ons.age.70_80": 1011, - "ons.tenure.owned_mortgage": 361, - "ons.tenure.owned_outright": 361, - "ons.tenure.private_rent": 361, - "ons.tenure.social_rent": 361 + "hmrc.employment_income.amount": 1008, + "hmrc.employment_income.count": 1008, + "hmrc.self_employment_income.amount": 1007, + "hmrc.self_employment_income.count": 1008, + "ons.age.0_10": 1009, + "ons.age.10_20": 1009, + "ons.age.20_30": 1009, + "ons.age.30_40": 1009, + "ons.age.40_50": 1009, + "ons.age.50_60": 1009, + "ons.age.60_70": 1009, + "ons.age.70_80": 1009, + "ons.tenure.owned_mortgage": 359, + "ons.tenure.owned_outright": 359, + "ons.tenure.private_rent": 359, + "ons.tenure.social_rent": 359 }, "targets": { "hmrc.self_employment_income.amount": { @@ -151983,13 +152307,11 @@ "target_id": "hmrc.self_employment_income.amount", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 588000000.0, - "resolved_fact_period": "2023", - "resolved_fact_key": "ledger_aggregate_fact_v2_eb2d4a5c47300aaf718a7d63" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "hmrc.self_employment_income.amount@E09000002", @@ -165141,13 +165463,11 @@ "target_id": "hmrc.self_employment_income.count", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2000.0, - "resolved_fact_period": "2023", - "resolved_fact_key": "ledger_aggregate_fact_v2_e3e3ad4d344ee8d41c83c0f7" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "hmrc.self_employment_income.count@E09000002", @@ -178299,13 +178619,11 @@ "target_id": "hmrc.employment_income.amount", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 1197000000.0, - "resolved_fact_period": "2023", - "resolved_fact_key": "ledger_aggregate_fact_v2_0372c0ec411946bfc2e42c09" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "hmrc.employment_income.amount@E09000002", @@ -191457,13 +191775,11 @@ "target_id": "hmrc.employment_income.count", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 9000.0, - "resolved_fact_period": "2023", - "resolved_fact_key": "ledger_aggregate_fact_v2_a26f04392fc4da0887f85013" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "hmrc.employment_income.count@E09000002", @@ -192731,7 +193047,7 @@ } }, "ons.age.0_10": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -201190,7 +201506,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -201835,13 +202151,11 @@ "target_id": "ons.age.0_10", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 3, "matched_fact_count_at_or_before_period": 3, - "resolved_period": 2025, - "resolved_value": 198.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_dd91d73f5234b50311245bdd" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.0_10@E06000054", @@ -204617,13 +204931,11 @@ "target_id": "ons.age.0_10", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 3, "matched_fact_count_at_or_before_period": 3, - "resolved_period": 2025, - "resolved_value": 425.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_a4ae94c838c64225064cad72" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.0_10@E09000002", @@ -205891,7 +206203,7 @@ } }, "ons.age.10_20": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -214350,7 +214662,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -214995,13 +215307,11 @@ "target_id": "ons.age.10_20", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 185.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_f380140c48183713e0848276" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.10_20@E06000054", @@ -217777,13 +218087,11 @@ "target_id": "ons.age.10_20", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 630.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_3d794b1b5b6e7f44dfa78ff3" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.10_20@E09000002", @@ -219051,7 +219359,7 @@ } }, "ons.age.20_30": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -227510,7 +227818,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -228155,13 +228463,11 @@ "target_id": "ons.age.20_30", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 363.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_dab5731bc7b0b9ddbcc3e5a8" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.20_30@E06000054", @@ -230937,13 +231243,11 @@ "target_id": "ons.age.20_30", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 5163.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_9c24362407c2715515d24f41" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.20_30@E09000002", @@ -232211,7 +232515,7 @@ } }, "ons.age.30_40": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -240670,7 +240974,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -241315,13 +241619,11 @@ "target_id": "ons.age.30_40", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 266.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_f92daf25aeae5f9fe8cf1f5a" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.30_40@E06000054", @@ -244097,13 +244399,11 @@ "target_id": "ons.age.30_40", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 4062.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_d4ca3ebb73812d3ca7c4bea9" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.30_40@E09000002", @@ -245371,7 +245671,7 @@ } }, "ons.age.40_50": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -253830,7 +254130,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -254475,13 +254775,11 @@ "target_id": "ons.age.40_50", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 288.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_dc2dbfd27e1859ab6ec5d53b" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.40_50@E06000054", @@ -257257,13 +257555,11 @@ "target_id": "ons.age.40_50", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 1870.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_abb711eb96ef10f6aa21a5fc" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.40_50@E09000002", @@ -258531,7 +258827,7 @@ } }, "ons.age.50_60": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -266990,7 +267286,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -267635,13 +267931,11 @@ "target_id": "ons.age.50_60", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 321.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_51aa2af01af104020aa904e4" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.50_60@E06000054", @@ -270417,13 +270711,11 @@ "target_id": "ons.age.50_60", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 1403.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_c211ccefef02ebcd1fc69728" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.50_60@E09000002", @@ -271691,7 +271983,7 @@ } }, "ons.age.60_70": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -280150,7 +280442,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -280795,13 +281087,11 @@ "target_id": "ons.age.60_70", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 269.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_435336bb67fc61c18d15fcea" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.60_70@E06000054", @@ -283577,13 +283867,11 @@ "target_id": "ons.age.60_70", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 1009.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_b2869646546465917b37dfdc" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.60_70@E09000002", @@ -284851,7 +285139,7 @@ } }, "ons.age.70_80": { - "status": "active", + "status": "partially_active", "geography_levels": { "constituency": { "status": "active", @@ -293310,7 +293598,7 @@ ] }, "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -293955,13 +294243,11 @@ "target_id": "ons.age.70_80", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 290.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_eb7447bc91e292056cfcd484" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.70_80@E06000054", @@ -296737,13 +297023,11 @@ "target_id": "ons.age.70_80", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 624.0, - "resolved_fact_period": "2024", - "resolved_fact_key": "ledger_aggregate_fact_v2_e45b2923f264d422c7313eca" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.age.70_80@E09000002", @@ -307097,13 +307381,11 @@ "target_id": "dwp.uc.households_by_area", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 78.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_343007d5ae09a3c32fc78696" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "dwp.uc.households_by_area@E06000054", @@ -309879,13 +310161,11 @@ "target_id": "dwp.uc.households_by_area", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 440.0, - "resolved_fact_period": "2025-05", - "resolved_fact_key": "ledger_aggregate_fact_v2_968f4f007627a816360e439e" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "dwp.uc.households_by_area@E09000002", @@ -357943,10 +358223,10 @@ } }, "ons.tenure.owned_outright": { - "status": "active", + "status": "partially_active", "geography_levels": { "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -358591,13 +358871,11 @@ "target_id": "ons.tenure.owned_outright", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 320.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_fbb941804048f7a1d83adef2" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.owned_outright@E06000054", @@ -361373,13 +361651,11 @@ "target_id": "ons.tenure.owned_outright", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1114.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_c9b1798847ca5c7c0fb3f219" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.owned_outright@E09000002", @@ -362647,10 +362923,10 @@ } }, "ons.tenure.owned_mortgage": { - "status": "active", + "status": "partially_active", "geography_levels": { "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -363295,13 +363571,11 @@ "target_id": "ons.tenure.owned_mortgage", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 98.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_b84cb4df872e96ecab91a96e" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.owned_mortgage@E06000054", @@ -366077,13 +366351,11 @@ "target_id": "ons.tenure.owned_mortgage", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 680.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_8f964e4987cd295d4bcc6d59" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.owned_mortgage@E09000002", @@ -367351,10 +367623,10 @@ } }, "ons.tenure.private_rent": { - "status": "active", + "status": "partially_active", "geography_levels": { "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -367999,13 +368271,11 @@ "target_id": "ons.tenure.private_rent", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 344.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_ec640cffb4d2b2ef01bd807c" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.private_rent@E06000054", @@ -370781,13 +371051,11 @@ "target_id": "ons.tenure.private_rent", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 2373.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_764eb754b5652fed302878fe" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.private_rent@E09000002", @@ -372055,10 +372323,10 @@ } }, "ons.tenure.social_rent": { - "status": "active", + "status": "partially_active", "geography_levels": { "local_authority": { - "status": "active", + "status": "partially_active", "candidate_count": 361, "candidates": [ { @@ -372703,13 +372971,11 @@ "target_id": "ons.tenure.social_rent", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 162.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_80b859f9007a31bf8a3f404d" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.social_rent@E06000054", @@ -375485,13 +375751,11 @@ "target_id": "ons.tenure.social_rent", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 2, "matched_fact_count_at_or_before_period": 2, - "resolved_period": 2025, - "resolved_value": 730.0, - "resolved_fact_period": "2021", - "resolved_fact_key": "ledger_aggregate_fact_v2_93316fdf6f7f3ded3be5271b" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "ons.tenure.social_rent@E09000002", @@ -381750,13 +382014,11 @@ "target_id": "voa.council_tax_stock.by_area.band_a", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b9c7f57eeb56cd80f6421d84" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_a@E06000054", @@ -386366,13 +386628,11 @@ "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a7e8748912e947954b858152" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_b@E06000054", @@ -389148,13 +389408,11 @@ "target_id": "voa.council_tax_stock.by_area.band_b", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 350.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1ed4d0232fd6565dc2794f78" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_b@E09000002", @@ -390983,13 +391241,11 @@ "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2b6d8dcad7cddf19c1aff6f4" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_c@E06000054", @@ -393765,13 +394021,11 @@ "target_id": "voa.council_tax_stock.by_area.band_c", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 690.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_17cbda9b55a0cad03fdd79f8" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_c@E09000002", @@ -395600,13 +395854,11 @@ "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 270.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ee5bf74a09c60426d7f43b59" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_d@E06000054", @@ -398382,13 +398634,11 @@ "target_id": "voa.council_tax_stock.by_area.band_d", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 950.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0662f89e7634a198b91ecec2" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_d@E09000002", @@ -400217,13 +400467,11 @@ "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 330.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_220cbe6f8240762b176b9e8d" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_e@E06000054", @@ -402999,13 +403247,11 @@ "target_id": "voa.council_tax_stock.by_area.band_e", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2880.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bbe1c5fb6b77762b9a5ef049" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_e@E09000002", @@ -404834,13 +405080,11 @@ "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 270.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f71fcc8135cff193dcad30dc" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_f@E06000054", @@ -407616,13 +407860,11 @@ "target_id": "voa.council_tax_stock.by_area.band_f", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1390.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0cadeaf2b7b334914539264a" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_f@E09000002", @@ -409451,13 +409693,11 @@ "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 130.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e76220a454ee836ca8d781f7" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_g@E06000054", @@ -412233,13 +412473,11 @@ "target_id": "voa.council_tax_stock.by_area.band_g", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1500.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_943cae1324ed7f679a63ad2a" + "signed_reason_id": "local_authority_support_floor_excluded", + "signed_rationale": "E06000053 and E09000001 are reviewed exclusions of the local-authority support floor (uk/local_area_support_exclusions.json, microcosm#762 A4): respectively 7 and 14 positive-weight rows at K=4, and 17 and 49 at K=10. Their own local-authority cells are signed-deferred on the same evidence; their rows stay in the solve through the constituency families and the national rows (A14 amendment to A4)." }, { "name": "voa.council_tax_stock.by_area.band_g@E09000002", @@ -413420,10 +413658,10 @@ } }, "voa.council_tax_stock.by_area.band_h": { - "status": "partially_active", + "status": "multiple_deferrals", "geography_levels": { "local_authority": { - "status": "partially_active", + "status": "multiple_deferrals", "candidate_count": 361, "candidates": [ { @@ -413431,3848 +413669,3256 @@ "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0e06ed2754130b88a26eff9d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000002", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b162e75371ff8c4bb18ccecc" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000003", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_311b8b8ab5b2a3a415795f28" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000004", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 130.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ecd70aa6485a6381de21f12b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000005", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_96dafb831058de24741d2f05" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000006", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_475d6c3471570db73559933f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000007", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000007", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 230.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_566808eaca5643e1784575fa" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000008", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bf905896605a22d87f8c7a62" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000009", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4e08919d712715319b916285" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000010", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1414601d07e8387170ba4066" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000011", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 300.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1c59d6508e7419ca12f9ac75" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000012", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7e1bb9dff48eb4a4d0dcee41" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000013", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4dadefd9c0e1723bd20293a7" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000014", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b4699ab3b1d3f3a157d74fff" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000015", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_176f27da217f22af5087891b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000016", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e8e5ef10d2bc7d387e6ad60f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000017", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000017", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 170.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_31faaf79fa505e50a91f5b8c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000018", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_59c187393155b786f4107a9a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000019", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0676357bac100c29eab98acf" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000020", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_adc96f9d24a3dadaa31f3475" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000021", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_356a4501d182979f4a618ef6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000022", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 460.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d175d7ad8b53e6229cc3d737" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000023", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 360.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9f4689d17e6753ed23fa9f85" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000024", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 290.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a445857ecbf4aa9a7e2e8f10" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000025", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000025", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 200.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2fa00e6e698af870e3244e56" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000026", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000026", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e69aaba18088027f0c0c2fa8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000027", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000027", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2d107209539416d831c62be2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000030", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000030", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_204a6c3302b2af4f53e746fa" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000031", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000031", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e13e220e35e2abd4fd92ccbc" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000032", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000032", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_079d588905b98dbe01ffc7ee" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000033", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000033", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 130.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cafc20b491fe3f7d78338796" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000034", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000034", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_503818c81eca116157b9ab36" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000035", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000035", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_47ddc45383d138134cf332b9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000036", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000036", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 310.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a7a56c0cdd4141b5095ca298" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000037", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000037", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 780.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7ecbc60b109b8967957118ee" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000038", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000038", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1f0b8ae4fc41b6be4be7137c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000039", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000039", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e168bc97346c94ce034a5485" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000040", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000040", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2020.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_acb2643f331d39d9edcef9fe" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000041", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000041", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 560.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_11b0637afaaebc9de4e4772b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000042", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000042", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 180.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a8b8678911954eca781729c1" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000043", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000043", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_afef7d22436e56b69aad74b5" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000044", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000044", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2b0a0c981617a258703bf23c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000045", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000045", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6cc23aa56bb485a52397cca3" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000046", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000046", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c05ecaf02b7296d90f4b9c9c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000047", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000047", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 280.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_93756a85ccdb51884354cf02" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000049", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000049", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2010.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2d4133c4b710469219331459" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000050", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000050", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 640.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6830e9d4cc71d86957449df3" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000051", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000051", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 370.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e8c7772ee1144fc38f4d81a4" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000052", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000052", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 450.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_af020e23763787a4061e343b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000053", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000053", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_768858fc6fe8399bdcb39038" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000054", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000054", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1370.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ffabb83de200db0a03646544" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000055", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000055", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a1b0c2fdf02264bf95b0177b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000056", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000056", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 410.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_24613b2cb565f243d82b6770" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000057", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000057", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 590.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d71839fdea9129be67bb13b4" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000058", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000058", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1310.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5f68b0a0d12179a7d6c4a74e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000059", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000059", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 740.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_fabc753bf56424c238e1cfed" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000060", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000060", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 6160.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5c68616af0dd256b00fc07a2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000061", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000061", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 280.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_321b1f512933a7349130580b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000062", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000062", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 490.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_829bf586fb529415cd4d87f1" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000063", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000063", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_17b046f68d45f70635b9c95e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000064", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000064", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 340.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5e56af20d496bd3d013f3577" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000065", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000065", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1320.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c26337d7dff4f056badd621a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E06000066", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E06000066", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 520.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_94f23947b76233435bb72215" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000008", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 510.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_190775385b7ff27803ea64e0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000009", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f8f68d2cf81633d644fc837e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000010", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_af9af946e77b51d510205f75" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000011", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 180.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ea988e6c16d39d6935c48612" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000012", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 420.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ed1b7e179f4553b9b11c2868" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000032", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000032", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e01917eebeda5056cb0c3dcd" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000033", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000033", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_93cf224917dc109c47c2328c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000034", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000034", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_85edd53b52bf3e7094a456ef" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000035", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000035", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f425770765f6e523cd6ebe8a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000036", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000036", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a7338eb0ba480fa8d51ba291" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000037", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000037", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9af153fbfd95652f13bd5dfc" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000038", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000038", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_da19de5518541efcc8692a29" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000039", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000039", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_34920afe3c34db687de41c45" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000040", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000040", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 210.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8932fdb66afe7e58442b4976" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000041", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000041", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_480dc87e5da165b6f2be2e8c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000042", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000042", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_00854722b8c0d3524dc31eb6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000043", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000043", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_391fb06814d6b931e7a559b9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000044", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000044", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 380.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_89a6c61557f53b502d6544b9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000045", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000045", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_da433907d2d9a39f10781854" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000046", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000046", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f62785cb84c044a6375531a2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000047", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000047", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bb75e32c4593e9cc4840607f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000061", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000061", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 90.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a025e939f3a01a58a093e3db" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000062", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000062", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a66f27c47073cd07ef8bc67f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000063", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000063", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d64ccb163aaf0e5f4e47400b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000064", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000064", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 280.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_894d7c743bd1ad83a13f021c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000065", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000065", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 950.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bb9d60eb451792cc02b96417" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000066", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000066", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 200.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_30d52b5036d8d8f96ff12b6d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000067", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000067", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 230.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_28152703ecb5220dc534609c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000068", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000068", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 660.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5cb93fd4c45063c3e0510f0f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000069", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000069", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_aa5b497e9b8a2c06a1829d83" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000070", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000070", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 450.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cb28a89996b362bd81820761" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000071", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000071", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 170.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0cd74fec8ba7d50f91e7fb99" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000072", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000072", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cf63bf26e67a873784782f6f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000073", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000073", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8f048c093d6bc3aa8b4b2dbb" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000074", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000074", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1ce5b371da82187b2f8495e0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000075", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000075", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d41a843bac970a71c5398271" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000076", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000076", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 90.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8e04ea055de845eed7331850" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000077", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000077", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 460.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b369f2beb2f10addc6b75c06" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000078", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000078", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0b7dd3fde8646795172a4eb2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000079", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000079", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 780.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_50b56216c2fb4ba049b25602" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000080", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000080", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5b595d3a56ad7585fa9c4d30" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000081", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000081", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_23f9f9e2cad54edd7b8b3083" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000082", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000082", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 260.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cdad52ef8c62e757ae6030c2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000083", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000083", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 210.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0244565e46eb9478cc15fb60" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000084", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000084", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 460.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_55ecd3c4a82991ba8aa48f99" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000085", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000085", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 670.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_420c0277de8e1beebd52ed4a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000086", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000086", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8801b5ee84d7cbae14cfff37" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000087", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000087", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_da23ca3cca598c75d1e49267" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000088", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000088", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2c496f3cd4f471c1c670acd0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000089", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000089", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 260.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_96e84ac0e28846ae3fdc0135" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000090", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000090", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_66f7269a44c19562af010155" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000091", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000091", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 620.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ff5919aa5afa61c5ff2a889a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000092", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000092", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0c7e3f5dbef6397c5de877da" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000093", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000093", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 560.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c4a848e7db85ee455f6a5f22" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000094", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000094", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 750.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_84479fec4bb2e7ed859f3d5b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000095", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000095", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 230.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_208162879ff17072dc8cba9f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000096", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000096", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 860.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_78a18f2c825fb481a55c6d4e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000098", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000098", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_80575fe1952f28054216dec0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000099", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000099", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 360.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3bdaebbfe7613a64768750d8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000102", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000102", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1620.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_93c03b0a7ae53bee74156600" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000103", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000103", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bd7f347243f5171e4db73856" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000105", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000105", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0de16b3857b31381dc705f8f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000106", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000106", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b970d90f10bfe01f5f780062" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000107", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000107", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_aa03f59f56bdcb88c0a989b9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000108", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000108", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_73cfb252f8499e5b90d123ae" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000109", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000109", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b387e7f9798fc2a7181e7a93" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000110", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000110", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 390.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ef90f8f456442f546946d5eb" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000111", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000111", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1550.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d3e9a673dd370dfef38b5089" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000112", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000112", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_fe30b4f4acaeba6af0df8f75" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000113", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000113", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2076e281d71d5b124691ae4f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000114", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000114", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_87bab673ab75bb82ba03f14d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000115", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000115", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 470.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c7180cd30bfba2ebfde9e7cd" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000116", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000116", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 620.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e06c9772454f40f434d405fc" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000117", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000117", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4813f08db0c5e0b5f8cd8845" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000118", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000118", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f31912da01d56e986ee451c5" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000119", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000119", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8272144124f54e9549e2d5da" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000120", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000120", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c5d2b4af70fb5189c641fa97" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000121", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000121", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1f69acd4c7cf743d72362234" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000122", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000122", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d4504791d3de90c9b178778b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000123", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000123", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c4efd155e256447f4e70dbc0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000124", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000124", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 240.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6ea1e924974fcd3264349647" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000125", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000125", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3b023a87aa2e5a0a096a819c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000126", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000126", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7d41d89612b1695b6ad94082" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000127", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000127", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7c62880a4ff006d308d277ad" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000128", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000128", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_9956e8cba78e3e60c7d72d18" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000129", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000129", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7c237422593b271a1c31fd63" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000130", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000130", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c66c8aa42acf4d0d72d27ba9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000131", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000131", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 260.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_88420f606a45f16286d82c0e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000132", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000132", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_80438bcff2ffea779b4698a8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000133", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000133", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 90.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_91a8a6c161ee97659b839774" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000134", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000134", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_30bf1e4e8c04fca9edfa2745" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000135", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000135", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6fe84e1efcbe3126afed46e8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000136", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000136", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6656b5782af49d2d8901a78f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000137", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000137", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d7d6e9b750ef533f9a6ad6e1" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000138", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000138", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4f39bde59fb1046820af000f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000139", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000139", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_667ddecc936d0d5ce7dc6441" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000140", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000140", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_87d46a4e088184fe3eb2ba7b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000141", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000141", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7a63134b3c1877b77130916a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000142", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000142", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b14687da99e3f7c4dc7bbbe8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000143", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000143", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ce36cccb15204f2bdfe704b8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000144", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000144", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bbee87ee1b315b82c32c1148" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000145", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000145", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_323973a59031db9b0055aa6e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000146", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000146", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d96ddd55e46b119a150b6f26" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000147", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000147", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 90.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bfc1422800b68f12d31fd16c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000148", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000148", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_50224863e9956f5fb9af0011" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000149", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000149", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a03ae4ef1d2694e2a3f1c660" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000170", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000170", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d0f1a811da3b3510bf1fc352" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000171", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000171", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_222524dad3ca431e50f4bd4c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000172", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000172", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_47f0529012f1ca5310fc51ea" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000173", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000173", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_850d73814cc775bc4bbdcb30" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000174", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000174", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_45d3a72f42318ec9cb9ed2d4" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000175", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000175", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b2ecad9a9928b6e68d8d648c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000176", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000176", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8db671f6409e7300cbe9a596" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000177", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000177", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 270.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_20e7e716227a99296f379370" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000178", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000178", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 610.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b9cbc2276e530ca163349201" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000179", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000179", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 990.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ad328cb51577a2ce689b8c75" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000180", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000180", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 490.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4aea4515f129578d05d8cc49" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000181", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000181", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 420.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ddae2303bc5799a467bc93b8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000192", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000192", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_152a16fde73a87b39626b93b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000193", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000193", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a67c4bf1a63d3614f2186d4f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000194", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000194", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 420.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_af0c28fa1f7461a19557e499" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000195", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000195", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a810486bc07a9dca2fdb5b74" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000196", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000196", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f9fe1b48c124f5805165e9bf" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000197", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000197", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7c6889bdd883c8dc927f7187" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000198", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000198", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ed1f6a0c465b66c07b164bb2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000199", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000199", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_481f2e349e13998d6ad6e8de" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000200", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000200", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 200.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_fbbf96111533ff42848981ea" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000202", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000202", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c394d3bb293db8643fd72e9c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000203", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000203", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_af490bfceef8d4e09f40af7e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000207", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000207", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4550.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_1966dde645f526e941e31474" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000208", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000208", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bd80f085fceb62984ee4014a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000209", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000209", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1870.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4716a8ae271f26bff4a727ff" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000210", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000210", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1070.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_06142c94be2107ecb939b745" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000211", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000211", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0e5d716a75281c640301e674" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000212", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000212", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ca0f01faf632f8e582fd5785" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000213", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000213", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 120.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_467fcb1934215fc8989673d6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000214", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000214", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 540.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_b17ccc96ed47150a95f40498" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000215", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000215", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1280.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e9a3e0f9254ad0d0c962784e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000216", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000216", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2170.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_086e9ccbbd80b5f8989b9512" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000217", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000217", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 830.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e721088e867e886637cb1646" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000218", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000218", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_53525eac306212003da6ab3a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000219", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000219", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_790f05f75fb5280ce0c92c9c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000220", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000220", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a6af4a4abc25549aa638766d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000221", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000221", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1010.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_835af407f7f3eed132ba9d09" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000222", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000222", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 450.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8bf675812fc8306f275448bb" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000223", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000223", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f72746d645e727a344b7b0e8" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000224", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000224", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 310.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_77a7d1b5f649f39ea93e76a3" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000225", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000225", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1360.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7a5297aeee0937ce561c6fe7" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000226", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000226", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0b9eca992405c0ec2500af90" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000227", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000227", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 840.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0a6409e53519a1cbb592f1af" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000228", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000228", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 450.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6b203a8fc27aa93dbdae260d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000229", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000229", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_44257e2c2daf223a3caf3916" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000234", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000234", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 380.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e9b8cd963b77f7f47a593170" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000235", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000235", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 130.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a42d1cdda4b1904d2a7fd9b6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000236", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000236", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_99d01858b1de011345af9ad6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000237", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000237", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f3fef4aae254146df24a8358" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000238", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000238", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 230.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f11a2d8b20f93e023a14b27c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000239", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000239", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5e487b9487d22eefe2594d44" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000240", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000240", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1420.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_720955aa110fd7090463dc94" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000241", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000241", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 740.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_988c729f52bbb982ae945b58" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000242", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000242", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 870.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4d75144044bf5ee63fa33118" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000243", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000243", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_881e9ab794348a71902cfdb9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000244", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000244", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_144f8cec242fcea5045d6f49" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E07000245", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E07000245", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 200.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_85ce87a66da38d8d0dad6646" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000001", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cff1528d02b4712cf7fa0545" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000002", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 180.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a04d9f338fda5d11b4e060e6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000003", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3647e1b0987e6b858ac6a9ee" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000004", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 80.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6c20873c8caba4b796d669ad" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000005", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_6d95ba210e87d2126f551fae" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000006", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 110.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_250c39dc2665dbbe7cf525bc" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000007", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000007", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 230.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2772f5418b01fea2ede6c4f0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000008", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_25e6e8e6f08926b858650b30" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000009", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1070.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f51ccc79441b0caeadc6a40e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000010", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_cd9476877c84e9e434ba8229" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000011", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 20.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8e0321574e703b71eaa5819c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000012", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 150.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a7de5790c7263208f6bd19d3" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000013", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_75ce8b1860c95ac4e52bd983" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000014", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 290.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4652974a713e189b13bd7228" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000015", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 290.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_04a9dc4e3a5359d3efaf823e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000016", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ca6a1a8a837ae2061bc3971c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000017", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000017", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_4aa681713bbe661d5454452b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000018", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 70.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c8d5d401a17cd0c432a0cf8a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000019", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bed1698f9222228bfada5855" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000021", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2628875d4600b104387a4f74" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000022", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8147a4db7938c64d76ebca0b" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000023", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_154a6c95e807fecc6aa83259" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000024", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_de29a79c9da09a386d6978ee" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000025", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000025", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 940.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_23807c67551eaa7d289f4d9f" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000026", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000026", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_480a69de8abc5812242b1e45" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000027", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000027", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 140.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3e678ba6c2e50194fcd532b2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000028", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000028", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_5797e4dc5b0422ea23fcf907" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000029", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000029", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 490.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_74a4434fbe0def7fc6b8c700" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000030", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000030", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2d7fd010e4962bcd12eeb5e7" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000031", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000031", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 130.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_00fa60f31f686371a74c50b6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000032", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000032", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 330.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0126f1c7a86482b11a40f1ab" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000033", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000033", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 60.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_66815b5c8d259c3a2c14b081" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000034", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000034", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 170.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ff27251ecb95bb2305aaaeba" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000035", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000035", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 760.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_a59f3002e067d407d39a1327" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000036", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000036", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 100.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_3f02e0de60eeb1b5c308df53" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E08000037", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E08000037", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f36661e8e4aa9dce68f269c5" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000001", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000001", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 310.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_f885bbd3fc2e9187583f0f0d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000002", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000002", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 10.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7b056575b5ed79e12a1a1aa5" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000003", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000003", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4320.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_2af1af3eb8ef85e07bd09381" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000004", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000004", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_940140201dc5c2a6b3f5b7cb" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000005", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000005", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 250.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0e352e4078f30f0142743e40" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000006", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000006", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1750.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_49858726629af46d90820935" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000007", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000007", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 4940.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_16dd9cb03182dc17d00a02aa" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000008", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000008", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 660.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_27fab65a248c72e9b5473ecd" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000009", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000009", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1060.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_66a0353a7f9e9742db80124d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000010", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000010", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1020.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ee710be7c17550bfd35745e9" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000011", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000011", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 350.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c7d974252dbe55594045f23a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000012", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000012", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 50.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7613d6960c0db1904e23feba" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000013", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000013", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 2940.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7eba591f6c01a6a318f414ce" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000014", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000014", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 770.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_33bbe9764e86cabd5d210621" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000015", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000015", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1330.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e85ee04edc3a1218da54577a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000016", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000016", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 380.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_8778501a855d304f585edea2" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000017", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000017", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 490.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_807437c79da00be9ef66b9bd" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000018", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000018", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1030.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_aa80644a2cca4b9131101768" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000019", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000019", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 960.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_77ec08a7b6fcd64078e24eac" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000020", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000020", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 15480.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_fa55a5cb431bc37733bba329" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000021", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000021", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1070.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_d001d6c822cc9228890aed7a" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000022", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000022", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1180.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c3f72c9f1de1efc26ecfc110" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000023", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000023", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_ecaba7d2b63734f1fbfaecc6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000024", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000024", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 1850.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_856353f342839d8a1988e6c6" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000025", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000025", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 40.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_bd6d01fea499aca84ee13b19" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000026", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000026", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 220.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_0c115519e82fed9f70f0fae7" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000027", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000027", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3660.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_7a6b5f0b38d6a42fd8850b92" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000028", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000028", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 830.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e4e7c3d173597d50f29ffd0d" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000029", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000029", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 290.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_28fcbce1ed54cf3781b41b4c" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000030", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000030", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 780.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_857bfdf49cc2d289ff480de0" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000031", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000031", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 30.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_c4c0a01cc0fd716cfd88af7e" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000032", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000032", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 3050.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_e80332648e07a872a2fec694" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@E09000033", "target_id": "voa.council_tax_stock.by_area.band_h", "geography_level": "local_authority", "geography_id": "E09000033", - "status": "active", + "status": "signed_deferred", "matched_fact_count_overall": 1, "matched_fact_count_at_or_before_period": 1, - "resolved_period": 2025, - "resolved_value": 17190.0, - "resolved_fact_period": "2025", - "resolved_fact_key": "ledger_aggregate_fact_v2_74b158942bc15a8204c32939" + "signed_reason_id": "council_tax_band_h_spine_support_absent", + "signed_rationale": "Spine-m carries 170 band-H households from 49 raw FRS households (London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, South West 3, East of England 3, East Midlands 1). At the ruled K=10, 84 of 296 authorities draw no band-H household, so the family cannot bind at local-authority grain until a spine vintage carries broader band-H support (microcosm#762 A14)." }, { "name": "voa.council_tax_stock.by_area.band_h@N09000001", 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 21e6ef11b..18b600daa 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 @@ -26399,35 +26399,6 @@ "uprating_from_period": "2023", "uprating_to_period": 2025 }, - { - "name": "hmrc.self_employment_income.amount@E09000001", - "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" - ], - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "hmrc/self_employment_income/amount", - "family": "hmrc", - "period": 2025, - "metadata": { - "contract_target_id": "hmrc.self_employment_income.amount", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "count_x_mean", - "uprating_from_period": "2023", - "uprating_to_period": 2025 - }, { "name": "hmrc.self_employment_income.amount@E09000002", "ledger_selector": { @@ -52016,31 +51987,6 @@ "uprating_from_period": "2023", "uprating_to_period": 2025 }, - { - "name": "hmrc.self_employment_income.count@E09000001", - "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" - ], - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "hmrc/self_employment_income/count", - "family": "hmrc", - "period": 2025, - "metadata": { - "contract_target_id": "hmrc.self_employment_income.count", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "uprating_from_period": "2023", - "uprating_to_period": 2025 - }, { "name": "hmrc.self_employment_income.count@E09000002", "ledger_selector": { @@ -80885,35 +80831,6 @@ "uprating_from_period": "2023", "uprating_to_period": 2025 }, - { - "name": "hmrc.employment_income.amount@E09000001", - "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" - ], - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "hmrc/employment_income/amount", - "family": "hmrc", - "period": 2025, - "metadata": { - "contract_target_id": "hmrc.employment_income.amount", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "count_x_mean", - "uprating_from_period": "2023", - "uprating_to_period": 2025 - }, { "name": "hmrc.employment_income.amount@E09000002", "ledger_selector": { @@ -106502,31 +106419,6 @@ "uprating_from_period": "2023", "uprating_to_period": 2025 }, - { - "name": "hmrc.employment_income.count@E09000001", - "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" - ], - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "hmrc/employment_income/count", - "family": "hmrc", - "period": 2025, - "metadata": { - "contract_target_id": "hmrc.employment_income.count", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "uprating_from_period": "2023", - "uprating_to_period": 2025 - }, { "name": "hmrc.employment_income.count@E09000002", "ledger_selector": { @@ -124330,28 +124222,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.0_10@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_0_10.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/0_10", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.0_10", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.0_10@E06000054", "ledger_selector": { @@ -129038,28 +128908,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.0_10@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_0_10.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/0_10", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.0_10", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.0_10@E09000002", "ledger_selector": { @@ -146572,28 +146420,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.10_20@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_10_20.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/10_20", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.10_20", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.10_20@E06000054", "ledger_selector": { @@ -151280,28 +151106,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.10_20@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_10_20.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/10_20", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.10_20", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.10_20@E09000002", "ledger_selector": { @@ -168814,28 +168618,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.20_30@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_20_30.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/20_30", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.20_30", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.20_30@E06000054", "ledger_selector": { @@ -173522,28 +173304,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.20_30@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_20_30.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/20_30", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.20_30", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.20_30@E09000002", "ledger_selector": { @@ -191056,28 +190816,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.30_40@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_30_40.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/30_40", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.30_40", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.30_40@E06000054", "ledger_selector": { @@ -195764,28 +195502,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.30_40@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_30_40.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/30_40", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.30_40", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.30_40@E09000002", "ledger_selector": { @@ -213298,28 +213014,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.40_50@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_40_50.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/40_50", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.40_50", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.40_50@E06000054", "ledger_selector": { @@ -218006,28 +217700,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.40_50@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_40_50.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/40_50", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.40_50", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.40_50@E09000002", "ledger_selector": { @@ -235540,28 +235212,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.50_60@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_50_60.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/50_60", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.50_60", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.50_60@E06000054", "ledger_selector": { @@ -240248,28 +239898,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.50_60@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_50_60.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/50_60", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.50_60", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.50_60@E09000002", "ledger_selector": { @@ -257782,28 +257410,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.60_70@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_60_70.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/60_70", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.60_70", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.60_70@E06000054", "ledger_selector": { @@ -262490,28 +262096,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.60_70@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_60_70.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/60_70", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.60_70", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.60_70@E09000002", "ledger_selector": { @@ -280024,28 +279608,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.70_80@E06000053", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_70_80.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "person", - "measure": "age/70_80", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.70_80", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.70_80@E06000054", "ledger_selector": { @@ -284732,28 +284294,6 @@ "uprating_from_period": "2024", "uprating_to_period": 2025 }, - { - "name": "ons.age.70_80@E09000001", - "ledger_selector": { - "source_measure_id": "population", - "record_set_spec_id": "uk.local_geography.population.age_70_80.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "person", - "measure": "age/70_80", - "family": "ons_population", - "period": 2025, - "metadata": { - "contract_target_id": "ons.age.70_80", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2024", - "uprating_to_period": 2025 - }, { "name": "ons.age.70_80@E09000002", "ledger_selector": { @@ -303913,31 +303453,6 @@ "uprating_from_period": "2025-05", "uprating_to_period": 2025 }, - { - "name": "dwp.uc.households_by_area@E06000053", - "ledger_selector": { - "source_name": "dwp", - "source_measure_id": "universal_credit_households", - "record_set_spec_id": [ - "uk.local_geography.uc_households.by_constituency.v1", - "uk.local_geography.uc_households.by_local_authority.v1" - ], - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "benunit", - "measure": "uc_households", - "family": "dwp_universal_credit", - "period": 2025, - "metadata": { - "contract_target_id": "dwp.uc.households_by_area", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "uprating_from_period": "2025-05", - "uprating_to_period": 2025 - }, { "name": "dwp.uc.households_by_area@E06000054", "ledger_selector": { @@ -309263,31 +308778,6 @@ "uprating_from_period": "2025-05", "uprating_to_period": 2025 }, - { - "name": "dwp.uc.households_by_area@E09000001", - "ledger_selector": { - "source_name": "dwp", - "source_measure_id": "universal_credit_households", - "record_set_spec_id": [ - "uk.local_geography.uc_households.by_constituency.v1", - "uk.local_geography.uc_households.by_local_authority.v1" - ], - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "benunit", - "measure": "uc_households", - "family": "dwp_universal_credit", - "period": 2025, - "metadata": { - "contract_target_id": "dwp.uc.households_by_area", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "uprating_from_period": "2025-05", - "uprating_to_period": 2025 - }, { "name": "dwp.uc.households_by_area@E09000002", "ledger_selector": { @@ -368715,27 +368205,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.owned_outright@E06000053", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.owned_outright.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "tenure/owned_outright", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.owned_outright", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.owned_outright@E06000054", "ledger_selector": { @@ -373209,27 +372678,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.owned_outright@E09000001", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.owned_outright.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "tenure/owned_outright", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.owned_outright", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.owned_outright@E09000002", "ledger_selector": { @@ -376296,27 +375744,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.owned_mortgage@E06000053", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.owned_mortgage.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "tenure/owned_mortgage", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.owned_mortgage", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.owned_mortgage@E06000054", "ledger_selector": { @@ -380790,27 +380217,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.owned_mortgage@E09000001", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.owned_mortgage.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "tenure/owned_mortgage", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.owned_mortgage", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.owned_mortgage@E09000002", "ledger_selector": { @@ -383926,28 +383332,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.private_rent@E06000053", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.private_rent.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "tenure/private_rent", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.private_rent", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.private_rent@E06000054", "ledger_selector": { @@ -388634,28 +388018,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.private_rent@E09000001", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.private_rent.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "tenure/private_rent", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.private_rent", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.private_rent@E09000002", "ledger_selector": { @@ -391868,28 +391230,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.social_rent@E06000053", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.social_rent.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "tenure/social_rent", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.social_rent", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "value_operation": "sum", - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.social_rent@E06000054", "ledger_selector": { @@ -396576,28 +395916,6 @@ "uprating_from_period": "2021", "uprating_to_period": 2025 }, - { - "name": "ons.tenure.social_rent@E09000001", - "ledger_selector": { - "source_measure_id": "households", - "record_set_spec_id": "uk.local_geography.tenure.social_rent.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "tenure/social_rent", - "family": "ons_housing", - "period": 2025, - "metadata": { - "contract_target_id": "ons.tenure.social_rent", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "value_operation": "sum", - "uprating_from_period": "2021", - "uprating_to_period": 2025 - }, { "name": "ons.tenure.social_rent@E09000002", "ledger_selector": { @@ -399712,26 +399030,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_a@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_a", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_a", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_a", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_a@E06000054", "ledger_selector": { @@ -405612,26 +404910,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_b@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_b@E06000054", "ledger_selector": { @@ -409892,26 +409170,6 @@ "geography_id": "E08000037" } }, - { - "name": "voa.council_tax_stock.by_area.band_b@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_b", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_b", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_b", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, { "name": "voa.council_tax_stock.by_area.band_b@E09000002", "ledger_selector": { @@ -411532,26 +410790,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_c@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_c@E06000054", "ledger_selector": { @@ -415812,26 +415050,6 @@ "geography_id": "E08000037" } }, - { - "name": "voa.council_tax_stock.by_area.band_c@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_c", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_c", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_c", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, { "name": "voa.council_tax_stock.by_area.band_c@E09000002", "ledger_selector": { @@ -417452,26 +416670,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_d@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_d@E06000054", "ledger_selector": { @@ -421732,26 +420930,6 @@ "geography_id": "E08000037" } }, - { - "name": "voa.council_tax_stock.by_area.band_d@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_d", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_d", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_d", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, { "name": "voa.council_tax_stock.by_area.band_d@E09000002", "ledger_selector": { @@ -423372,26 +422550,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_e@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_e@E06000054", "ledger_selector": { @@ -427652,26 +426810,6 @@ "geography_id": "E08000037" } }, - { - "name": "voa.council_tax_stock.by_area.band_e@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_e", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_e", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_e", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, { "name": "voa.council_tax_stock.by_area.band_e@E09000002", "ledger_selector": { @@ -429292,26 +428430,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_f@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_f@E06000054", "ledger_selector": { @@ -433572,26 +432690,6 @@ "geography_id": "E08000037" } }, - { - "name": "voa.council_tax_stock.by_area.band_f@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_f", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_f", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_f", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, { "name": "voa.council_tax_stock.by_area.band_f@E09000002", "ledger_selector": { @@ -435212,26 +434310,6 @@ "geography_id": "E06000052" } }, - { - "name": "voa.council_tax_stock.by_area.band_g@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, { "name": "voa.council_tax_stock.by_area.band_g@E06000054", "ledger_selector": { @@ -439492,26 +438570,6 @@ "geography_id": "E08000037" } }, - { - "name": "voa.council_tax_stock.by_area.band_g@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_g", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_g", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_g", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, { "name": "voa.council_tax_stock.by_area.band_g@E09000002", "ledger_selector": { @@ -440151,5926 +439209,6 @@ "geography_level": "local_authority", "geography_id": "E09000033" } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000001" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000002" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000003" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000004" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000005" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000006" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000007", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000007" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000007" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000008" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000009" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000010" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000011" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000012" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000013" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000014" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000015" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000016" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000017", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000017" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000017" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000018" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000019" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000020" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000021" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000022" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000023" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000024" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000024" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000025", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000025" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000025" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000026", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000026" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000026" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000027", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000027" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000027" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000030", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000030" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000030" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000031", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000031" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000031" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000032", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000032" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000032" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000033", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000033" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000033" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000034", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000034" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000034" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000035", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000035" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000035" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000036", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000036" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000036" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000037", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000037" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000037" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000038", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000038" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000038" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000039", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000039" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000039" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000040", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000040" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000040" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000041", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000041" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000041" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000042", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000042" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000042" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000043", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000043" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000043" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000044", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000044" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000044" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000045", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000045" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000045" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000046", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000046" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000046" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000047", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000047" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000047" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000049", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000049" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000049" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000050", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000050" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000050" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000051", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000051" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000051" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000052", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000052" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000052" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000053", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000053" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000053" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000054", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000054" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000054" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000055", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000055" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000055" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000056", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000056" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000056" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000057", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000057" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000057" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000058", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000058" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000058" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000059", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000059" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000059" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000060", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000060" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000060" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000061", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000061" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000061" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000062", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000062" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000062" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000063", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000063" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000063" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000064", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000064" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000064" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000065", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000065" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000065" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E06000066", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E06000066" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E06000066" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000008" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000009" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000010" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000011" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000012" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000032", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000032" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000032" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000033", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000033" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000033" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000034", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000034" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000034" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000035", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000035" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000035" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000036", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000036" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000036" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000037", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000037" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000037" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000038", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000038" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000038" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000039", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000039" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000039" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000040", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000040" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000040" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000041", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000041" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000041" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000042", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000042" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000042" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000043", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000043" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000043" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000044", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000044" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000044" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000045", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000045" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000045" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000046", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000046" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000046" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000047", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000047" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000047" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000061", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000061" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000061" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000062", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000062" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000062" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000063", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000063" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000063" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000064", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000064" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000064" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000065", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000065" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000065" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000066", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000066" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000066" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000067", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000067" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000067" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000068", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000068" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000068" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000069", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000069" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000069" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000070", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000070" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000070" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000071", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000071" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000071" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000072", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000072" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000072" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000073", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000073" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000073" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000074", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000074" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000074" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000075", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000075" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000075" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000076", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000076" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000076" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000077", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000077" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000077" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000078", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000078" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000078" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000079", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000079" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000079" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000080", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000080" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000080" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000081", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000081" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000081" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000082", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000082" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000082" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000083", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000083" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000083" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000084", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000084" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000084" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000085", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000085" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000085" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000086", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000086" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000086" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000087", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000087" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000087" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000088", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000088" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000088" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000089", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000089" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000089" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000090", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000090" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000090" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000091", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000091" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000091" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000092", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000092" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000092" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000093", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000093" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000093" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000094", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000094" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000094" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000095", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000095" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000095" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000096", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000096" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000096" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000098", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000098" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000098" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000099", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000099" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000099" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000102", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000102" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000102" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000103", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000103" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000103" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000105", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000105" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000105" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000106", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000106" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000106" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000107", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000107" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000107" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000108", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000108" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000108" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000109", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000109" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000109" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000110", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000110" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000110" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000111", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000111" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000111" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000112", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000112" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000112" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000113", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000113" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000113" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000114", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000114" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000114" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000115", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000115" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000115" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000116", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000116" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000116" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000117", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000117" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000117" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000118", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000118" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000118" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000119", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000119" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000119" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000120", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000120" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000120" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000121", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000121" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000121" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000122", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000122" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000122" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000123", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000123" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000123" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000124", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000124" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000124" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000125", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000125" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000125" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000126", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000126" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000126" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000127", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000127" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000127" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000128", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000128" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000128" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000129", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000129" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000129" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000130", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000130" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000130" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000131", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000131" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000131" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000132", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000132" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000132" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000133", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000133" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000133" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000134", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000134" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000134" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000135", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000135" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000135" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000136", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000136" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000136" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000137", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000137" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000137" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000138", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000138" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000138" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000139", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000139" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000139" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000140", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000140" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000140" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000141", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000141" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000141" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000142", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000142" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000142" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000143", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000143" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000143" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000144", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000144" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000144" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000145", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000145" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000145" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000146", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000146" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000146" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000147", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000147" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000147" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000148", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000148" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000148" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000149", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000149" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000149" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000170", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000170" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000170" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000171", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000171" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000171" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000172", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000172" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000172" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000173", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000173" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000173" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000174", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000174" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000174" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000175", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000175" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000175" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000176", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000176" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000176" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000177", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000177" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000177" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000178", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000178" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000178" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000179", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000179" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000179" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000180", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000180" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000180" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000181", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000181" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000181" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000192", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000192" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000192" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000193", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000193" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000193" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000194", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000194" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000194" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000195", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000195" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000195" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000196", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000196" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000196" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000197", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000197" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000197" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000198", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000198" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000198" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000199", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000199" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000199" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000200", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000200" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000200" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000202", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000202" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000202" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000203", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000203" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000203" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000207", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000207" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000207" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000208", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000208" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000208" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000209", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000209" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000209" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000210", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000210" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000210" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000211", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000211" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000211" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000212", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000212" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000212" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000213", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000213" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000213" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000214", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000214" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000214" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000215", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000215" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000215" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000216", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000216" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000216" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000217", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000217" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000217" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000218", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000218" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000218" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000219", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000219" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000219" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000220", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000220" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000220" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000221", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000221" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000221" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000222", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000222" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000222" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000223", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000223" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000223" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000224", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000224" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000224" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000225", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000225" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000225" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000226", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000226" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000226" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000227", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000227" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000227" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000228", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000228" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000228" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000229", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000229" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000229" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000234", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000234" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000234" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000235", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000235" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000235" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000236", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000236" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000236" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000237", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000237" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000237" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000238", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000238" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000238" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000239", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000239" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000239" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000240", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000240" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000240" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000241", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000241" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000241" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000242", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000242" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000242" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000243", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000243" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000243" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000244", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000244" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000244" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E07000245", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E07000245" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E07000245" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000001" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000002" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000003" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000004" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000005" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000006" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000007", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000007" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000007" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000008" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000009" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000010" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000011" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000012" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000013" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000014" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000015" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000016" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000017", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000017" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000017" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000018" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000019" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000021" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000022" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000023" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000024" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000024" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000025", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000025" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000025" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000026", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000026" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000026" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000027", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000027" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000027" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000028", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000028" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000028" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000029", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000029" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000029" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000030", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000030" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000030" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000031", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000031" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000031" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000032", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000032" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000032" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000033", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000033" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000033" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000034", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000034" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000034" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000035", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000035" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000035" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000036", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000036" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000036" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E08000037", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E08000037" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E08000037" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000001", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000001" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000001" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000002", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000002" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000002" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000003", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000003" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000003" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000004", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000004" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000004" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000005", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000005" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000005" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000006", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000006" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000006" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000007", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000007" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000007" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000008", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000008" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000008" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000009", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000009" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000009" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000010", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000010" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000010" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000011", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000011" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000011" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000012", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000012" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000012" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000013", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000013" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000013" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000014", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000014" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000014" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000015", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000015" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000015" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000016", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000016" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000016" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000017", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000017" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000017" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000018", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000018" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000018" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000019", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000019" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000019" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000020", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000020" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000020" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000021", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000021" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000021" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000022", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000022" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000022" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000023", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000023" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000023" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000024", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000024" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000024" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000025", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000025" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000025" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000026", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000026" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000026" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000027", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000027" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000027" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000028", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000028" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000028" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000029", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000029" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000029" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000030", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000030" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000030" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000031", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000031" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000031" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000032", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000032" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000032" - } - }, - { - "name": "voa.council_tax_stock.by_area.band_h@E09000033", - "ledger_selector": { - "source_name": "voa", - "source_measure_id": "band_h", - "record_set_spec_id": "uk.local_geography.council_tax_stock.by_local_authority.v1", - "geography_level": "local_authority", - "geography_id": "E09000033" - }, - "entity": "household", - "measure": "council_tax/band_h", - "family": "council_tax_stock", - "period": 2025, - "metadata": { - "contract_target_id": "voa.council_tax_stock.by_area.band_h", - "measure_kind": "prepared_column", - "geography_level": "local_authority", - "geography_id": "E09000033" - } } ] } 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 36687c026..0154cd900 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 @@ -724,7 +724,7 @@ "source_commit": "33ca98a", "source_repo": "PolicyEngine/chronicle" }, - "notes": "The pinned feed record-set spec uk.local_geography.council_tax_stock.by_local_authority.v1 supplies 2,541 locally compilable band cells. After the A13 cross-grain ruling, 2,367 English cells bind: bands B-H cover all 296 English crosswalk authorities and band A covers 295 because E09000001 is suppressed. All 176 Welsh A-H cells are signed deferred because the feed has no Wales country-level stock-by-band parent control; 174 have local facts and the two Band H cells 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 521 excluded cells are signed deferrals. The feed has no comparable 2025 LA net series across the roster, so council_tax/net is not declared.", + "notes": "The pinned feed record-set spec uk.local_geography.council_tax_stock.by_local_authority.v1 supplies 2,541 locally compilable band cells. After the A13 and A14 rulings, 2,058 English cells bind: bands A-G each cover 294 authorities after E06000053 and E09000001 are support-floor excluded (E09000001 Band A was already suppressed), and the entire 296-cell English Band H family is signed deferred because 84 authorities lack Band H support at K=10. All 176 Welsh A-H cells are signed deferred because the feed has no Wales country-level stock-by-band parent control; 174 have local facts and the two Band H cells 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 830 excluded cells are signed deferrals. The feed has no comparable 2025 LA net series across the roster, so council_tax/net is not declared.", "product": "Council Tax stock of properties, 2025: local-authority counts by valuation band.", "publisher": "Valuation Office Agency", "source_id": "voa_council_tax_stock_la", 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 09c0e5baf..f2b1a6a90 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 @@ -470,15 +470,18 @@ "notes": ( "The pinned feed record-set spec " "uk.local_geography.council_tax_stock.by_local_authority.v1 " - "supplies 2,541 locally compilable band cells. After the A13 " - "cross-grain ruling, 2,367 English cells bind: bands B-H cover " - "all 296 English crosswalk authorities and band A covers 295 " - "because E09000001 is suppressed. All 176 Welsh A-H cells are " + "supplies 2,541 locally compilable band cells. After the A13 and " + "A14 rulings, 2,058 English cells bind: bands A-G each cover 294 " + "authorities after E06000053 and E09000001 are support-floor " + "excluded (E09000001 Band A was already suppressed), and the " + "entire 296-cell English Band H family is signed deferred because " + "84 authorities lack Band H support at K=10. All 176 Welsh A-H " + "cells are " "signed deferred because the feed has no Wales country-level " "stock-by-band parent control; 174 have local facts and the two " "Band H cells 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 521 excluded cells are signed " + "11 LGDs use domestic rates; all 830 excluded 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/tests/test_target_reference_authoring.py b/packages/microcosm-build/tests/test_target_reference_authoring.py index 5376d9c53..5b4b04595 100644 --- a/packages/microcosm-build/tests/test_target_reference_authoring.py +++ b/packages/microcosm-build/tests/test_target_reference_authoring.py @@ -290,8 +290,8 @@ def test_generate_uk_local_target_references_cli_refuses_incomplete_contract( encoding="utf-8", ) # The council-tax country masks refuse a local-authority roster that does - # not carry the declared 32 Scottish, 11 Northern Irish, and 22 Welsh - # authorities + # not carry the declared 32 Scottish, 11 Northern Irish, 22 Welsh, and + # 296 English authorities # (covered by test_council_tax_country_masks_refuse_roster_count_drift). # This test is about the *contract* refusal, so give it a roster those # masks accept and let the missing target id be what fails. @@ -304,6 +304,8 @@ def test_generate_uk_local_target_references_cli_refuses_incomplete_contract( "area_ids": [f"S{index:08d}" for index in range(32)] + [f"N{index:08d}" for index in range(11)] + [f"W{index:08d}" for index in range(22)] + + [f"E{index:08d}" for index in range(294)] + + ["E06000053", "E09000001"] }, } } diff --git a/packages/microcosm-build/tests/test_uk_battery_bindings.py b/packages/microcosm-build/tests/test_uk_battery_bindings.py index fec146cb9..d1985291e 100644 --- a/packages/microcosm-build/tests/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/test_uk_battery_bindings.py @@ -1000,14 +1000,14 @@ def test_local_default_target_surface_uses_metric_names_and_signed_deferrals( ) assert result.passed is True - assert result.details["candidate_targets"] == 19_444 + assert result.details["candidate_targets"] == 19_105 assert result.details["reference_targets"] == 22_530 - # 2,075 signed area deferrals from the membership file plus the 1,011 + # 2,414 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) == 2_075 + 1_011 + assert len(exclusions) == 2_414 + 1_011 households = [ name for name in exclusions if str(name).startswith("households@") ] @@ -1081,6 +1081,15 @@ def test_area_support_binding_resolves_register_and_rejects_expired_entry( "local_authority/E09000001", } assert committed.details["excluded_area_count"] == 2 + exclusions = battery_bindings.load_uk_reviewed_exclusion_register( + None, + resource="local_area_support_exclusions.json", + ) + a14_suffix = ( + " Per microcosm#762 A14 the authority's own local-authority cells are " + "signed-deferred (`local_authority_support_floor_excluded`)." + ) + assert all(record.reason.endswith(a14_suffix) for record in exclusions.values()) monkeypatch.setattr( battery_bindings, diff --git a/packages/microcosm-build/tests/test_uk_council_tax_targets.py b/packages/microcosm-build/tests/test_uk_council_tax_targets.py index fae6ee623..48fad6f47 100644 --- a/packages/microcosm-build/tests/test_uk_council_tax_targets.py +++ b/packages/microcosm-build/tests/test_uk_council_tax_targets.py @@ -29,14 +29,14 @@ def _membership() -> dict: def test_council_tax_band_cells_activate_and_defer_as_measured() -> None: membership = _membership() expected_active = { - "a": 295, - "b": 296, - "c": 296, - "d": 296, - "e": 296, - "f": 296, - "g": 296, - "h": 296, + "a": 294, + "b": 294, + "c": 294, + "d": 294, + "e": 294, + "f": 294, + "g": 294, + "h": 0, } for band, active_count in expected_active.items(): target_id = f"voa.council_tax_stock.by_area.band_{band}" @@ -82,10 +82,22 @@ def test_council_tax_signed_deferrals_pin_exact_gaps() -> None: "no Wales country-level council-tax stock-by-band fact" in row["rationale"] for row in wales } == {True} + band_h = by_reason["council_tax_band_h_spine_support_absent"] + expected_english = tuple( + area_id + for area_id in _crosswalk()["levels"]["local_authority"]["area_ids"] + if area_id.startswith("E") + ) + assert len(band_h) == 1 + assert tuple(band_h[0]["area_ids"]) == expected_english + assert len(expected_english) == 296 + assert band_h[0]["defer_if_compiles"] is True + assert "170 band-H households from 49 raw FRS households" in band_h[0]["rationale"] + assert "84 of 296 authorities" in band_h[0]["rationale"] assert "council_tax_wales_band_h_absent" not in by_reason -def test_council_tax_activation_adds_2367_references() -> None: +def test_council_tax_activation_adds_2058_references() -> None: membership = _membership() active = 0 for band in "abcdefgh": @@ -94,13 +106,69 @@ def test_council_tax_activation_adds_2367_references() -> None: "local_authority" ]["candidates"] active += sum(row["status"] == "active" for row in candidates) - assert active == 2_367 + assert active == 2_058 + + +def test_support_floor_deferrals_cover_the_two_authorities_remaining_cells() -> None: + rows = [ + row + for row in _membership()["signed_deferrals"] + if row["reason_id"] == "local_authority_support_floor_excluded" + ] + assert len(rows) == 24 + assert sum(len(row["area_ids"]) for row in rows) == 43 + assert { + area_id: sum(area_id in row["area_ids"] for row in rows) + for area_id in ("E06000053", "E09000001") + } == {"E06000053": 20, "E09000001": 23} + assert all(row["defer_if_compiles"] is True for row in rows) + assert all(not row["target_id"].endswith("band_h") for row in rows) + assert { + "their rows stay in the solve through the constituency families and " + "the national rows" in row["rationale"] + for row in rows + } == {True} + + +def test_a14_deferral_declarations_cover_only_currently_active_cells() -> None: + declarations = _area_signed_deferrals(load_uk_population_contract(), _crosswalk()) + band_h = [ + row + for row in declarations + if row.reason_id == "council_tax_band_h_spine_support_absent" + ] + expected_english = tuple( + area_id + for area_id in _crosswalk()["levels"]["local_authority"]["area_ids"] + if area_id.startswith("E") + ) + assert len(band_h) == 1 + assert band_h[0].target_id == "voa.council_tax_stock.by_area.band_h" + assert band_h[0].area_ids == expected_english + assert len(expected_english) == 296 + assert band_h[0].defer_if_compiles is True + + support = [ + row + for row in declarations + if row.reason_id == "local_authority_support_floor_excluded" + ] + assert len(support) == 24 + assert sum(len(row.area_ids) for row in support) == 43 + by_area = { + area_id: sum(area_id in row.area_ids for row in support) + for area_id in ("E06000053", "E09000001") + } + assert by_area == {"E06000053": 20, "E09000001": 23} + assert all(row.defer_if_compiles for row in support) + assert all(not row.target_id.endswith("band_h") for row in support) def test_declared_deferral_roster_matching_no_crosswalk_area_refuses() -> None: crosswalk = copy.deepcopy(_crosswalk()) area_ids = crosswalk["levels"]["local_authority"]["area_ids"] area_ids.remove("E09000001") + area_ids.append("E09999999") with pytest.raises(ValueError, match="unmatched area id.*E09000001"): _area_signed_deferrals(load_uk_population_contract(), crosswalk) @@ -112,6 +180,7 @@ def test_declared_deferral_roster_matching_no_crosswalk_area_refuses() -> None: ("S", 32, "Scottish"), ("N", 11, "Northern Ireland"), ("W", 22, "Welsh"), + ("E", 296, "English"), ], ) def test_council_tax_country_masks_refuse_roster_count_drift( 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 6c9748e3d..9513c271b 100644 --- a/packages/microcosm-build/tests/test_uk_local_target_census.py +++ b/packages/microcosm-build/tests/test_uk_local_target_census.py @@ -161,10 +161,13 @@ def test_council_tax_source_and_fence_pin_measured_coverage() -> None: source = sources["voa_council_tax_stock_la"] assert source["status"] == SOURCE_STATUS_PINNED_IN_LEDGER_FACTS assert "2,541 locally compilable band cells" in source["notes"] - assert "2,367 English cells bind" in source["notes"] + assert "2,058 English cells bind" in source["notes"] + assert "bands A-G each cover 294 authorities" in source["notes"] + assert "entire 296-cell English Band H family is signed deferred" in source["notes"] + assert "84 authorities lack Band H support at K=10" in source["notes"] assert "All 176 Welsh A-H cells are signed deferred" in source["notes"] assert "no Wales country-level stock-by-band parent control" in source["notes"] - assert "all 521 excluded cells are signed deferrals" in source["notes"] + assert "all 830 excluded cells are signed deferrals" in source["notes"] assert "E09000001" in source["notes"] assert "W06000019 and W06000024" in source["notes"] assert "council_tax/net is not declared" in source["notes"] diff --git a/tools/generate_uk_local_target_references.py b/tools/generate_uk_local_target_references.py index f5185786c..633ee985d 100644 --- a/tools/generate_uk_local_target_references.py +++ b/tools/generate_uk_local_target_references.py @@ -177,6 +177,9 @@ def _area_signed_deferrals( scottish_local_authorities = tuple( area_id for area_id in local_authority_ids if area_id[:1] == "S" ) + english_local_authorities = tuple( + area_id for area_id in local_authority_ids if area_id[:1] == "E" + ) welsh_local_authorities = tuple( area_id for area_id in local_authority_ids if area_id[:1] == "W" ) @@ -195,9 +198,15 @@ def _area_signed_deferrals( "Welsh council-tax deferral mask expected 22 crosswalk local " f"authorities; measured {len(welsh_local_authorities)}." ) + if len(english_local_authorities) != 296: + raise ValueError( + "English council-tax Band H deferral mask expected 296 crosswalk " + f"local authorities; measured {len(english_local_authorities)}." + ) council_tax_ni_area_ids = ni_local_authorities council_tax_scotland_area_ids = scottish_local_authorities council_tax_city_band_a_area_ids = ("E09000001",) + support_floor_excluded_area_ids = ("E06000053", "E09000001") pipr_lad_absent_area_ids = ( "E06000053", "E08000016", @@ -211,6 +220,7 @@ def _area_signed_deferrals( ) spi_la_measure_gap_area_ids = ("E06000027", "E06000053") deferrals: list[AreaSignedDeferral] = [] + declared_area_keys: set[tuple[str, str, str]] = set() def add( *, @@ -221,6 +231,7 @@ def add( area_ids: tuple[str, ...], allow_empty: bool = False, defer_if_compiles: bool = False, + skip_declared: bool = False, ) -> None: if target_id not in target_ids: raise ValueError( @@ -228,7 +239,15 @@ def add( "local contract." ) roster = set(areas.get(geography_level, ())) - matched_area_ids = tuple(area_id for area_id in area_ids if area_id in roster) + matched_area_ids = tuple( + area_id + for area_id in area_ids + if area_id in roster + and ( + not skip_declared + or (target_id, geography_level, area_id) not in declared_area_keys + ) + ) if not matched_area_ids: if allow_empty: return @@ -250,6 +269,9 @@ def add( defer_if_compiles=defer_if_compiles, ) ) + declared_area_keys.update( + (target_id, geography_level, area_id) for area_id in matched_area_ids + ) add( target_id="dwp.uc.households_by_area", @@ -353,6 +375,21 @@ def add( area_ids=welsh_local_authorities, defer_if_compiles=True, ) + add( + target_id="voa.council_tax_stock.by_area.band_h", + geography_level="local_authority", + reason_id="council_tax_band_h_spine_support_absent", + rationale=( + "Spine-m carries 170 band-H households from 49 raw FRS households " + "(London 13, Wales 11, South East 8, Scotland 6, West Midlands 4, " + "South West 3, East of England 3, East Midlands 1). At the ruled " + "K=10, 84 of 296 authorities draw no band-H household, so the " + "family cannot bind at local-authority grain until a spine vintage " + "carries broader band-H support (microcosm#762 A14)." + ), + area_ids=english_local_authorities, + defer_if_compiles=True, + ) add( target_id="voa.council_tax_stock.by_area.band_a", geography_level="local_authority", @@ -392,6 +429,28 @@ def add( 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.", area_ids=ni_local_authorities, ) + for target in contract.get("targets", ()): + if "local_authority" not in target.get("geography_levels", ()): + continue + add( + target_id=str(target["target_id"]), + geography_level="local_authority", + reason_id="local_authority_support_floor_excluded", + rationale=( + "E06000053 and E09000001 are reviewed exclusions of the " + "local-authority support floor (uk/local_area_support_" + "exclusions.json, microcosm#762 A4): respectively 7 and 14 " + "positive-weight rows at K=4, and 17 and 49 at K=10. Their own " + "local-authority cells are signed-deferred on the same " + "evidence; their rows stay in the solve through the " + "constituency families and the national rows (A14 amendment " + "to A4)." + ), + area_ids=support_floor_excluded_area_ids, + allow_empty=True, + defer_if_compiles=True, + skip_declared=True, + ) return deferrals diff --git a/tools/score_uk_local_candidate.py b/tools/score_uk_local_candidate.py index 80bf65c55..885ddde7a 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_444 +UK_LOCAL_ACTIVE_REFERENCE_COUNT = 19_105 UK_LOCAL_SCORE_TARGET_PERIOD = 2025 #: The incumbent is scored from published weights, never re-solved, so no #: incumbent holdout exists to place beside the candidate's rotation. From 5fe88d1d055f5d350dd1f36c7d1943976b5b4e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 00:29:14 +0200 Subject: [PATCH 04/26] Receipts R6-R7: Runs U and G at K=10 on spine-m (#762 PR B) Both rules fit the local surface (every family but council tax at or above 99 percent within 10 percent); grain_equal lifts the national rows from 78 to 92 percent within 10 percent and concentrates weight harder (189 versus 12 constituencies below the ESS floor). Both sit on the 100x stretch bound, so A3 is the binding decision; the 20 and 10 measurements follow. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index fb6750276..f77103106 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -94,3 +94,43 @@ Why band H is not a clone-count problem: spine-m carries **170 band-H households | 10 | 192 s / 9.9 GB (10 engine blocks) | 86 | LA: band H × 84, Scilly × 2 | Proposed dispositions (A14, María): K=10 for the first candidate (measured); sign a deferral for the 296 band-H LA cells (`voa.council_tax_stock.by_area.band_h`, spine support 49 raw sources); amend A4 so the two support-excluded authorities' cells are signed-deferred as well (they stay in the solve through the other families' rows; their own cells are unsupported by the exclusion's own evidence). + +## R6 — Run U: f100 at K=10, uniform weighting, no holdout (2026-09-03 00:xx; attempt chained on R5's failed row; disposition failed — artifact written, unreleasable) + +The A14 surface (19,105 register cells + 1,011 ladder rows + 364 national = **20,480 targets × 528,460 households**), engine per clone block, one uniform solve (512 epochs, lr 0.15, cap 10, stretch bound 100). Wall 797 s, peak 9.7 GB. + +| measure | value | +|---|---| +| loss initial → final | 0.2777 → 0.0162 | +| median / max abs relative error | 0.0083 / 16.45 (council-tax band G, one authority) | +| past-cap (all rows) | 17 at init, 1 at final, 16 escaped, 0 pushed out; national rows 0 / 0 | +| realized max weight ratio vs design | **100.0 (on the bound)**; max/positive-median weight 312.5 | +| calibration mass change | 29,247,433 → 28,073,792 (×0.960, free mass) | +| local fit within 10 % / 25 % | age 100 % / 100 % (8,072); census households 99.9 % / 100 % (1,011); HMRC 99.6 % / 99.9 % (4,031); UC 100 % / 100 % (3,508); tenure 99.4 % / 99.9 % (1,436); council tax 86.3 % / 95.2 % (2,058) | +| national fit within 10 % / 25 % | hmrc_spi 83 % / 95 % (129); dwp_universal_credit 90 % / 96 % (95); ons_population 92 % / 96 % (50); obr 48 % / 76 % (21); household composition 29 % / 57 % (7); ons_land 0 % / 33 % (3, corporate land value −681 %) | +| gates | ladder, per_family_fit, weight_ess passed; **area_support FAILED (release-blocking): 12 constituencies with calibrated ESS < 50 (18.3–49.8; pre-calibration K=10 minima 245)**; target_fit diagnostic: 20 cells > 25 %; weight_ratio diagnostic: 312.5 > 100 | +| support-limited misses | constituency 2 failing cells (both in the bottom-ESS decile); LA 102, Spearman −0.25 | +| releasable | false (blocked at f100) | + +Reading: the local surface fits (every family but council tax above 99 % within 10 %), the national families fit as the national line does, and the block is the doctrine's own stretch: a handful of rows in twelve constituencies were pushed to the 100× bound and the Kish ESS of those areas collapsed below María's floor. This is the A3 evidence: the bound the local doctrine inherited (100) is too loose for the support floor it now has to satisfy; the national doctrine binds at 10 and the exact-k ladder at 20. + +## R7 — Run G: f100 at K=10, `grain_equal` weighting, no holdout (2026-09-03 01:xx; chained on R6's row; disposition failed — artifact written, unreleasable) + +Same surface and inputs as R6; the receipted override `target_weight_rule: uniform → grain_equal` (one equal share each for the national rows, the constituency rows and the local-authority rows; uniform within). Wall 830 s, peak 6.6 GB. + +| measure | Run U (uniform) | Run G (grain_equal) | +|---|---|---| +| loss initial → final | 0.2777 → 0.0162 | 0.3198 → 0.0203 | +| median / max abs relative error | 0.0083 / 16.45 | 0.0092 / 1.42 | +| past-cap all rows (init → final, pushed out) | 17 → 1, 0 | 17 → 0, 0 | +| realized max ratio vs design | 100.0 (bound) | 100.0 (bound) | +| max / positive-median weight | 312.5 | 1,014.5 | +| ESS fraction | 0.216 | 0.070 | +| constituencies with calibrated ESS < 50 | **12** | **189** | +| mass factor | 0.960 | 0.973 | +| local within 10 %: age / census hh / HMRC / UC / tenure / council tax | 100 / 99.9 / 99.6 / 100 / 99.4 / 86.3 | 100 / 98.7 / 99.1 / 100 / 97.5 / 87.5 | +| national within 10 % (n-weighted) / 25 % | 77.7 % / 90.1 % | **92.3 % / 97.8 %** | +| national within 10 %: hmrc_spi / dwp_uc / ons_population / obr | 83 / 89 / 92 / 48 | 98 / 99 / 100 / 67 | +| gates | area_support FAILED (12), target_fit 20 cells, weight_ratio | area_support FAILED (189), target_fit 20 cells, weight_ratio | + +Reading: `grain_equal` buys the national fit the joint solve is supposed to keep, at almost no local cost, and pays for it in weight concentration. Under both rules the realized stretch sits on the 100× bound and the support floor fails, so the weighting question (A2) cannot be settled at this bound: the stretch bound (A3) is the binding decision. Measurement runs at 20 and 10 under both rules follow (R8). From e4eae70ace361ee7d58536ac15b33df3ed9514ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 01:26:03 +0200 Subject: [PATCH 05/26] Receipts R8: stretch bound 100/20/10 under both rules (#762 A3 measurement) Tightening the bound from 100 to 10 leaves loss and every fit share unchanged to a tenth of a point under both rules; bound 10 under uniform is the only run that clears the support floor (min constituency ESS 54.1, exit 0). grain_equal at 10 keeps the 92 percent national fit and misses the floor in five constituencies by 0.3 to 7.7 ESS; the K=15 escalation is R9. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index f77103106..78c3fe363 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -134,3 +134,31 @@ Same surface and inputs as R6; the receipted override `target_weight_rule: unifo | gates | area_support FAILED (12), target_fit 20 cells, weight_ratio | area_support FAILED (189), target_fit 20 cells, weight_ratio | Reading: `grain_equal` buys the national fit the joint solve is supposed to keep, at almost no local cost, and pays for it in weight concentration. Under both rules the realized stretch sits on the 100× bound and the support floor fails, so the weighting question (A2) cannot be settled at this bound: the stretch bound (A3) is the binding decision. Measurement runs at 20 and 10 under both rules follow (R8). + +## R8 — A3 measurement: stretch bound 100 / 20 / 10 under both weighting rules (2026-09-03 01:40–02:40; K=10, f100, no holdout, `--engine-blocks 10`) + +Measurement branch `uk-rowwise-candidate-762-measure` (worktree `populace-762m`, cut from PR B at c67efecc; **never merged**): `UK_LOCAL_MAX_WEIGHT_RATIO` edited to 20.0 (commit "MEASUREMENT ONLY: stretch bound 20") and then 10.0; every other input, pin, seed and the chain identical to R6/R7. Output directories `f100-k10-{U,G}{20,10}-eval` beside R6/R7's. Wall 775–826 s, peak 11.3–12.1 GB each. + +| | U (100) | G (100) | U20 | G20 | U10 | G10 | +|---|---|---|---|---|---|---| +| loss initial → final | 0.2777→0.0162 | 0.3198→0.0203 | 0.2777→0.0162 | 0.3198→0.0203 | 0.2777→0.0165 | 0.3198→0.0207 | +| median / max abs relative error | 0.0083 / 16.45 | 0.0092 / 1.42 | 0.0082 / 16.92 | 0.0085 / 1.14 | 0.0081 / 17.18 | 0.0074 / 0.96 | +| realized max ratio vs design | 100.0 | 100.0 | 20.0 | 20.0 | 10.0 | 10.0 | +| max / positive-median weight | 312.5 | 1,014.5 | 120.8 | 840.4 | 104.6 | 578.1 | +| ESS fraction / top-1 % weight share | 0.216 / 0.138 | 0.070 / 0.290 | 0.244 / 0.135 | 0.099 / 0.237 | 0.273 / 0.123 | 0.137 / 0.171 | +| constituencies ESS < 50 (min constituency ESS) | 12 (16.3) | 189 (11.8) | 3 (35.6) | 41 (24.0) | **0 (54.1)** | 5 (42.3) | +| local within 10 %: age / census / HMRC / UC / tenure / council tax | 100 / 99.9 / 99.6 / 100 / 99.4 / 86.3 | 100 / 98.7 / 99.1 / 100 / 97.5 / 87.5 | 100 / 99.9 / 99.7 / 99.9 / 99.4 / 86.2 | 100 / 98.6 / 98.9 / 99.9 / 97.4 / 87.3 | 100 / 99.8 / 99.5 / 99.8 / 99.4 / 86.2 | 99.9 / 97.2 / 98.9 / 99.7 / 96.9 / 87.0 | +| local cells past 25 % (diagnostic target_fit) | 104 | 94 | 106 | 108 | 110 | 116 | +| national within 10 % / 25 % (n-weighted) | 77.7 / 90.1 | 92.3 / 97.8 | 77.7 / 90.1 | 92.0 / 97.5 | 77.7 / 89.3 | 91.8 / 97.3 | +| mass factor | 0.960 | 0.973 | 0.960 | 0.971 | 0.960 | 0.973 | +| release-blocking gates | area_support | area_support | area_support | area_support | **none (exit 0)** | area_support | + +Per national family at bound 10 (n; within 10 % U10 / G10): hmrc_spi (129; 84 / 97), dwp_universal_credit (95; 89 / 99), ons_population (50; 92 / 100), obr (21; 43 / 62), council_tax_stock (18; 67 / 72), dwp_two_child_limit (15; 67 / 100), ons_household_composition (7; 29 / 71), slc_student_support (6; 50 / 83), dwp_legacy_benefits (4; 25 / 25), hmrc_salary_sacrifice (3; 33 / 100), ons_land (3; 0 / 0), slc_borrowers (3; 33 / 33), slc_repayments (3; 67 / 100), single-cell families benefit_cap / isc / public-sector employment (0 / 100 each), savings interest (0 / 0), CGT and Scottish child payment (100 / 100). + +Readings: + +1. **The stretch bound costs no fit.** Tightening 100 → 10 leaves the final loss, every local family's within-10 % share and the national shares unchanged to a tenth of a point under both rules. The extra stretch at 100 was buying weight concentration, not fit: under `uniform` the max/median ratio falls 312 → 105 and the ESS fraction rises 0.22 → 0.27; under `grain_equal` 1,014 → 578 and 0.07 → 0.14. +2. **Bound 10 is the only bound at which a run clears the support floor.** U10 passes every release-blocking gate (0 areas failed; min constituency ESS 54.1; the two reviewed micro-LAs stand on their exclusions). It is also the national doctrine's constant, so ruling it makes the two UK doctrines agree. +3. **The weighting rule is a national-fit vs support trade, now quantified at bound 10.** `grain_equal` lifts the national rows from 78 % to 92 % within 10 % (UC 89 → 99, SPI 84 → 97, OBR 43 → 62, two-child limit 67 → 100, household composition 29 → 71) and costs 2.6 points of census-household fit, 2.5 of tenure, half the ESS fraction, and five constituencies that miss the floor by 0.3–7.7 ESS (E14001123, E14001187, E14001417, E14001421, E14001563). Under `uniform` the 364 national rows are 1.8 % of 20,480 rows and are effectively ignored. +4. The `target_fit` and `weight_ratio` entries that fail in every run are `diagnostic` criticality (not release-blocking). `target_fit` is dominated by council tax (97 of 110 cells at U10: the band-H shortage and the A14/Wales deferrals' neighbours); `weight_ratio` measures max/median of the final weights against 100 and stays above it at bound 10 because the design weights (staging importance × ladder clone) already spread ~10×. +5. R9 measures the plan's K escalation for `grain_equal` at bound 10 (K=15, same chain) to see whether the five near-floor constituencies clear without giving up the national fit. From 66ec2915b539d0ec46321052b1bfa417b7b7636c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 02:05:28 +0200 Subject: [PATCH 06/26] Receipts R9: K=15 at bound 10 under both rules (#762 measured escalation) grain_equal at K=15 and bound 10 passes every release-blocking gate (min constituency ESS 54.1) while keeping the national rows at 92 percent within 10 percent; uniform at K=15 passes with more margin and 79 percent national. Memory stays flat with per-block engine resolution; wall grows 50 percent. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 78c3fe363..75f6d316b 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -162,3 +162,30 @@ Readings: 3. **The weighting rule is a national-fit vs support trade, now quantified at bound 10.** `grain_equal` lifts the national rows from 78 % to 92 % within 10 % (UC 89 → 99, SPI 84 → 97, OBR 43 → 62, two-child limit 67 → 100, household composition 29 → 71) and costs 2.6 points of census-household fit, 2.5 of tenure, half the ESS fraction, and five constituencies that miss the floor by 0.3–7.7 ESS (E14001123, E14001187, E14001417, E14001421, E14001563). Under `uniform` the 364 national rows are 1.8 % of 20,480 rows and are effectively ignored. 4. The `target_fit` and `weight_ratio` entries that fail in every run are `diagnostic` criticality (not release-blocking). `target_fit` is dominated by council tax (97 of 110 cells at U10: the band-H shortage and the A14/Wales deferrals' neighbours); `weight_ratio` measures max/median of the final weights against 100 and stays above it at bound 10 because the design weights (staging importance × ladder clone) already spread ~10×. 5. R9 measures the plan's K escalation for `grain_equal` at bound 10 (K=15, same chain) to see whether the five near-floor constituencies clear without giving up the national fit. + +## R9 — K escalation at bound 10: K=15 under both rules (2026-09-03 03:10–03:50; f100, no holdout, `--engine-blocks 15`, measurement branch at bound 10, chained on R8's G10 row) + +The plan's clause for insufficient ESS is a measured clone-count increase. Matrix 20,480 × 792,690 (K=15 clones of 52,846). Wall 1,169 s (U) / 1,178 s (G); peak 11.5 / 10.5 GB (per-block engine resolution keeps memory flat in K). + +| bound 10 | U10 (K=10) | G10 (K=10) | U15 (K=15) | G15 (K=15) | +|---|---|---|---|---| +| loss initial → final | 0.2777→0.0165 | 0.3198→0.0207 | 0.2734→0.0163 | 0.3195→0.0216 | +| median / max abs relative error | 0.0081 / 17.18 | 0.0074 / 0.96 | 0.0079 / 19.21 | 0.0072 / 0.95 | +| realized max ratio vs design | 10.0 | 10.0 | 10.0 | 10.0 | +| max / positive-median weight | 104.6 | 578.1 | 183.8 | 827.3 | +| ESS (absolute) / ESS fraction | 144,043 / 0.273 | 72,401 / 0.137 | 214,623 / 0.271 | 102,120 / 0.129 | +| constituencies ESS < 50 (min constituency ESS) | 0 (54.1) | 5 (42.3) | 0 (71.6) | **0 (54.1)** | +| min LA ESS (excluded micro-LAs) | 7.1 | 5.3 | 13.2 | 9.3 | +| local within 10 %: age / census / HMRC / UC / tenure / council tax | 100 / 99.8 / 99.5 / 99.8 / 99.4 / 86.2 | 99.9 / 97.2 / 98.9 / 99.7 / 96.9 / 87.0 | 100 / 99.9 / 99.5 / 99.9 / 99.2 / 86.3 | 100 / 98.4 / 98.9 / 99.9 / 97.1 / 87.1 | +| local cells past 25 % (diagnostic) | 110 | 116 | 108 | 109 | +| national within 10 % / 25 % | 77.7 / 89.3 | 91.8 / 97.3 | 78.6 / 90.4 | 92.0 / 97.5 | +| national within 10 %: SPI / UC / population / OBR / two-child / composition | 84 / 89 / 92 / 43 / 67 / 29 | 97 / 99 / 100 / 62 / 100 / 71 | 84 / 92 / 92 / 38 / 67 / 29 | 98 / 99 / 100 / 62 / 100 / 71 | +| mass factor | 0.960 | 0.973 | 0.960 | 0.969 | +| release-blocking gates | all pass (exit 0) | area_support (5) | all pass (exit 0) | **all pass (exit 0)** | + +Readings: + +1. **K=15 clears the floor under `grain_equal` without giving up the national fit.** The five near-floor constituencies of G10 pass (min constituency ESS 42.3 → 54.1); national stays 92 / 98; local moves by at most 1.2 points (census 97.2 → 98.4). Absolute ESS scales ~1.4× with the 1.5× rows; the ESS fraction is flat, so the concentration is a property of the rule, not of K. +2. Under `uniform` K=15 lifts the floor margin (54.1 → 71.6) and changes fit by ≤ 1 point; the national rows remain effectively unweighted (OBR 38 %). +3. Cost of K=15: wall +50 % (13 → 20 min), memory flat, artifact 792,690 rows (~2.4 GB h5). +4. The three constants the RC run needs are now each measured on this spine: stretch bound 10 (R8), rule `grain_equal` (R6–R9), K=15 (R9). All three are rulings for María (A2, A3, and the K default); none is applied on PR B until ruled. From 97608261979be691f631ec64eecc33c72920adba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:12:06 +0200 Subject: [PATCH 07/26] Receipts R10 + health audit: 512 vs 1500 epochs at K=15, bound 10 (#762) 1500 epochs is close to converged under uniform and still moving under grain_equal; uniform spends the extra epochs on the national rows (78.6 to 85.2 percent within 10 percent), grain_equal spends them chasing the unreachable housing-benefit row (max/median 827 to 2,857). Health audit: mechanics clean across 14 runs; flags are the epoch cap, the census-2021 household mass cut landing on single pensioners, and six unreachable national rows (proposed rulings A15, A16). Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 75f6d316b..0efbf4626 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -189,3 +189,34 @@ Readings: 2. Under `uniform` K=15 lifts the floor margin (54.1 → 71.6) and changes fit by ≤ 1 point; the national rows remain effectively unweighted (OBR 38 %). 3. Cost of K=15: wall +50 % (13 → 20 min), memory flat, artifact 792,690 rows (~2.4 GB h5). 4. The three constants the RC run needs are now each measured on this spine: stretch bound 10 (R8), rule `grain_equal` (R6–R9), K=15 (R9). All three are rulings for María (A2, A3, and the K default); none is applied on PR B until ruled. + +## R10 — Epoch count: 512 vs 1500 at K=15, bound 10, both rules (2026-09-03 05:00–07:00; f100, no holdout, `--engine-blocks 15`, measurement branch) + +Every earlier run used the driver default of 512 epochs (the national doctrine solves 256; María's ruling is 1500). Same pins, seed and chain; `--epochs 1500`. Wall 3,228 s (U) / 3,538 s (G); peak 9.0 / 7.7 GB. Both pass every release-blocking gate. + +| K=15, bound 10 | U (512) | U (1500) | G (512) | G (1500) | +|---|---|---|---|---| +| loss at epoch 256 / 512 / 1024 / 1500 | 0.0178 / 0.0165 / – / – | 0.0178 / 0.0165 / 0.0154 / 0.0152 | 0.0254 / 0.0211 / – / – | 0.0254 / 0.0211 / 0.0196 / 0.0184 | +| loss drop over the last 128 epochs | 1.9 % | 0.4 % | 5.7 % | 2.8 % | +| median / max abs relative error | 0.0079 / 19.21 | 0.0077 / 0.75 | 0.0072 / 0.95 | 0.0062 / 0.98 | +| max / positive-median weight | 184 | 231 | 827 | **2,857** | +| ESS fraction / top-1 % weight share | 0.271 / 0.124 | 0.232 / 0.137 | 0.129 / 0.177 | 0.105 / 0.187 | +| constituency ESS min / median | 71.6 / 410 | 62.5 / 345 | 54.1 / 169 | 54.6 / 133 | +| local within 10 %: age / census / HMRC / UC / tenure / council tax | 100 / 99.9 / 99.5 / 99.9 / 99.2 / 86.3 | 100 / 99.9 / 99.4 / 99.9 / 99.2 / 86.6 | 100 / 98.4 / 98.9 / 99.9 / 97.1 / 87.1 | 100 / 98.8 / 98.9 / 99.9 / 97.3 / 86.8 | +| national within 10 % / 25 % | 78.6 / 90.4 | **85.2 / 93.7** | 92.0 / 97.5 | 93.1 / 97.8 | +| national within 10 %: SPI / UC / population / OBR / two-child / composition | 84 / 92 / 92 / 38 / 67 / 29 | 89 / 97 / 98 / 57 / 73 / 29 | 98 / 99 / 100 / 62 / 100 / 71 | 98 / 99 / 100 / 71 / 100 / 71 | +| lone over-65 households (target 4.25M) | 2.89M | 2.96M | 3.94M | 4.11M | +| OBR housing benefit (target £12.1bn; spine £2.7bn) | £2.6bn | £2.9bn | £9.4bn | £11.4bn | +| Glasgow social rent (target 102k) | 110k | 109k | 197k | 203k | +| mass factor | 0.960 | 0.960 | 0.969 | 0.967 | + +Readings: + +1. **1500 epochs is not converged either**, but close under `uniform` (0.4 % over the last 128 epochs) and still moving under `grain_equal` (2.8 %). Wall time triples (20 → 55–59 min); memory does not grow. +2. **Under `uniform` the extra epochs go to the national rows**: 78.6 → 85.2 % within 10 % (UC 92 → 97, population 92 → 98, OBR 38 → 57) at unchanged local fit, and the one frozen past-cap cell (Barking band G) resolves (max abs error 19.2 → 0.75). The price is moderate: ESS fraction 0.27 → 0.23, median constituency ESS 410 → 345. +3. **Under `grain_equal` the extra epochs go to the unreachable rows**: housing benefit is chased from £9.4bn to £11.4bn of the £12.1bn OBR aggregate the spine cannot carry (it holds £2.7bn), by multiplying HB households; the max/median ratio goes 827 → 2,857, the ESS fraction 0.129 → 0.105, the median constituency ESS 169 → 133, and Glasgow's social-rent count stays at twice its target. National fit gains 1 point. This is the health flag 3 mechanism measured: without reviewed exclusions for the unreachable national rows (land ×2, savings interest, housing benefit, SLC borrowers), longer solves under `grain_equal` buy concentration, not fit. +4. The mass flag (health flag 2) is unchanged by epochs: `uniform` keeps lone over-65 households at 2.96M against 4.25M. + +### Health audit of the licensed runs (2026-09-03) + +Mechanics, all 14 runs: no warnings, tracebacks or NaN; no swapping (26 GB machine, peaks 7.7–12.1 GB); every pin verified; the logbook spool chain intact; the licensed logbook untouched; weights all positive with sums equal to the manifests; engine resolution deterministic across K (identical initial national estimates at K=10 and K=15). Substance: (1) the solver stops on the epoch cap, not a convergence criterion (R10); (2) census-2021 household rows binding at calibration year 2025 remove 4 % of households, taken from single-person households under `uniform` (lone over-65 −31 %) — proposed ruling A15: uprate the ladder household rows to 2025 by one national factor from ONS household estimates; (3) six national rows are unreachable by reweighting because the spine is wrong — corporate land value 8.7×, land value 2.5×, savings interest −86 %, housing benefit −78 %, SLC plan-2 borrowers −65/−69 %, JSA claimants 1.8× (claimant count; the OBR JSA spend row 3.4×) — proposed ruling A16: reviewed measure exclusions with receipts before the release-candidate run, and spine issues for the land and savings-interest imputations. Cosmetic: the gate report's `candidate_name` reuses the national constant (`microcosm_uk_2024`). From b2ce9b0861f9e48cd014e2f1cde9849fd1aaf5e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:28:28 +0200 Subject: [PATCH 08/26] Receipts R11: single-block engine resolution at K=15 fits in 10.2 GB (#762) Co-Authored-By: Claude Fable 5.1 --- experiments/762-uk-rowwise-candidate-receipts.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 0efbf4626..94c329abc 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -220,3 +220,7 @@ Readings: ### Health audit of the licensed runs (2026-09-03) Mechanics, all 14 runs: no warnings, tracebacks or NaN; no swapping (26 GB machine, peaks 7.7–12.1 GB); every pin verified; the logbook spool chain intact; the licensed logbook untouched; weights all positive with sums equal to the manifests; engine resolution deterministic across K (identical initial national estimates at K=10 and K=15). Substance: (1) the solver stops on the epoch cap, not a convergence criterion (R10); (2) census-2021 household rows binding at calibration year 2025 remove 4 % of households, taken from single-person households under `uniform` (lone over-65 −31 %) — proposed ruling A15: uprate the ladder household rows to 2025 by one national factor from ONS household estimates; (3) six national rows are unreachable by reweighting because the spine is wrong — corporate land value 8.7×, land value 2.5×, savings interest −86 %, housing benefit −78 %, SLC plan-2 borrowers −65/−69 %, JSA claimants 1.8× (claimant count; the OBR JSA spend row 3.4×) — proposed ruling A16: reviewed measure exclusions with receipts before the release-candidate run, and spine issues for the land and savings-interest imputations. Cosmetic: the gate report's `candidate_name` reuses the national constant (`microcosm_uk_2024`). + +## R11 — Single-block engine resolution at K=15 (the `--release-candidate` posture) (2026-09-03 07:xx; `grain_equal`, bound 10, 64 epochs, no `--engine-blocks`) + +`--release-candidate` refuses `--engine-blocks > 1`, so the release run resolves policyengine-uk over the full 792,690-row K=15 frame in one block. Measured on the measurement branch with a short solve (64 epochs) since the engine, not the solve, is the memory question: wall 885 s; peak resident 10.2 GB (`time -l`), 9 GB sampled every 20 s by a 22 GB watchdog that never fired; no warnings; `measure_resolution.blocks = 1`, no deviation record; identical gate verdicts to the blocked runs (area_support passed). The 26 GB machine carries the release posture at K=15 with headroom; the per-block runs' 10.5–12 GB peaks came from the solve, not the engine. From 61a3029c45ffbfbd33971cfb5011347fc090a7de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 12:53:21 +0200 Subject: [PATCH 09/26] UK local doctrine: bound 10, grain_equal, K=15, 1500 epochs; A15 ladder uprating; A16 exclusions (#762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit María's rulings of 2026-09-03, each the measured choice in receipts R6-R10: - UK_LOCAL_MAX_WEIGHT_RATIO 100 -> 10 (A3): no fit cost at 100/20/10, the only bound that clears the ESS floor, and the national doctrine's bound. - UK_LOCAL_TARGET_WEIGHT_RULE = grain_equal (A2): national rows 92-93 percent within 10 percent versus 78-85 under uniform; uniform stays a receipted override. - UK_LOCAL_CLONE_COUNT = 15 and UK_LOCAL_SOLVE_EPOCHS = 1500 as doctrine constants; the driver defaults read them and --release-candidate refuses other values. - A15: every ladder census household row is scaled by one national factor from the Ledger's ons.households_total fact at the calibration year (29,003,000 / 28,060,832 = 1.033577), fail-closed by name, receipted in the manifest, mandatory under --release-candidate. - A16: seven reviewed measure exclusions (land value x2, savings interest, housing benefit, SLC plan-2 borrowers x2, JSA claimants), unreachable by reweighting on spine-m, one-month window to 2026-10-03, tracked on microcosm#736. Receipt R12 records the applied values and the verification. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 19 +++ .../uk/calibration_measure_exclusions.json | 63 +++++++ .../microcosm/build/uk_runtime/__init__.py | 10 ++ .../build/uk_runtime/ledger_targets.py | 159 +++++++++++++++++- .../build/uk_runtime/local_doctrine.py | 63 +++++-- .../tests/test_uk_ledger_targets.py | 130 ++++++++++++++ .../tests/test_uk_local_doctrine.py | 25 ++- .../tests/test_uk_measure_simulation.py | 63 +++++-- .../tests/test_uk_rowwise_candidate.py | 46 ++++- tools/build_uk_rowwise_candidate.py | 62 ++++++- 10 files changed, 594 insertions(+), 46 deletions(-) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 94c329abc..b6b4a5cf9 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -224,3 +224,22 @@ Mechanics, all 14 runs: no warnings, tracebacks or NaN; no swapping (26 GB machi ## R11 — Single-block engine resolution at K=15 (the `--release-candidate` posture) (2026-09-03 07:xx; `grain_equal`, bound 10, 64 epochs, no `--engine-blocks`) `--release-candidate` refuses `--engine-blocks > 1`, so the release run resolves policyengine-uk over the full 792,690-row K=15 frame in one block. Measured on the measurement branch with a short solve (64 epochs) since the engine, not the solve, is the memory question: wall 885 s; peak resident 10.2 GB (`time -l`), 9 GB sampled every 20 s by a 22 GB watchdog that never fired; no warnings; `measure_resolution.blocks = 1`, no deviation record; identical gate verdicts to the blocked runs (area_support passed). The 26 GB machine carries the release posture at K=15 with headroom; the per-block runs' 10.5–12 GB peaks came from the solve, not the engine. + +## R12 — Rulings applied (María, 2026-09-03): doctrine constants, A15 ladder uprating, A16 reviewed exclusions + +Applied on this branch in one commit; every constant is the measured choice above and each carries its adjudication note in `local_doctrine.py`: + +| constant | was | now | receipt | +|---|---|---|---| +| `UK_LOCAL_MAX_WEIGHT_RATIO` (A3) | 100.0 | **10.0** | R8: no fit cost at 100/20/10; only 10 clears the ESS floor; equals the national bound | +| `UK_LOCAL_TARGET_WEIGHT_RULE` (A2) | `uniform` | **`grain_equal`** | R6–R10: national 92–93 % vs 78–85 % within 10 %; `uniform` stays a receipted override | +| `UK_LOCAL_CLONE_COUNT` (K) | 4 (driver default) | **15** | R9: clears the floor under `grain_equal` at bound 10 (min constituency ESS 54.1) | +| `UK_LOCAL_SOLVE_EPOCHS` | 512 (driver default) | **1500** | R10; matches the national certified-cut posture | + +`--release-candidate` now refuses `--epochs`, `--n-clones` and `--target-weight-rule` values that differ from the doctrine, beside the earlier refusals; the manifest's `parameters.doctrine` block records `solve_epochs` and `clone_count`. + +**A15 — ladder household rows uprated to the calibration year.** The OA ladder's household counts are census-vintage (England, Wales and Northern Ireland 2021; Scotland 2022; ladder total 28,060,832). The surface now scales every ladder household row by one national factor: the Ledger's published UK household total for the calibration year (ONS *Families and households in the UK 2025*, Table 5 all-households row, `ons.households_total` at K02000001, calendar year 2025: **29,003,000**; the 2021 row of the same table is 28,119,000, 0.2 % from the ladder total) over the ladder total, so **factor 1.033577**. Assignment shares and support counts stay census-based. The fact is selected by concept, geography, period and empty dimensions and fails closed on zero or several matches; the receipt (`ladder_household_uprating`: factor, totals, fact keys, source record id) rides the cross-grain receipt and the manifest, and `--release-candidate` refuses a run whose rows bind as published. This is the health-audit flag 2 resolution: the 4 % household mass cut under `uniform` (29.25M → 28.07M) was the census vintage binding at 2025; the uprated rows sum to 29.0M, 0.8 % under the FRS grossing. + +**A16 — seven reviewed measure exclusions, one-month window (approved 2026-09-03, expire 2026-10-03), tracked on microcosm#736.** `ons.land.corporate_land_value` (8.7×), `ons.land.land_value` (2.5×), `ons.savings_interest_income` (−86 %), `obr.housing_benefit` (−78 %), `slc.borrowers.plan_2_liable` (−65 %), `slc.borrowers.plan_2_above_threshold` (−69 %), `dwp.jsa_claimants` (1.8×) — each unreachable by reweighting within the stretch bound on spine-m (R8–R10), each a frame-side gap; the register now holds 51 entries. None of the seven is a cross-grain bridge member, so no bridge classification changes. + +Verification on this commit: doctrine / candidate / ledger / measure-simulation / rowwise files 99 passed; country spec, battery bindings, seam driver, scorer and the microcosm-data contract suite 543 passed, 1 skipped; both censuses current; `ci_test_groups.py --verify` ok; `ruff check` clean; no pinned digest moved. The release-candidate run (R13) applies all of this under `--release-candidate` with holdout. diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 7b73f1b6d..214dc342e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -396,6 +396,69 @@ "adjudication": "microcosm#757 (the uk_target_fit dispositions, issue comment 5427936411)", "approved_on": "2026-08-26", "expires_on": "2026-11-26" + }, + { + "name": "ons.land.corporate_land_value", + "reason": "The spine carries £20.4tn of corporate land value against the ONS £2.1tn (8.7x at initialization on spine-m; 2.7x after the K=15 solve at stretch bound 10): a land-imputation defect (units or a double draw) in the frame. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" + }, + { + "name": "ons.land.land_value", + "reason": "The spine carries £24.9tn of total land value against the ONS £7.1tn (2.5x at initialization on spine-m; still 1.6x after the K=15 solve at stretch bound 10): the same land-imputation defect as the corporate row. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" + }, + { + "name": "ons.savings_interest_income", + "reason": "The spine carries £13.8bn of savings interest income against the ONS £95.5bn (-86% at initialization on spine-m, -89% after the solve): the FRS interest income capture, not the weights. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" + }, + { + "name": "obr.housing_benefit", + "reason": "The spine carries £2.7bn of housing benefit against the OBR £12.1bn (-78% at initialization on spine-m). Under grain_equal the solver chases the aggregate by multiplying the few HB households (£9.4bn at 512 epochs, £11.4bn at 1500), which halves the effective sample and doubles Glasgow's social-rent count; under uniform it is ignored. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" + }, + { + "name": "slc.borrowers.plan_2_liable", + "reason": "The spine carries 3.4M plan-2 borrowers liable against the SLC 9.7M (-65% at initialization on spine-m; -52% after the solve): student-loan borrower coverage in the frame. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" + }, + { + "name": "slc.borrowers.plan_2_above_threshold", + "reason": "The spine carries 1.4M plan-2 borrowers above threshold against the SLC 4.5M (-69% at initialization on spine-m; -43% after the solve): student-loan borrower coverage in the frame. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" + }, + { + "name": "dwp.jsa_claimants", + "reason": "The spine carries 199k JSA claimants against the DWP 71k (1.8x at initialization on spine-m; -13% after the solve): legacy-benefit reporting in the frame after the UC migration. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", + "tracking": "microcosm#736", + "approved_by": "juaristi22", + "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", + "approved_on": "2026-09-03", + "expires_on": "2026-10-03" } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py index 14f87bf64..2455e8d00 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py @@ -269,12 +269,17 @@ compile_uk_target_registry, load_uk_local_area_crosswalk, materialize_uk_ledger_targets, + uk_ladder_household_uprating, + uk_ledger_households_total, uk_local_target_surface, ) from microcosm.build.uk_runtime.local_doctrine import ( + UK_LOCAL_CLONE_COUNT, UK_LOCAL_MAX_WEIGHT_RATIO, UK_LOCAL_SOLVE_DOCTRINE, + UK_LOCAL_SOLVE_EPOCHS, UK_LOCAL_TARGET_LOSS_CAP, + UK_LOCAL_TARGET_WEIGHT_RULE, UKLocalSolveDoctrine, uk_local_doctrine_with_overrides, uk_local_target_loss_weights, @@ -534,7 +539,10 @@ "UK_CGT_ANNUAL_EXEMPT_AMOUNTS", "UK_GATE_REGISTRY", "UK_FRAME_METADATA_KEY", + "UK_LOCAL_CLONE_COUNT", "UK_LOCAL_MAX_WEIGHT_RATIO", + "UK_LOCAL_SOLVE_EPOCHS", + "UK_LOCAL_TARGET_WEIGHT_RULE", "UK_LOCAL_BINDING_ADJUDICATION_REGISTER_RESOURCE", "UK_LOCAL_HOLDOUT_FOLDS", "UK_LOCAL_HOLDOUT_SEED", @@ -872,6 +880,8 @@ "uk_region_mix", "uk_area_support_summary", "uk_ladder_area_support_summary", + "uk_ladder_household_uprating", + "uk_ledger_households_total", "uk_local_target_surface", "uk_local_doctrine_with_overrides", "uk_local_target_loss_weights", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py index bcb0c46d8..67c3b685b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py @@ -883,6 +883,127 @@ def apply_uk_cross_grain_reconciliation( ) +#: The Ledger concept the A15 ladder uprating stands on: ONS "Families and +#: households in the UK", Table 5 all-households row, UK, calendar year. +UK_LEDGER_HOUSEHOLDS_TOTAL_CONCEPT = "ons.households_total" +UK_LEDGER_HOUSEHOLDS_TOTAL_GEOGRAPHY = "K02000001" + + +def uk_ledger_households_total( + facts: Iterable[Mapping[str, Any]], + *, + period: int | str, +) -> dict[str, Any]: + """Select the published UK household total for ``period`` from the Ledger. + + Exactly one fact must carry the ``ons.households_total`` concept at the + UK country geography for the calendar year ``period`` with no + dimensions; zero or several fail closed by name, so an artifact that + lacks the vintage cannot silently bind the census-vintage ladder rows. + """ + + target_period = int(period) + matches: list[Mapping[str, Any]] = [] + for fact in facts: + alignment = fact.get("concept_alignment") + if not isinstance(alignment, Mapping): + continue + if alignment.get("canonical_concept") != UK_LEDGER_HOUSEHOLDS_TOTAL_CONCEPT: + continue + geography = fact.get("geography") + if not isinstance(geography, Mapping) or geography.get("id") != ( + UK_LEDGER_HOUSEHOLDS_TOTAL_GEOGRAPHY + ): + continue + fact_period = fact.get("period") + if not isinstance(fact_period, Mapping): + continue + if fact_period.get("type") != "calendar_year": + continue + try: + if int(fact_period.get("value")) != target_period: + continue + except (TypeError, ValueError): + continue + if fact.get("dimensions"): + continue + matches.append(fact) + if len(matches) != 1: + raise ValueError( + f"UK ladder household uprating needs exactly one Ledger fact for " + f"{UK_LEDGER_HOUSEHOLDS_TOTAL_CONCEPT!r} at " + f"{UK_LEDGER_HOUSEHOLDS_TOTAL_GEOGRAPHY} for calendar year " + f"{target_period}; found {len(matches)}." + ) + fact = matches[0] + value = float(fact.get("value")) + if not np.isfinite(value) or value <= 0: + raise ValueError( + f"UK ladder household uprating reference must be a positive finite " + f"count, got {fact.get('value')!r}." + ) + lineage = fact.get("lineage") + lineage = lineage if isinstance(lineage, Mapping) else {} + return { + "concept": UK_LEDGER_HOUSEHOLDS_TOTAL_CONCEPT, + "geography_id": UK_LEDGER_HOUSEHOLDS_TOTAL_GEOGRAPHY, + "period": target_period, + "value": value, + "semantic_fact_key": str(fact.get("semantic_fact_key", "")), + "aggregate_fact_key": str(fact.get("aggregate_fact_key", "")), + "source_record_id": str(lineage.get("source_record_id", "")), + } + + +def uk_ladder_household_uprating( + ladder: Any, + households_reference: Mapping[str, Any], + *, + period: int | str, +) -> dict[str, Any]: + """Derive the single national factor that moves the ladder's census + household counts to the calibration period (microcosm#762 A15). + + The OA ladder's household counts are the 2021 (England, Wales, Northern + Ireland) and 2022 (Scotland) census counts; the candidate calibrates at + ``period``. One factor — the Ledger's published UK household total at + ``period`` over the ladder's total — uprates every ladder household row + while the ladder keeps its census shares for assignment and support. + """ + + households = np.asarray(ladder.households, dtype=np.float64) + total = float(households.sum()) + if not np.isfinite(total) or total <= 0: + raise ValueError("ladder household total must be positive and finite.") + reference_value = float(households_reference["value"]) + if int(households_reference.get("period", period)) != int(period): + raise ValueError( + "UK ladder household uprating reference period " + f"{households_reference.get('period')!r} is not the calibration " + f"period {period!r}." + ) + factor = reference_value / total + if not np.isfinite(factor) or factor <= 0: + raise ValueError(f"UK ladder household uprating factor is invalid: {factor!r}.") + metadata = getattr(ladder, "metadata", {}) or {} + return { + "applied": True, + "period": int(period), + "factor": factor, + "ladder_households_total": total, + "ladder_oa_vintage": str(metadata.get("oa_vintage", "")), + "reference": dict(households_reference), + "adjudication": "microcosm#762 (A15, ruling 2026-09-03)", + "reason": ( + "The OA ladder's household counts are census-vintage (2021; " + "Scotland 2022); the candidate calibrates at the FRS release's " + "calibration year, so every ladder household row is scaled by one " + "national factor to the Ledger's published UK household total for " + "that year. Assignment shares and support counts stay census-based." + ), + } + + def uk_local_target_surface( local_registry: TargetRegistry, ladder: Any, @@ -891,8 +1012,39 @@ def uk_local_target_surface( period: int | str, reviewed_unbound_higher_targets: Mapping[str, Mapping[str, object]] | None = None, licensed_empty_legs: Mapping[str, frozenset[str]] | None = None, + ladder_household_uprating: Mapping[str, Any] | None = None, ) -> tuple[pd.DataFrame, dict[str, Any]]: - """Assemble and reconcile the present-cell UK local target surface.""" + """Assemble and reconcile the present-cell UK local target surface. + + ``ladder_household_uprating`` is the A15 receipt from + :func:`uk_ladder_household_uprating`; when given, every ladder household + row is scaled by its ``factor`` and the receipt rides the returned + cross-grain receipt. Without it the ladder rows bind as published and + the receipt says so. + """ + + if ladder_household_uprating is None: + uprating_factor = 1.0 + uprating_receipt: dict[str, Any] = { + "applied": False, + "reason": ( + "no Ledger household reference supplied; ladder household rows " + "bind at their census vintage." + ), + } + elif not ladder_household_uprating.get("applied"): + # A declined receipt (no Ledger facts on this path) rides through + # unchanged so the manifest says why the rows bind as published. + uprating_factor = 1.0 + uprating_receipt = dict(ladder_household_uprating) + uprating_receipt["applied"] = False + else: + uprating_factor = float(ladder_household_uprating["factor"]) + if not np.isfinite(uprating_factor) or uprating_factor <= 0: + raise ValueError( + f"ladder household uprating factor is invalid: {uprating_factor!r}." + ) + uprating_receipt = dict(ladder_household_uprating) level_to_area_type = { level: area_type @@ -1057,7 +1209,7 @@ def uk_local_target_surface( "area_type": area_type, "area_code": str(row.code), "metric": "households", - "value": float(row.households), + "value": float(row.households) * uprating_factor, "target_name": ( f"external:census_households/households@{row.code}" ), @@ -1072,7 +1224,7 @@ def uk_local_target_surface( "grain": area_type, "geography_id": str(row.code), "target_id": "external:census_households/households", - "value": float(row.households), + "value": float(row.households) * uprating_factor, "_output_position": output_position, } ) @@ -1085,6 +1237,7 @@ def uk_local_target_surface( licensed_empty_legs=licensed_empty_legs, ) receipt["fanout_targets_not_controls"] = fanout_targets_not_controls + receipt["ladder_household_uprating"] = uprating_receipt for position, value in enumerate(reconciled["value"].to_numpy(dtype=np.float64)): output_position = reconciliation.iloc[position]["_output_position"] if pd.notna(output_position): diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_doctrine.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_doctrine.py index 300ab1c11..84976e4d3 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_doctrine.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_doctrine.py @@ -32,9 +32,12 @@ import numpy as np __all__ = [ + "UK_LOCAL_CLONE_COUNT", "UK_LOCAL_MAX_WEIGHT_RATIO", "UK_LOCAL_SOLVE_DOCTRINE", + "UK_LOCAL_SOLVE_EPOCHS", "UK_LOCAL_TARGET_LOSS_CAP", + "UK_LOCAL_TARGET_WEIGHT_RULE", "UKLocalSolveDoctrine", "uk_local_doctrine_with_overrides", "uk_local_target_loss_weights", @@ -46,17 +49,47 @@ #: Declared weight-ratio stretch bound for the UK local solve. #: -#: microcosm#493 adjudication record (2026-08-07): the bound stays 100.0, -#: recorded against the US design bound of 5.0 (the ACS local and fiscal -#: refresh defaults; realized max ratio 4.994 in production) and the US -#: exact-k ladder's 20.0. The UK value is not yet a measured-fit choice — -#: it is the bound the local solve inherited when it was a second entry -#: point owning its own defaults — and tightening it without measured fit -#: would be an arbitrary cutoff. The revision path remains the #495 -#: increment-6 calibrated-candidate review, which adjudicates against -#: measured fit; any revision must edit this constant and its pinned test, -#: which forces review. -UK_LOCAL_MAX_WEIGHT_RATIO = 100.0 +#: microcosm#762 A3 adjudication (2026-09-03, receipts R8–R10 in +#: ``experiments/762-uk-rowwise-candidate-receipts.md``): 10.0, measured +#: against 100.0 and 20.0 on spine-m at K=10 under both weighting rules. +#: Tightening 100 → 10 left the final loss and every family's within-10 % +#: share unchanged to a tenth of a point; the extra stretch bought weight +#: concentration, not fit (max/median 312 → 105 under ``uniform``, 1,014 → +#: 578 under ``grain_equal``), and 10 was the only bound at which any run +#: cleared the ESS ≥ 50 support floor. It is also the national doctrine's +#: bound, so the two UK solves now agree. The #493 record (2026-08-07) had +#: held 100.0 explicitly as the inherited, not-yet-measured value pending +#: this review. Any revision must edit this constant and its pinned test. +UK_LOCAL_MAX_WEIGHT_RATIO = 10.0 + +#: Declared target-weighting rule for the UK local solve. +#: +#: microcosm#762 A2 adjudication (2026-09-03, receipts R6–R10): +#: ``grain_equal`` — the national rows, the constituency rows and the +#: local-authority rows take one equal share of the loss each, uniform +#: within. Under ``uniform`` the 364 national rows are 1.8 % of the 20,480- +#: row matrix and are effectively ignored (78 % within 10 %; OBR aggregates +#: 43 %); ``grain_equal`` holds them at 92–93 % for about two points of +#: census-household and tenure fit. ``uniform`` stays a receipted override. +UK_LOCAL_TARGET_WEIGHT_RULE = "grain_equal" + +#: Declared solve length for the UK local solve (Adam epochs). +#: +#: microcosm#762 adjudication (2026-09-03, receipt R10): 1500, María's +#: ruling, matching the national certified-cut posture. The solver has no +#: stopping criterion; at 512 the loss was still falling 2–6 % per 128 +#: epochs, at 1500 it is 0.4 % (``uniform``) / 2.8 % (``grain_equal``). +UK_LOCAL_SOLVE_EPOCHS = 1500 + +#: Declared clone count K for the UK local candidate (rows per spine +#: household through the OA ladder). +#: +#: microcosm#762 adjudication (2026-09-03, receipt R9): 15. The plan's +#: K=4 default refused 172 UC child-band cells with zero support; K=10 +#: refused 86 band-H cells (A14) and, under ``grain_equal`` at bound 10, +#: left five constituencies 0.3–7.7 ESS under the floor; K=15 clears the +#: floor (min constituency ESS 54.1) at unchanged fit and flat memory. +UK_LOCAL_CLONE_COUNT = 15 _ALLOWED_SCALE_RULES = ("default_target_loss_scales",) _ALLOWED_TARGET_WEIGHT_RULES = ("uniform", "grain_equal") @@ -69,15 +102,15 @@ class UKLocalSolveDoctrine: ``scale_rule`` and ``target_weight_rule`` are closed vocabularies: the only admissible scale rule is the canonical target-defined default, and - the only admissible target weighting is uniform. A future family-level - weighting would be a new reviewed rule name here — never a per-target - vector. + the admissible target weightings are ``grain_equal`` (the reviewed + default) and ``uniform`` (a receipted override). Any other weighting + would be a new reviewed rule name here — never a per-target vector. """ target_loss_cap: float = UK_LOCAL_TARGET_LOSS_CAP max_weight_ratio: float | None = UK_LOCAL_MAX_WEIGHT_RATIO scale_rule: str = "default_target_loss_scales" - target_weight_rule: str = "uniform" + target_weight_rule: str = UK_LOCAL_TARGET_WEIGHT_RULE def __post_init__(self) -> None: if ( diff --git a/packages/microcosm-build/tests/test_uk_ledger_targets.py b/packages/microcosm-build/tests/test_uk_ledger_targets.py index 85c025ef9..84ed4c2dc 100644 --- a/packages/microcosm-build/tests/test_uk_ledger_targets.py +++ b/packages/microcosm-build/tests/test_uk_ledger_targets.py @@ -18,6 +18,8 @@ compile_uk_local_target_registry, compile_uk_target_registry, materialize_uk_ledger_targets, + uk_ladder_household_uprating, + uk_ledger_households_total, uk_local_target_surface, ) from microcosm.calibrate import TargetRegistry, TargetSpec @@ -1351,3 +1353,131 @@ def test_uk_local_target_surface_receipts_a_single_cell_dropped_by_the_fanout_ru } assert ("K03000001", 2) in entries assert entries[("K02000001", 1)].startswith("Single cell at this geography") +def _households_total_fact(period: int, value: float, **overrides): + fact = { + "concept_alignment": {"canonical_concept": "ons.households_total"}, + "geography": {"id": "K02000001", "level": "country"}, + "period": {"type": "calendar_year", "value": period}, + "dimensions": {}, + "value": value, + "semantic_fact_key": f"ledger.semantic_fact.v2:{period}", + "aggregate_fact_key": f"ledger.aggregate_fact.v2:{period}", + "lineage": {"source_record_id": f"ons.table5.all_households.cy{period}"}, + } + fact.update(overrides) + return fact + + +def test_uk_ledger_households_total_selects_exactly_one_fact() -> None: + facts = ( + _households_total_fact(2021, 28_119_000.0), + _households_total_fact(2025, 29_003_000.0), + _households_total_fact( + 2025, + 1.0, + concept_alignment={"canonical_concept": "ons.average_household_size"}, + ), + _households_total_fact(2025, 5.0, geography={"id": "E92000001"}), + _households_total_fact(2025, 7.0, dimensions={"household_type": "lone"}), + ) + reference = uk_ledger_households_total(facts, period=2025) + assert reference == { + "concept": "ons.households_total", + "geography_id": "K02000001", + "period": 2025, + "value": 29_003_000.0, + "semantic_fact_key": "ledger.semantic_fact.v2:2025", + "aggregate_fact_key": "ledger.aggregate_fact.v2:2025", + "source_record_id": "ons.table5.all_households.cy2025", + } + with pytest.raises(ValueError, match="found 0"): + uk_ledger_households_total(facts, period=2030) + with pytest.raises(ValueError, match="found 2"): + uk_ledger_households_total( + (*facts, _households_total_fact(2025, 29_003_000.0)), period=2025 + ) + with pytest.raises(ValueError, match="positive finite"): + uk_ledger_households_total((_households_total_fact(2025, 0.0),), period=2025) + + +def test_uk_ladder_household_uprating_scales_ladder_rows_and_receipts() -> None: + ladder = SimpleNamespace( + households=np.asarray([10.0, 20.0]), + constituency_code=np.asarray(["E14000001", "S14000001"]), + local_authority_code=np.asarray(["E06000001", "S12000005"]), + metadata={"oa_vintage": "ew:2021_census;scotland:2022_census;ni:dz2021"}, + ) + reference = uk_ledger_households_total( + (_households_total_fact(2025, 33.0),), period=2025 + ) + uprating = uk_ladder_household_uprating(ladder, reference, period=2025) + assert uprating["applied"] is True + assert uprating["factor"] == pytest.approx(1.1) + assert uprating["ladder_households_total"] == 30.0 + assert uprating["ladder_oa_vintage"].startswith("ew:2021_census") + assert uprating["reference"] == reference + assert "A15" in uprating["adjudication"] + with pytest.raises(ValueError, match="calibration period"): + uk_ladder_household_uprating(ladder, reference, period=2024) + + registry = TargetRegistry( + [ + TargetSpec( + name="dwp.uc.households@2025", + entity="household", + value=90.0, + measure="uc_households", + period=2025, + source="DWP", + family="dwp_universal_credit", + metadata={ + "contract_target_id": "dwp.uc.households", + "geography_level": "country", + "geography_id": "K03000001", + }, + ), + ], + country="uk", + ) + as_published, receipt = uk_local_target_surface( + registry, ladder, bound_national_target_ids=(), period=2025 + ) + assert receipt["ladder_household_uprating"]["applied"] is False + published_rows = as_published.loc[as_published["metric"] == "households"] + assert published_rows["value"].tolist() == [10.0, 20.0, 10.0, 20.0] + + uprated, receipt = uk_local_target_surface( + registry, + ladder, + bound_national_target_ids=(), + period=2025, + ladder_household_uprating=uprating, + ) + rows = uprated.loc[uprated["metric"] == "households"] + assert rows["value"].tolist() == pytest.approx([11.0, 22.0, 11.0, 22.0]) + assert receipt["ladder_household_uprating"] == uprating + declined, receipt = uk_local_target_surface( + registry, + ladder, + bound_national_target_ids=(), + period=2025, + ladder_household_uprating={"applied": False, "reason": "no facts"}, + ) + assert declined.loc[declined["metric"] == "households", "value"].tolist() == [ + 10.0, + 20.0, + 10.0, + 20.0, + ] + assert receipt["ladder_household_uprating"] == { + "applied": False, + "reason": "no facts", + } + with pytest.raises(ValueError, match="factor is invalid"): + uk_local_target_surface( + registry, + ladder, + bound_national_target_ids=(), + period=2025, + ladder_household_uprating={"applied": True, "factor": 0.0}, + ) diff --git a/packages/microcosm-build/tests/test_uk_local_doctrine.py b/packages/microcosm-build/tests/test_uk_local_doctrine.py index 6e94fb35f..824b0a27b 100644 --- a/packages/microcosm-build/tests/test_uk_local_doctrine.py +++ b/packages/microcosm-build/tests/test_uk_local_doctrine.py @@ -14,9 +14,12 @@ import pytest from microcosm.build.uk_runtime import ( + UK_LOCAL_CLONE_COUNT, UK_LOCAL_MAX_WEIGHT_RATIO, UK_LOCAL_SOLVE_DOCTRINE, + UK_LOCAL_SOLVE_EPOCHS, UK_LOCAL_TARGET_LOSS_CAP, + UK_LOCAL_TARGET_WEIGHT_RULE, UKLocalSolveDoctrine, past_cap_census, uk_local_doctrine_with_overrides, @@ -80,15 +83,21 @@ def test_past_cap_census_defaults_scales_and_validates_shapes() -> None: def test_doctrine_constants_are_the_declared_contract() -> None: + # microcosm#762 rulings of 2026-09-03 (A2 rule, A3 bound, K, epochs); + # each is a measured choice recorded in the receipts (R6-R10). Moving + # one is a doctrine revision: edit the constant, its note, and this pin. assert UK_LOCAL_TARGET_LOSS_CAP == 10.0 - assert UK_LOCAL_MAX_WEIGHT_RATIO == 100.0 + assert UK_LOCAL_MAX_WEIGHT_RATIO == 10.0 + assert UK_LOCAL_TARGET_WEIGHT_RULE == "grain_equal" + assert UK_LOCAL_SOLVE_EPOCHS == 1500 + assert UK_LOCAL_CLONE_COUNT == 15 assert UK_LOCAL_SOLVE_DOCTRINE.target_loss_cap == UK_LOCAL_TARGET_LOSS_CAP assert UK_LOCAL_SOLVE_DOCTRINE.max_weight_ratio == UK_LOCAL_MAX_WEIGHT_RATIO assert UK_LOCAL_SOLVE_DOCTRINE.scale_rule == "default_target_loss_scales" - assert UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule == "uniform" - assert UKLocalSolveDoctrine( - target_weight_rule="grain_equal" - ).target_weight_rule == ("grain_equal") + assert UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule == "grain_equal" + assert UKLocalSolveDoctrine(target_weight_rule="uniform").target_weight_rule == ( + "uniform" + ) def test_grain_equal_weights_give_each_grain_one_equal_share() -> None: @@ -104,11 +113,11 @@ def test_grain_equal_weights_give_each_grain_one_equal_share() -> None: def test_local_doctrine_override_is_receipted_and_bounds_are_frozen() -> None: doctrine, receipt = uk_local_doctrine_with_overrides( UK_LOCAL_SOLVE_DOCTRINE, - {"target_weight_rule": "grain_equal"}, + {"target_weight_rule": "uniform"}, ) - assert doctrine.target_weight_rule == "grain_equal" + assert doctrine.target_weight_rule == "uniform" assert receipt == { - "target_weight_rule": {"default": "uniform", "effective": "grain_equal"} + "target_weight_rule": {"default": "grain_equal", "effective": "uniform"} } with pytest.raises(ValueError, match="reviewed constants"): uk_local_doctrine_with_overrides( diff --git a/packages/microcosm-build/tests/test_uk_measure_simulation.py b/packages/microcosm-build/tests/test_uk_measure_simulation.py index abcd97789..1017f6188 100644 --- a/packages/microcosm-build/tests/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/test_uk_measure_simulation.py @@ -40,9 +40,7 @@ def table(self, entity): def _stub_value_type(values): """The policyengine ``value_type`` a real variable definition would carry.""" - return {"f": float, "i": int, "b": bool}.get( - np.asarray(values).dtype.kind, str - ) + return {"f": float, "i": int, "b": bool}.get(np.asarray(values).dtype.kind, str) class SimulationStub: @@ -118,7 +116,9 @@ def test_compute_uk_measure_input_numeric_map_to_entity(): def test_compute_uk_measure_input_refuses_unknown_and_length_mismatch(): with pytest.raises(KeyError, match="no variable"): - compute_uk_measure_input(FrameStub(), SimulationStub({}), "person", "missing", 2025) + compute_uk_measure_input( + FrameStub(), SimulationStub({}), "person", "missing", 2025 + ) sim = SimulationStub({"income_tax": ("person", np.array([1.0]))}) with pytest.raises(ValueError, match="produced 1 values"): @@ -149,7 +149,9 @@ def test_exclusion_loader_refusals(tmp_path: Path): with pytest.raises(ValueError, match="schema_version"): load_uk_calibration_measure_exclusions( - _write_exclusions(tmp_path / "bad-version.json", {**base, "schema_version": 1}) + _write_exclusions( + tmp_path / "bad-version.json", {**base, "schema_version": 1} + ) ) with pytest.raises(ValueError, match="unknown top-level"): load_uk_calibration_measure_exclusions( @@ -183,7 +185,9 @@ def test_exclusion_loader_refusals(tmp_path: Path): {**base, "exclusions": [_entry(expires_on="2026-08-25")]}, ) ) - with pytest.raises(ValueError, match="unknown UK calibration measure exclusion field"): + with pytest.raises( + ValueError, match="unknown UK calibration measure exclusion field" + ): load_uk_calibration_measure_exclusions( _write_exclusions( tmp_path / "extra-field.json", @@ -202,8 +206,12 @@ def test_exclusion_loader_refusals(tmp_path: Path): def test_exclusion_applier_returns_pruned_registry_and_receipt(): registry = TargetRegistry( [ - TargetSpec(name="drop", entity="person", measure="drop", value=1.0, source="test"), - TargetSpec(name="keep", entity="person", measure="keep", value=1.0, source="test"), + TargetSpec( + name="drop", entity="person", measure="drop", value=1.0, source="test" + ), + TargetSpec( + name="keep", entity="person", measure="keep", value=1.0, source="test" + ), ], country="uk", ) @@ -246,7 +254,9 @@ def test_exclusion_applier_returns_pruned_registry_and_receipt(): def test_exclusion_applier_warns_within_week_of_expiry(): registry = TargetRegistry( [ - TargetSpec(name="drop", entity="person", measure="drop", value=1.0, source="test"), + TargetSpec( + name="drop", entity="person", measure="drop", value=1.0, source="test" + ), ], country="uk", ) @@ -280,18 +290,35 @@ def test_exclusion_applier_warns_within_week_of_expiry(): _PACKAGED_EXCLUSION_CENSUS = { "hmrc.salary_sacrifice.": 5, "_1_000_000_to_inf": 11, - "slc.": 3, + "slc.": 5, "dwp/uc_payment_dist/": 16, "obr.universal_credit_": 2, "ons.household_composition.": 3, "obr.fuel_duties": 1, + # microcosm#762 A16 (2026-09-03): the rows the spine cannot reach by + # reweighting — land values, savings interest, housing benefit, the two + # plan-2 borrower stocks and JSA claimants — windowed to one month. + "ons.land.": 2, + "ons.savings_interest_income": 1, + "obr.housing_benefit": 1, + "dwp.jsa_claimants": 1, } +_A16_UNREACHABLE_ROWS = ( + "ons.land.corporate_land_value", + "ons.land.land_value", + "ons.savings_interest_income", + "obr.housing_benefit", + "slc.borrowers.plan_2_liable", + "slc.borrowers.plan_2_above_threshold", + "dwp.jsa_claimants", +) + def test_packaged_exclusions_load(): exclusions = load_uk_calibration_measure_exclusions() names = [entry["name"] for entry in exclusions] - assert len(names) == len(set(names)) == 44 + assert len(names) == len(set(names)) == 51 for marker, expected in _PACKAGED_EXCLUSION_CENSUS.items(): matched = [name for name in names if marker in name] @@ -322,6 +349,15 @@ def test_packaged_exclusions_load(): if entry["name"].startswith("ons.household_composition."): assert entry["tracking"] == "microcosm#791", entry["name"] + # The 2026-09-03 tranche is #762's A16: seven unreachable national rows, + # a one-month window, tracked on the WS-C deferrals issue. + a16 = [e for e in exclusions if e["approved_on"] == "2026-09-03"] + assert sorted(e["name"] for e in a16) == sorted(_A16_UNREACHABLE_ROWS) + for entry in a16: + assert entry["expires_on"] == "2026-10-03", entry["name"] + assert entry["tracking"] == "microcosm#736", entry["name"] + assert "A16" in entry["adjudication"], entry["name"] + # The lever targets are deliberately NOT excluded: the six UC # caseload / two-child-limit cells ride the would_claim_uc lever run. # Exclusions cannot move surviving cells because band edges are pinned @@ -380,7 +416,10 @@ def __init__(self, *, dataset): assert direct.receipt()["policyengine_uk_version"] == "9.9.9" assert scratch.receipt()["mode"] == "scratch_frame_export" assert writes == [(frame, tmp_path / "simulation-input.h5")] - assert created == [str(tmp_path / "input.h5"), str(tmp_path / "simulation-input.h5")] + assert created == [ + str(tmp_path / "input.h5"), + str(tmp_path / "simulation-input.h5"), + ] def _resolver_over(sim, monkeypatch, tmp_path: Path) -> UKMeasureResolver: diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index 41e4cd1e8..254a13962 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -439,10 +439,13 @@ def test_candidate_build_writes_calibrated_h5_and_evidence( ) assert manifest["parameters"]["doctrine"] == { "target_loss_cap": 10.0, - "max_weight_ratio": 100.0, + "max_weight_ratio": 10.0, "scale_rule": "default_target_loss_scales", - "target_weight_rule": "uniform", + "target_weight_rule": "grain_equal", + "solve_epochs": 1500, + "clone_count": 15, } + assert manifest["ladder_household_uprating"]["applied"] is False assert manifest["solve"]["n_targets"] == 4 assert manifest["solve"]["n_households"] == 416 assert np.isfinite(manifest["solve"]["initial_loss"]) @@ -642,7 +645,7 @@ def compact_sampler_forbidden(*_args, **_kwargs): str(output_dir), ] ).n_clones - == 4 + == builder.UK_LOCAL_CLONE_COUNT ) with pytest.raises(ValueError, match="must equal --n-clones"): builder.main( @@ -1674,3 +1677,40 @@ def test_gate_criticality_reads_fail_closed() -> None: ) assert blocking == ["[uk_local_area_support] ESS 42.3 < 50"] assert diagnostic == ["[uk_local_weight_ratio] ratio 578 > 100"] +def test_release_candidate_refuses_non_doctrine_solve_settings(tmp_path) -> None: + builder = _load_builder_module() + pin = "0" * 64 + base = [ + "--input-h5", + str(tmp_path / "spine.h5"), + "--input-sha256", + pin, + "--ladder", + str(tmp_path / "ladder.npz"), + "--ladder-sha256", + pin, + "--ledger-facts", + str(tmp_path / "ledger"), + "--ledger-facts-sha256", + pin, + "--ledger-manifest-sha256", + pin, + "--out", + str(tmp_path / "out"), + "--release-candidate", + ] + # The doctrine defaults are the release posture: nothing to refuse. + args = builder._parse_args(base) + builder._validate_cli_args(args) + assert args.n_clones == builder.UK_LOCAL_CLONE_COUNT == 15 + assert args.epochs == builder.UK_LOCAL_SOLVE_EPOCHS == 1500 + assert args.target_weight_rule == "grain_equal" + + with pytest.raises(ValueError, match=r"--epochs != doctrine 1500"): + builder._validate_cli_args(builder._parse_args([*base, "--epochs", "512"])) + with pytest.raises(ValueError, match=r"--n-clones != doctrine 15"): + builder._validate_cli_args(builder._parse_args([*base, "--n-clones", "10"])) + with pytest.raises(ValueError, match=r"--target-weight-rule"): + builder._validate_cli_args( + builder._parse_args([*base, "--target-weight-rule", "uniform"]) + ) diff --git a/tools/build_uk_rowwise_candidate.py b/tools/build_uk_rowwise_candidate.py index df96d0234..eb39f1ffc 100644 --- a/tools/build_uk_rowwise_candidate.py +++ b/tools/build_uk_rowwise_candidate.py @@ -57,8 +57,10 @@ from microcosm.build.target_materialization import resolve_target_measures from microcosm.build.uk_runtime import ( UK_GATE_REGISTRY, + UK_LOCAL_CLONE_COUNT, UK_LOCAL_MAX_WEIGHT_RATIO, UK_LOCAL_SOLVE_DOCTRINE, + UK_LOCAL_SOLVE_EPOCHS, UK_LOCAL_TARGET_LOSS_CAP, CalibrationFrameAdapter, UKLadderRowwiseDatasetResult, @@ -91,6 +93,8 @@ spine_provenance_from_sidecar, uk_household_weight_kind, uk_ladder_area_support_summary, + uk_ladder_household_uprating, + uk_ledger_households_total, uk_local_doctrine_with_overrides, uk_local_target_surface, uk_support_limited_misses, @@ -560,7 +564,7 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace: parser.add_argument( "--target-weight-rule", choices=("uniform", "grain_equal"), - default="uniform", + default=UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule, ) parser.add_argument("--release-candidate", action="store_true") parser.add_argument("--skip-holdout", action="store_true") @@ -570,7 +574,7 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace: required=True, help="Output directory for the candidate H5 and evidence sidecars.", ) - parser.add_argument("--n-clones", type=int, default=4) + parser.add_argument("--n-clones", type=int, default=UK_LOCAL_CLONE_COUNT) parser.add_argument( "--candidate-clone-counts", type=_candidate_clone_counts_argument, @@ -600,7 +604,7 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace: help="Survey year recorded for lineage (calibration uses the FRS release year).", ) parser.add_argument("--source-lineage-modulus", type=int) - parser.add_argument("--epochs", type=int, default=512) + parser.add_argument("--epochs", type=int, default=UK_LOCAL_SOLVE_EPOCHS) parser.add_argument("--learning-rate", type=float, default=0.15) parser.add_argument( "--expected-constituency-vintage", @@ -761,11 +765,45 @@ def _run_candidate( ladder = load_uk_oa_ladder(ladder_path) target_provenance = ladder_target_provenance(ladder) joint_inputs = _load_joint_target_inputs(args) + if joint_inputs is not None: + # microcosm#762 A15: the ladder's census household counts bind at + # the calibration year through one national factor from the + # Ledger's published UK household total (fail-closed by name on a + # real Ledger artifact; a synthetic artifact without facts binds + # the rows as published and says so, which the release posture + # refuses). + facts = getattr(joint_inputs.get("artifact"), "facts", None) + if facts is None: + joint_inputs["ladder_household_uprating"] = { + "applied": False, + "reason": ( + "the joint target inputs carry no Ledger facts; ladder " + "household rows bind at their census vintage." + ), + } + else: + joint_inputs["ladder_household_uprating"] = ( + uk_ladder_household_uprating( + ladder, + uk_ledger_households_total( + facts, period=joint_inputs["calibration_year"] + ), + period=joint_inputs["calibration_year"], + ) + ) + if args.release_candidate and not joint_inputs[ + "ladder_household_uprating" + ].get("applied"): + raise SystemExit( + "error: --release-candidate requires the A15 ladder household " + "uprating: " + + str(joint_inputs["ladder_household_uprating"].get("reason")) + ) doctrine, doctrine_override = uk_local_doctrine_with_overrides( UK_LOCAL_SOLVE_DOCTRINE, ( {} - if args.target_weight_rule == "uniform" + if args.target_weight_rule == UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule else {"target_weight_rule": args.target_weight_rule} ), ) @@ -861,6 +899,7 @@ def _run_candidate( reviewed_unbound_higher_targets=joint_inputs[ "reviewed_unbound_higher_targets" ], + ladder_household_uprating=joint_inputs.get("ladder_household_uprating"), ) args._rung_surface = rung_surface args._bound_families = tuple(bound_families) @@ -1263,6 +1302,7 @@ def _build_joint_problem( period: int, sample_fraction: float, reviewed_unbound_higher_targets: Mapping[str, Mapping[str, object]], + ladder_household_uprating: Mapping[str, Any] | None = None, ) -> tuple[ pd.DataFrame, UKRowwiseLocalMatrix, @@ -1297,6 +1337,7 @@ def _build_joint_problem( bound_national_target_ids=national_ids, period=period, reviewed_unbound_higher_targets=reviewed_unbound_higher_targets, + ladder_household_uprating=ladder_household_uprating, ) covered = { grain: set(values.astype(str).tolist()) for grain, values in assigned.items() @@ -1425,6 +1466,7 @@ def _joint_dry_run_plan( bound_national_target_ids=_national_contract_target_ids(national_registry), period=joint_inputs["calibration_year"], reviewed_unbound_higher_targets=joint_inputs["reviewed_unbound_higher_targets"], + ladder_household_uprating=joint_inputs.get("ladder_household_uprating"), ) household = clone.frame.table("household") covered = { @@ -2313,6 +2355,10 @@ def _manifest( ), "releasable": releasable, "release_posture": release_posture, + "ladder_household_uprating": dict( + cross_grain.get("ladder_household_uprating") + or {"applied": False, "reason": "no cross-grain receipt"} + ), "blocked_at_f100": bool(getattr(args, "_blocked_failures", [])), "blocking_failures": list(getattr(args, "_blocked_failures", [])), "diagnostic_failures": list(getattr(args, "_diagnostic_failures", [])), @@ -2403,6 +2449,8 @@ def _doctrine_bounds() -> dict[str, Any]: "max_weight_ratio": float(UK_LOCAL_MAX_WEIGHT_RATIO), "scale_rule": UK_LOCAL_SOLVE_DOCTRINE.scale_rule, "target_weight_rule": UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule, + "solve_epochs": int(UK_LOCAL_SOLVE_EPOCHS), + "clone_count": int(UK_LOCAL_CLONE_COUNT), } @@ -2504,8 +2552,12 @@ def _validate_cli_args(args: argparse.Namespace) -> None: + ", ".join(missing_release) ) refused = [] - if args.target_weight_rule != "uniform": + if args.target_weight_rule != UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule: refused.append("--target-weight-rule") + if args.epochs != UK_LOCAL_SOLVE_EPOCHS: + refused.append(f"--epochs != doctrine {UK_LOCAL_SOLVE_EPOCHS}") + if args.n_clones != UK_LOCAL_CLONE_COUNT: + refused.append(f"--n-clones != doctrine {UK_LOCAL_CLONE_COUNT}") if args.measure_exclusions is not None: refused.append("--measure-exclusions") if args.skip_holdout: From 4b5f2216fc4e9db793e990af0549114772fec476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 16:18:20 +0200 Subject: [PATCH 10/26] Receipts R13: first release-candidate run; battery attests the release posture; manifest records measure exclusions (#762) Under the ruled doctrine (bound 10, grain_equal, K=15, 1500 epochs, A15 uprating, A16 exclusions) every release-blocking gate passes: national 94.7 percent within 10 percent, max/median weight 398 (was 2,857), median constituency ESS 219, households 28.93M, holdout mean 0.204 versus 0.304 uncalibrated. Tenure falls to 87 percent within 10 percent because its census-2021 cells were not uprated with the household rows (proposed A17). Driver: the gate battery now receives release_candidate from the CLI instead of a hard-coded False, and the manifest carries the measure exclusions the national compile stood on. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 30 +++++++++++++++++++ .../tests/test_uk_rowwise_candidate.py | 2 ++ tools/build_uk_rowwise_candidate.py | 21 +++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index b6b4a5cf9..39098320e 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -243,3 +243,33 @@ Applied on this branch in one commit; every constant is the measured choice abov **A16 — seven reviewed measure exclusions, one-month window (approved 2026-09-03, expire 2026-10-03), tracked on microcosm#736.** `ons.land.corporate_land_value` (8.7×), `ons.land.land_value` (2.5×), `ons.savings_interest_income` (−86 %), `obr.housing_benefit` (−78 %), `slc.borrowers.plan_2_liable` (−65 %), `slc.borrowers.plan_2_above_threshold` (−69 %), `dwp.jsa_claimants` (1.8×) — each unreachable by reweighting within the stretch bound on spine-m (R8–R10), each a frame-side gap; the register now holds 51 entries. None of the seven is a cross-grain bridge member, so no bridge classification changes. Verification on this commit: doctrine / candidate / ledger / measure-simulation / rowwise files 99 passed; country spec, battery bindings, seam driver, scorer and the microcosm-data contract suite 543 passed, 1 skipped; both censuses current; `ci_test_groups.py --verify` ok; `ruff check` clean; no pinned digest moved. The release-candidate run (R13) applies all of this under `--release-candidate` with holdout. + +## R13 — First release-candidate run under the ruled doctrine (2026-09-03; `--release-candidate`, K=15, `grain_equal`, bound 10, 1500 epochs, A15 uprating, A16 exclusions, single engine block, holdout on) + +Run from PR B at b59563ba; every pin verified; chained on R11's row. Wall 11,903 s (3.3 h: engine 12 min, main solve ~35 min, five holdout folds ~2.5 h); peak 9.3 GB. **Every release-blocking gate passed; the manifest says `releasable: true`; exit 0.** Matrix 20,473 rows (357 national after the seven A16 exclusions, 19,105 local, 1,011 ladder) × 792,690. + +| | G (1500, pre-ruling, R10) | **RC (R13)** | +|---|---|---| +| loss initial → final | 0.3195 → 0.0184 | 0.3041 → 0.0156 | +| max / positive-median weight | 2,857 | **398** | +| ESS fraction / top-1 % share | 0.105 / 0.187 | **0.161** / 0.161 | +| constituency ESS min / median | 54.6 / 133 | **65.7 / 219** | +| mass factor → households | 0.967 → 28.28M | **0.989 → 28.93M** (FRS grossing 29.25M) | +| lone over-65 households (target 4.25M) | 4.11M | **4.24M** | +| local within 10 %: age / census / HMRC / UC / tenure / council tax | 100 / 98.8 / 98.9 / 99.9 / 97.3 / 86.8 | 100 / 99.3 / 99.2 / 99.9 / **87.3** / **91.5** | +| local cells past 25 % (diagnostic) | 116 | **40** | +| national within 10 % / 25 % | 93.1 / 97.8 | **94.7 / 99.2** | +| national within 10 %: SPI / UC / population / OBR / two-child / composition | 98 / 99 / 100 / 71 / 100 / 71 | 98 / 99 / 100 / 70 / 100 / **86** | +| Glasgow social rent (target 102k) | 203k | 150k | +| holdout (5 rotated folds, 4,023 local rows each, national rows in training) | not run | mean 0.204, worst 0.213 (uncalibrated 0.304) | + +Readings: + +1. **A16 did what it was for.** With the seven unreachable rows out, the solver stops paying for them: the max/median ratio falls from 2,857 to 398 and the median constituency ESS rises from 133 to 219, while national fit improves (94.7 / 99.2) and the composition family goes from 71 to 86 % within 10 %. +2. **A15 closes the mass and composition flags.** Households calibrate to 28.93M (1.1 % under the FRS grossing, against 3.3 % under the census-vintage rows); lone over-65 households land 0.4 % from the ONS row; council-tax fit rises to 91.5 % because the VOA 2025 stock and the uprated household rows now agree. +3. **A15 exposes the next vintage seam: tenure.** The tenure cells are the same census-2021 household universe split by tenure, and they were not uprated: per local authority they sum to 95.7 % of the uprated household row (98.9 % before). The solver holds the household rows (−0.1 %) and lets the tenure cells overshoot, and it puts the overshoot where the age and composition rows push it — owned outright, +8.2 % median, 123 of 359 authorities past +10 % (owned with mortgage +1.2 %, private rent +0.8 %, social rent +0.7 %, none below −10 %). This is not a fit failure of the solve; it is the tenure family binding at 2021 while everything around it binds at 2025. **Proposed ruling A17:** uprate the census-vintage tenure cells by the same national household factor (they carry `uprating_from_period` 2021/22 holds today), receipted like the ladder rows; expected effect from these numbers: tenure back above 95 % within 10 %, owned outright ~+4.7 % median. +4. **Holdout is now measured.** Cells the solve never saw come out at a mean capped relative error of 0.204 (worst fold 0.213) against 0.304 uncalibrated and 0.0156 in-sample: the local calibration improves unseen cells by a third and fits its own cells thirteen times better than that. This is the number the release contract should publish beside the in-sample fit. +5. **Two evidence defects found on this run, fixed on this branch for the next:** (a) the driver ran the gate battery in the non-release posture even under `--release-candidate` (`release_candidate=False` hard-coded), so the signed report says `release_candidate: false, shippable: false`; the battery now attests the posture it ran under (a release candidate also blocks on absent evidence); (b) the manifest never recorded the measure exclusions the national compile stood on; it now carries `measure_exclusions` (name → register record; 51 on the live compile) beside `ladder_household_uprating`. The next release-candidate run (after A17) verifies both on the live artifact. +6. Remaining diagnostic misses: 40 local cells past 25 %, led by the Kensington / Westminster / Cities of London self-employment amounts (−95 %; the frame carries a twelfth of HMRC's amount there; adjudicated under `hmrc_spi_frame_model_proxy`) and Glasgow social rent (+46 %). The `weight_ratio` diagnostic (max/median 398 against 100) stays red by construction of the design weights. + +Artifact: `data/ukds/acceptance/762-rowwise-candidate/spine-m/f100-k15-RC/microcosm_uk_2025_local.h5` (792,690 rows) with its manifest, gate report, diagnostics and Logbook row (disposition `iterating`). Not published; the release contract, scoring against the incumbent and the shippable attestation are the next items. diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index 254a13962..fc00945d6 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -1181,6 +1181,8 @@ def support_summary(household, ladder_arg): assert "fanout_controls_summed" not in f100["cross_grain"] assert "fanout_controls_summed" not in f100["solve"]["cross_grain"] assert f100["releasable"] is True + assert f100["measure_exclusions"] == joint_inputs["measure_exclusions"] + assert f100["ladder_household_uprating"]["applied"] is False assert _spool_rows(f100_out)[0].rung == "f100" f001_out = tmp_path / "joint-f001" diff --git a/tools/build_uk_rowwise_candidate.py b/tools/build_uk_rowwise_candidate.py index eb39f1ffc..d24ad137b 100644 --- a/tools/build_uk_rowwise_candidate.py +++ b/tools/build_uk_rowwise_candidate.py @@ -1003,6 +1003,9 @@ def _run_candidate( if args.sample_fraction == 1.0 else ("uk_local_geography_ladder_post_calibration",) ), + # The battery attests the posture it ran under: a release + # candidate blocks on absent evidence and can be shippable. + release_candidate=bool(args.release_candidate), ) except GateBatteryBlockedError: # Write-then-block, extended to the whole evidence bundle: a @@ -1750,6 +1753,7 @@ def _run_local_gate_battery( release_id: str, evaluated_on: date, enforce_only: tuple[str, ...] | None = None, + release_candidate: bool = False, ) -> tuple[dict[str, object], GateResult]: manifest = uk_scoped_gate_manifest( UK_LOCAL_GATE_SCOPE, @@ -1760,7 +1764,7 @@ def _run_local_gate_battery( manifest, release_id=release_id, report_path=report_path, - release_candidate=False, + release_candidate=release_candidate, registry=UK_GATE_REGISTRY, ) phase = battery.run_phase( @@ -1795,7 +1799,7 @@ def _run_local_gate_battery( raise ValueError(f"enforce_only names unknown local gates: {unknown}.") selected_blocking = [ outcome - for outcome in phase.blocking_outcomes(release_candidate=False) + for outcome in phase.blocking_outcomes(release_candidate=release_candidate) if outcome.entry.id in enforce_only ] if selected_blocking: @@ -2359,6 +2363,19 @@ def _manifest( cross_grain.get("ladder_household_uprating") or {"applied": False, "reason": "no cross-grain receipt"} ), + # The reviewed measure exclusions the national compile stood on + # (name -> register record), so the narrowing is in the evidence. + "measure_exclusions": { + str(name): dict(record) + for name, record in sorted( + ( + (getattr(args, "_joint_inputs_receipt", None) or {}).get( + "measure_exclusions" + ) + or {} + ).items() + ) + }, "blocked_at_f100": bool(getattr(args, "_blocked_failures", [])), "blocking_failures": list(getattr(args, "_blocked_failures", [])), "diagnostic_failures": list(getattr(args, "_diagnostic_failures", [])), From 1f846f1cfb29c4183a5a92b1fe3267b51b8c0a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 16:29:22 +0200 Subject: [PATCH 11/26] Receipts R14: score the release candidate against the incumbent; receipt areas the incumbent lacks (#762) On the 19,089 rows both can estimate the candidate's capped loss is 0.0146 against the incumbent's 0.181 (98.0 versus 60.4 percent within 10 percent; 16,973 versus 2,116 head-to-head wins). The incumbent has no weights for Northern Ireland's N09000011, so the scorer now records incumbent_missing_areas and scores those 16 rows candidate-only instead of refusing; the candidate's full-surface loss and its loss on the compared rows are both reported. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 17 +++++ .../tests/test_uk_local_candidate_scorer.py | 47 +++++++++++- tools/score_uk_local_candidate.py | 73 ++++++++++++++++--- 3 files changed, 127 insertions(+), 10 deletions(-) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 39098320e..0c483730f 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -273,3 +273,20 @@ Readings: 6. Remaining diagnostic misses: 40 local cells past 25 %, led by the Kensington / Westminster / Cities of London self-employment amounts (−95 %; the frame carries a twelfth of HMRC's amount there; adjudicated under `hmrc_spi_frame_model_proxy`) and Glasgow social rent (+46 %). The `weight_ratio` diagnostic (max/median 398 against 100) stays red by construction of the design weights. Artifact: `data/ukds/acceptance/762-rowwise-candidate/spine-m/f100-k15-RC/microcosm_uk_2025_local.h5` (792,690 rows) with its manifest, gate report, diagnostics and Logbook row (disposition `iterating`). Not published; the release contract, scoring against the incumbent and the shippable attestation are the next items. + +## R14 — Scoring the release candidate against the incumbent on the frozen local surface (2026-09-03) + +Incumbent side extracted with `tools/extract_uk_local_incumbent_surface.py` from the private-repo snapshot `7b0a06f0` (`enhanced_frs_2024_25.h5`, the two wide weight tables, the 2024 constituency and 2021 local-authority rosters; period 2025; policyengine-uk 2.92.1 metrics on the incumbent's 52,846 households; 32 s): `incumbent_local_weights.csv` sha 678b77c8b54a6515…, `incumbent_household_metrics.csv` sha a06ef3cd8211a68d…. Register: the 19,105 active local references compiled from the pinned Ledger artifact at 2025 (`scoring_registry_compiled.json`, version f66248d3bbd6, sha 73b344b15fc20b46…). Candidate side: R13's schema-6 diagnostics. Output `score_vs_incumbent.json` sha 9365f1cc227dae3a…. + +The incumbent ships 360 local authorities against the register's 361 — Northern Ireland's `N09000011` has no weight column — so the scorer now receipts `incumbent_missing_areas` and scores those rows candidate-only instead of refusing (a fitted row the incumbent cannot estimate is not a row disappearing): 19,089 rows compared, 16 candidate-only. + +| on the 19,089 compared rows | candidate (R13) | incumbent | +|---|---|---| +| capped relative-error loss (cap 10) | **0.0146** | 0.181 | +| within 10 % / 25 % | **98.0 % / 99.8 %** | 60.4 % / 82.4 % | +| median abs relative error | **0.0083** | 0.0709 | +| head-to-head target wins | **16,973** | 2,116 (0 ties) | +| wins by source family, candidate / incumbent | population 7,076 / 988 · HMRC 3,840 / 187 · UC 3,449 / 59 · council tax 1,318 / 740 · housing 1,290 / 142 | | +| candidate holdout on unseen rows (R13) | 0.204 | not measurable | + +Reading, with the caveat that matters: the candidate is scored **in-sample** on rows it fitted, while the incumbent is scored on our 2025 register, not on the surface it was calibrated to. The like-for-like number is the candidate's holdout: on rows it never saw the candidate's loss (0.204) is about the incumbent's in-sample loss on our register (0.181). The candidate therefore fits the published 2025 local surface far better than the incumbent, and generalizes to untargeted cells roughly as well as the incumbent fits targeted ones. Council tax is where the incumbent stays closest (740 of 2,058 wins), consistent with R13's remaining band misses. diff --git a/packages/microcosm-build/tests/test_uk_local_candidate_scorer.py b/packages/microcosm-build/tests/test_uk_local_candidate_scorer.py index e1f57c728..cad92957c 100644 --- a/packages/microcosm-build/tests/test_uk_local_candidate_scorer.py +++ b/packages/microcosm-build/tests/test_uk_local_candidate_scorer.py @@ -131,13 +131,18 @@ def test_local_scorer_reports_per_family_wins_and_the_measured_holdout() -> None "candidate_target_wins": 0, "incumbent_target_wins": 0, "ties": 1, + "incumbent_absent": 0, }, "hmrc_income": { "candidate_target_wins": 1, "incumbent_target_wins": 0, "ties": 0, + "incumbent_absent": 0, }, } + assert result["rows_compared"] == 2 + assert result["rows_candidate_only"] == 0 + assert result["incumbent_missing_areas"] == {} def test_local_scorer_refuses_a_non_frozen_surface() -> None: @@ -201,7 +206,8 @@ def test_local_scorer_joins_the_incumbent_on_household_id() -> None: ) # Pin the joined values themselves, so a silent revert to positional # pairing (which would give 8.0 and 50.0 here) fails rather than drifts. - incumbent = scorer._incumbent_estimates(registry, weights, metrics) + incumbent, missing_areas = scorer._incumbent_estimates(registry, weights, metrics) + assert missing_areas == {} assert incumbent["households@E1@2025"] == pytest.approx(10.0) assert incumbent["income@W1@2025"] == pytest.approx(70.0) @@ -426,3 +432,42 @@ def test_local_scorer_accepts_a_summary_its_folds_actually_produce() -> None: ) assert result["candidate_holdout_loss"] == pytest.approx(summary.mean_holdout_loss) + + +def test_local_scorer_receipts_areas_the_incumbent_lacks() -> None: + scorer = _load_scorer() + registry, candidate, weights, metrics = _case() + weights = weights.drop(columns=["W1"]) + + result = scorer.score_uk_local_candidate( + candidate_diagnostics=candidate, + incumbent_weights=weights, + incumbent_metrics=metrics, + target_registry=registry, + expected_reference_count=2, + ) + + assert result["incumbent_missing_areas"] == {"W1": 1} + assert result["rows_compared"] == 1 + assert result["rows_candidate_only"] == 1 + assert result["candidate_target_wins"] + result["incumbent_target_wins"] <= 1 + absent = [ + row for row in result["target_drift"] if row["winner"] == "incumbent_absent" + ] + assert [row["target"] for row in absent] == [registry.specs[1].to_target().row_name] + assert absent[0]["incumbent_relative_error"] is None + assert result["target_wins_by_family"]["hmrc_income"]["incumbent_absent"] == 1 + # The full-surface candidate loss still covers both rows; the compared + # aggregates cover one. + assert result["candidate_fitted_surface_loss"] != pytest.approx( + result["candidate_fitted_surface_loss_on_compared_rows"] + ) + + with pytest.raises(ValueError, match="cover none of the registry"): + scorer.score_uk_local_candidate( + candidate_diagnostics=candidate, + incumbent_weights=weights.drop(columns=["E1"]), + incumbent_metrics=metrics, + target_registry=registry, + expected_reference_count=2, + ) diff --git a/tools/score_uk_local_candidate.py b/tools/score_uk_local_candidate.py index 885ddde7a..bd13c7844 100644 --- a/tools/score_uk_local_candidate.py +++ b/tools/score_uk_local_candidate.py @@ -262,12 +262,23 @@ def _incumbent_estimates( registry: TargetRegistry, incumbent_weights: pd.DataFrame, incumbent_metrics: pd.DataFrame, -) -> dict[str, float]: +) -> tuple[dict[str, float], dict[str, int]]: + """Estimate every registry row the incumbent can, and name the rest. + + An area absent from the incumbent's wide weight table (the incumbent + ships 360 local authorities against the register's 361: Northern + Ireland's ``N09000011`` has no column) is not a fitted row disappearing + — the incumbent simply has no estimate there. Those rows are returned + as ``missing_areas`` (area → row count) and scored candidate-only, with + the receipt saying so; the comparison never silently shrinks. + """ + incumbent_weights, incumbent_metrics = _align_on_household_id( incumbent_weights, incumbent_metrics, ) estimates: dict[str, float] = {} + missing_areas: dict[str, int] = {} for spec in registry.specs: area = str(spec.metadata.get("ledger_geography_id") or "") if not area: @@ -276,7 +287,8 @@ def _incumbent_estimates( "ledger_geography_id metadata." ) if area not in incumbent_weights.columns: - raise ValueError(f"incumbent wide weights are missing area {area!r}.") + missing_areas[area] = missing_areas.get(area, 0) + 1 + continue if spec.measure not in incumbent_metrics.columns: raise ValueError( f"incumbent household metrics are missing measure {spec.measure!r}." @@ -292,7 +304,12 @@ def _incumbent_estimates( f"incumbent inputs for {spec.to_target().row_name!r} are invalid." ) estimates[spec.to_target().row_name] = float(np.dot(weights, metric)) - return estimates + if not estimates: + raise ValueError( + "incumbent wide weights cover none of the registry's areas: " + f"{sorted(missing_areas)[:10]}." + ) + return estimates, dict(sorted(missing_areas.items())) def _relative_errors(estimates: np.ndarray, targets: np.ndarray) -> np.ndarray: @@ -341,7 +358,7 @@ def score_uk_local_candidate( candidate_diagnostics, target_registry, ) - incumbent = _incumbent_estimates( + incumbent, incumbent_missing_areas = _incumbent_estimates( target_registry, incumbent_weights, incumbent_metrics, @@ -354,8 +371,15 @@ def score_uk_local_candidate( [candidate[spec.to_target().row_name] for spec in target_registry.specs], dtype=np.float64, ) + compared_mask = np.array( + [spec.to_target().row_name in incumbent for spec in target_registry.specs], + dtype=bool, + ) incumbent_estimates = np.array( - [incumbent[spec.to_target().row_name] for spec in target_registry.specs], + [ + incumbent.get(spec.to_target().row_name, np.nan) + for spec in target_registry.specs + ], dtype=np.float64, ) candidate_errors = _relative_errors(candidate_estimates, targets) @@ -365,11 +389,28 @@ def score_uk_local_candidate( for index, spec in enumerate(target_registry.specs): name = spec.to_target().row_name candidate_error = float(candidate_errors[index]) - incumbent_error = float(incumbent_errors[index]) bucket = families.setdefault( spec.family, - {"candidate_target_wins": 0, "incumbent_target_wins": 0, "ties": 0}, + { + "candidate_target_wins": 0, + "incumbent_target_wins": 0, + "ties": 0, + "incumbent_absent": 0, + }, ) + if not compared_mask[index]: + bucket["incumbent_absent"] += 1 + drift.append( + { + "target": name, + "family": spec.family, + "candidate_relative_error": candidate_error, + "incumbent_relative_error": None, + "winner": "incumbent_absent", + } + ) + continue + incumbent_error = float(incumbent_errors[index]) if abs(candidate_error) < abs(incumbent_error): winner = "candidate" candidate_wins += 1 @@ -399,18 +440,32 @@ def score_uk_local_candidate( targets, target_loss_cap=UK_LOCAL_TARGET_LOSS_CAP, ) + # The incumbent's aggregate and the head-to-head candidate aggregate are + # both over the rows the incumbent can estimate; the candidate's full + # surface loss stays reported over every fitted row. incumbent_loss = relative_error_loss( - incumbent_estimates, - targets, + incumbent_estimates[compared_mask], + targets[compared_mask], + target_loss_cap=UK_LOCAL_TARGET_LOSS_CAP, + ) + candidate_loss_on_compared_rows = relative_error_loss( + candidate_estimates[compared_mask], + targets[compared_mask], target_loss_cap=UK_LOCAL_TARGET_LOSS_CAP, ) return { "candidate_fitted_surface_loss": candidate_loss, + "candidate_fitted_surface_loss_on_compared_rows": ( + candidate_loss_on_compared_rows + ), "candidate_holdout_loss": holdout["mean_holdout_loss"], "incumbent_fitted_surface_loss": incumbent_loss, "incumbent_holdout_loss": None, "candidate_target_wins": candidate_wins, "incumbent_target_wins": incumbent_wins, + "rows_compared": int(compared_mask.sum()), + "rows_candidate_only": int((~compared_mask).sum()), + "incumbent_missing_areas": incumbent_missing_areas, "rows_outside_register": rows_outside_register, "holdout_basis": holdout["basis"], "incumbent_holdout_basis": UK_LOCAL_INCUMBENT_HOLDOUT_BASIS, From 01b82522c12ee07527c51e946f0ad1cfb0d39a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:01:31 +0200 Subject: [PATCH 12/26] Erratum R15: land rows were mis-measured by per-block engine resolution; withdraw two A16 exclusions; receipt block sensitivity (#762) Comparing initial national estimates between the 15-block and single-block runs: corporate land value is exactly 15x under blocks (the policyengine-uk formula allocates a fixed national aggregate by share of the block's total weighted corporate wealth), total land value 5.4x, SLC repayments 1.7 percent; 361 of 364 rows identical. Single-block resolution puts the land rows within 3 and 9 percent of the ONS balance sheet, so their two exclusions are withdrawn (register 51 -> 49; A16 is five rows). The manifest's measure_resolution now names the known population-normalised measures and says a per-block run is not evidence for adjudicating them. Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 16 ++++++++++ .../uk/calibration_measure_exclusions.json | 18 ----------- .../tests/test_uk_measure_simulation.py | 14 ++++---- .../tests/test_uk_rowwise_candidate.py | 9 ++++++ tools/build_uk_rowwise_candidate.py | 32 +++++++++++++++++++ 5 files changed, 64 insertions(+), 25 deletions(-) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 0c483730f..e5d6ae837 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -290,3 +290,19 @@ The incumbent ships 360 local authorities against the register's 361 — Norther | candidate holdout on unseen rows (R13) | 0.204 | not measurable | Reading, with the caveat that matters: the candidate is scored **in-sample** on rows it fitted, while the incumbent is scored on our 2025 register, not on the surface it was calibrated to. The like-for-like number is the candidate's holdout: on rows it never saw the candidate's loss (0.204) is about the incumbent's in-sample loss on our register (0.181). The candidate therefore fits the published 2025 local surface far better than the incumbent, and generalizes to untargeted cells roughly as well as the incumbent fits targeted ones. Council tax is where the incumbent stays closest (740 of 2,058 wins), consistent with R13's remaining band misses. + +## R15 — Erratum: the ONS land rows were mis-measured by per-block engine resolution; two A16 exclusions withdrawn (2026-09-03) + +Found while answering María's question about the land "spine defects". Comparing the initial national estimates of the 15-block run (R10's G at 1500 epochs) with the single-block run (R11), **3 of 364 national rows differ**: + +| row | target | single block | 15 blocks | blocks / single | +|---|---|---|---|---| +| `ons.land.corporate_land_value` | £2.10tn | £2.04tn (−2.8 %) | £30.7tn | **15.000** | +| `ons.land.land_value` | £7.12tn | £6.47tn (−9.1 %) | £35.1tn | 5.42 | +| `slc.repayments.england_total_higher_education` | £5.02bn | £6.18bn (+23 %) | £6.07bn (+21 %) | 0.983 | + +Mechanism: policyengine-uk's `corporate_land_value` distributes the parameter `aggregate_corporate_land_value` (£2.06tn at 2021, the ONS balance sheet's non-financial-corporation land) to households by their share of **total weighted `corporate_sector_wealth`**; `land_value` adds it to `household_land_value`. Under `--engine-blocks K` the engine runs per clone block, so "total" is the block's total and every block reproduces the whole aggregate: K× for the corporate row, (household + K × corporate) / (household + corporate) for the total. Every run in R6–R10 used 10 or 15 blocks, so the land rows there were inflated 10× / 15× (the 8.7× and 2.5× "misses" were 10 × 0.97 − 1 and the mixed ratio). The SLC repayments row moves 1.7 % for the same class of reason (a population-normalised term) and is noted, not acted on. **No other national row is block-sensitive** (361 of 364 identical), so the A2/A3/K/epoch conclusions stand; the two land rows sat at the loss cap in those runs and contributed at most 0.018 of the 0.32 initial loss and ~0.003 of the final loss under `grain_equal`, and 1/20,480 each under `uniform`. + +Actions on this branch: the two land entries are withdrawn from `calibration_measure_exclusions.json` (51 → 49; A16 is five rows: savings interest, housing benefit, the two plan-2 borrower stocks, JSA claimants — all block-insensitive, so their evidence stands); the register test pins follow; the manifest's `measure_resolution` block now carries a `block_sensitivity` caveat naming the known population-normalised measures whenever `--engine-blocks > 1`, and the doctrine note is that **evidence from a per-block run must not adjudicate a population-normalised row** — the release posture is single-block already (R11: 10.2 GB at K=15). The #736 item and the R12 table need the same correction (drafted for María's go, not posted). The next release-candidate run binds both land rows. + +Savings interest, re-examined with the same care: the row is block-insensitive and the miss is real, but it is partly a **concept** gap, not only a frame gap. Three published figures: the FRS-based spine carries £13.8bn at 2025 (engine-uprated by the ONS HAXV index); HMRC's SPI 2023-24 taxable savings interest of taxpayers sums to £18.3bn across the income bands (taxpayers only, ISA interest excluded); the ONS row is UKEA HAXV, households' (S.14) D.41 interest **resources** in the national accounts — £95.5bn for 2025, up from £19.6bn in 2021 — which includes FISIM-adjusted interest and the household sector's unincorporated businesses. The spine is roughly a third under the HMRC taxpayer figure once uprated, which is a frame gap; the further four- to five-fold step to the ONS row is definitional. The right fix is a declared reconciliation on the target side (bind the SPI amount, or a declared D.41-to-cash bridge), not only a spine imputation — that is what the spine issue should ask for. diff --git a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json index 214dc342e..21086e288 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/calibration_measure_exclusions.json @@ -397,24 +397,6 @@ "approved_on": "2026-08-26", "expires_on": "2026-11-26" }, - { - "name": "ons.land.corporate_land_value", - "reason": "The spine carries £20.4tn of corporate land value against the ONS £2.1tn (8.7x at initialization on spine-m; 2.7x after the K=15 solve at stretch bound 10): a land-imputation defect (units or a double draw) in the frame. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", - "tracking": "microcosm#736", - "approved_by": "juaristi22", - "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", - "approved_on": "2026-09-03", - "expires_on": "2026-10-03" - }, - { - "name": "ons.land.land_value", - "reason": "The spine carries £24.9tn of total land value against the ONS £7.1tn (2.5x at initialization on spine-m; still 1.6x after the K=15 solve at stretch bound 10): the same land-imputation defect as the corporate row. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", - "tracking": "microcosm#736", - "approved_by": "juaristi22", - "adjudication": "microcosm#762 (A16, ruling 2026-09-03; receipts R8-R10 in experiments/762-uk-rowwise-candidate-receipts.md)", - "approved_on": "2026-09-03", - "expires_on": "2026-10-03" - }, { "name": "ons.savings_interest_income", "reason": "The spine carries £13.8bn of savings interest income against the ONS £95.5bn (-86% at initialization on spine-m, -89% after the solve): the FRS interest income capture, not the weights. Unreachable by reweighting within the stretch bound: a frame-side gap, not a weight question; while bound it pulls the joint solve toward weight concentration (housing benefit alone triples the max/median ratio under grain_equal). One-month window: correct the spine or re-adjudicate.", diff --git a/packages/microcosm-build/tests/test_uk_measure_simulation.py b/packages/microcosm-build/tests/test_uk_measure_simulation.py index 1017f6188..d55b83e5e 100644 --- a/packages/microcosm-build/tests/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/test_uk_measure_simulation.py @@ -296,17 +296,17 @@ def test_exclusion_applier_warns_within_week_of_expiry(): "ons.household_composition.": 3, "obr.fuel_duties": 1, # microcosm#762 A16 (2026-09-03): the rows the spine cannot reach by - # reweighting — land values, savings interest, housing benefit, the two - # plan-2 borrower stocks and JSA claimants — windowed to one month. - "ons.land.": 2, + # reweighting — savings interest, housing benefit, the two plan-2 + # borrower stocks and JSA claimants — windowed to one month. The two + # ONS land rows first listed were withdrawn the same day (receipt R15): + # their apparent 8.7x / 2.5x misses were an artefact of per-block engine + # resolution, and single-block resolution puts them within 3 % and 9 %. "ons.savings_interest_income": 1, "obr.housing_benefit": 1, "dwp.jsa_claimants": 1, } _A16_UNREACHABLE_ROWS = ( - "ons.land.corporate_land_value", - "ons.land.land_value", "ons.savings_interest_income", "obr.housing_benefit", "slc.borrowers.plan_2_liable", @@ -318,7 +318,7 @@ def test_exclusion_applier_warns_within_week_of_expiry(): def test_packaged_exclusions_load(): exclusions = load_uk_calibration_measure_exclusions() names = [entry["name"] for entry in exclusions] - assert len(names) == len(set(names)) == 51 + assert len(names) == len(set(names)) == 49 for marker, expected in _PACKAGED_EXCLUSION_CENSUS.items(): matched = [name for name in names if marker in name] @@ -349,7 +349,7 @@ def test_packaged_exclusions_load(): if entry["name"].startswith("ons.household_composition."): assert entry["tracking"] == "microcosm#791", entry["name"] - # The 2026-09-03 tranche is #762's A16: seven unreachable national rows, + # The 2026-09-03 tranche is #762's A16: five unreachable national rows, # a one-month window, tracked on the WS-C deferrals issue. a16 = [e for e in exclusions if e["approved_on"] == "2026-09-03"] assert sorted(e["name"] for e in a16) == sorted(_A16_UNREACHABLE_ROWS) diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index fc00945d6..49633d68e 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -851,6 +851,15 @@ def receipt(self): ] assert receipt["blocks"] == 2 assert receipt["deviation"] == "per_clone_block_engine_resolution" + sensitivity = receipt["block_sensitivity"] + assert ( + "ons/corporate_land_value" + in sensitivity["known_population_normalised_measures"] + ) + assert set(sensitivity["present_in_this_run"]) <= set( + sensitivity["known_population_normalised_measures"] + ) + assert "not evidence for adjudication" in sensitivity["caveat"] assert ( metrics["constituency"].index.tolist() == clone.frame.table("household")["household_id"].tolist() diff --git a/tools/build_uk_rowwise_candidate.py b/tools/build_uk_rowwise_candidate.py index d24ad137b..b4b0273f4 100644 --- a/tools/build_uk_rowwise_candidate.py +++ b/tools/build_uk_rowwise_candidate.py @@ -429,6 +429,23 @@ def _resolve_candidate_engine_surface( } if blocks > 1: receipt["deviation"] = "per_clone_block_engine_resolution" + present = sorted( + column + for column in UK_BLOCK_SENSITIVE_MEASURE_COLUMNS + if column in measure_inputs + ) + receipt["block_sensitivity"] = { + "known_population_normalised_measures": list( + UK_BLOCK_SENSITIVE_MEASURE_COLUMNS + ), + "present_in_this_run": present, + "caveat": ( + "per-block engine resolution mis-measures population-normalised " + "formulas (each block reproduces a national aggregate); rows " + "on these measures are not evidence for adjudication from this " + "run. Resolve in a single block before ruling on them." + ), + } try: scratch_dir.rmdir() except OSError: @@ -1744,6 +1761,21 @@ def _local_diagnostics_registry( return TargetRegistry(specs, country="uk"), geography +#: Measure columns whose policyengine-uk formulas normalise by a population +#: total (a fixed national aggregate allocated by each household's share of +#: total weighted corporate wealth, or a term scaled by a weight sum). Under +#: ``--engine-blocks K`` the engine sees one clone block at a time, so each +#: block reproduces the whole aggregate and the column comes out K× (receipt +#: R15 in ``experiments/762-uk-rowwise-candidate-receipts.md``: corporate +#: land value ×15.000 at K=15). Evidence from a per-block run must not +#: adjudicate these rows; the release posture is single-block. +UK_BLOCK_SENSITIVE_MEASURE_COLUMNS = ( + "ons/corporate_land_value", + "ons/land_value", + "slc/student_loan_repayment/england", +) + + def _run_local_gate_battery( *, frame: Any, From e7a65282442c40bcd97a7bf6c346f7d5ad654f46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:49:24 +0200 Subject: [PATCH 13/26] A17: uprate census-vintage tenure cells with the ladder rows; release-candidate pre-flight (#762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit María's A17 ruling (2026-09-03): the 1,436 census tenure cells (Census 2021; Scotland 2022) held to the calibration period take the same national household factor as the ladder rows, so the tenure partition keeps its published shares at the uprated level. Keyed on the hold metadata: a tenure cell compiled from a fact at the calibration period is never touched. The receipt rides ladder_household_uprating.tenure_cells. tools/preflight_uk_local_release_candidate.py checks, fail-closed and by name, the launch environment (signing key, pins, digests, doctrine) and a finished run (release posture attested, shippable, every release-blocking gate passed, single-block engine, doctrine values, A15/A17 uprating, measure exclusions and their windows, holdout, Logbook row, artifact digest). On R13 it names the four defects the re-run fixes. Co-Authored-By: Claude Fable 5.1 --- .../build/uk_runtime/ledger_targets.py | 46 ++- .../tests/test_uk_ledger_targets.py | 95 ++++++- .../tests/test_uk_local_release_preflight.py | 194 +++++++++++++ tools/preflight_uk_local_release_candidate.py | 269 ++++++++++++++++++ 4 files changed, 588 insertions(+), 16 deletions(-) create mode 100644 packages/microcosm-build/tests/test_uk_local_release_preflight.py create mode 100644 tools/preflight_uk_local_release_candidate.py diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py index 67c3b685b..468ef24a1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/ledger_targets.py @@ -1004,6 +1004,19 @@ def uk_ladder_household_uprating( } +def _is_census_vintage_hold(metadata: Mapping[str, Any], period: int | str) -> bool: + """True for a compiled reference held from a census vintage to ``period``.""" + + from_period = metadata.get("uprating_from_period") + to_period = metadata.get("uprating_to_period") + if from_period is None or to_period is None: + return False + try: + return int(from_period) in (2021, 2022) and int(to_period) == int(period) + except (TypeError, ValueError): + return False + + def uk_local_target_surface( local_registry: TargetRegistry, ladder: Any, @@ -1045,6 +1058,14 @@ def uk_local_target_surface( f"ladder household uprating factor is invalid: {uprating_factor!r}." ) uprating_receipt = dict(ladder_household_uprating) + # microcosm#762 A17 (ruling 2026-09-03): the census tenure cells are the + # same household universe as the ladder rows split by tenure, carried + # with identity holds from their census vintage; when the ladder rows + # uprate, the held tenure cells uprate by the same national factor so the + # partition keeps its published shares at the uprated level. A tenure + # cell compiled from a fact at the calibration period carries no hold + # and is never touched. + tenure_uprated: dict[str, int] = {} level_to_area_type = { level: area_type @@ -1076,12 +1097,21 @@ def uk_local_target_surface( f"for area_type {area_type!r}." ) output_position = len(output_rows) + value = float(spec.value) + if ( + uprating_receipt.get("applied") + and contract_target_id.startswith("ons.tenure.") + and _is_census_vintage_hold(spec.metadata, period) + ): + value *= uprating_factor + from_period = str(spec.metadata.get("uprating_from_period")) + tenure_uprated[from_period] = tenure_uprated.get(from_period, 0) + 1 output_rows.append( { "area_type": area_type, "area_code": geography_id, "metric": metric, - "value": float(spec.value), + "value": value, "target_name": spec.name, "family": family_for_metric(metric), "source_family": spec.family, @@ -1095,7 +1125,7 @@ def uk_local_target_surface( "grain": area_type, "geography_id": geography_id, "target_id": f"contract:{contract_target_id}", - "value": float(spec.value), + "value": value, "_output_position": output_position, } ) @@ -1237,6 +1267,18 @@ def uk_local_target_surface( licensed_empty_legs=licensed_empty_legs, ) receipt["fanout_targets_not_controls"] = fanout_targets_not_controls + uprating_receipt["tenure_cells"] = { + "applied": bool(tenure_uprated), + "cells": int(sum(tenure_uprated.values())), + "by_census_vintage": dict(sorted(tenure_uprated.items())), + "adjudication": "microcosm#762 (A17, ruling 2026-09-03)", + "reason": ( + "census tenure cells (ONS Census 2021; Scotland's Census 2022) held " + "to the calibration period are the ladder's household universe split " + "by tenure; they take the ladder rows' national household factor so " + "the published tenure shares hold at the uprated level." + ), + } receipt["ladder_household_uprating"] = uprating_receipt for position, value in enumerate(reconciled["value"].to_numpy(dtype=np.float64)): output_position = reconciliation.iloc[position]["_output_position"] diff --git a/packages/microcosm-build/tests/test_uk_ledger_targets.py b/packages/microcosm-build/tests/test_uk_ledger_targets.py index 84ed4c2dc..9d8240775 100644 --- a/packages/microcosm-build/tests/test_uk_ledger_targets.py +++ b/packages/microcosm-build/tests/test_uk_ledger_targets.py @@ -1401,24 +1401,40 @@ def test_uk_ledger_households_total_selects_exactly_one_fact() -> None: def test_uk_ladder_household_uprating_scales_ladder_rows_and_receipts() -> None: - ladder = SimpleNamespace( + small_ladder = SimpleNamespace( households=np.asarray([10.0, 20.0]), constituency_code=np.asarray(["E14000001", "S14000001"]), local_authority_code=np.asarray(["E06000001", "S12000005"]), metadata={"oa_vintage": "ew:2021_census;scotland:2022_census;ni:dz2021"}, ) - reference = uk_ledger_households_total( + small_reference = uk_ledger_households_total( (_households_total_fact(2025, 33.0),), period=2025 ) - uprating = uk_ladder_household_uprating(ladder, reference, period=2025) - assert uprating["applied"] is True - assert uprating["factor"] == pytest.approx(1.1) - assert uprating["ladder_households_total"] == 30.0 - assert uprating["ladder_oa_vintage"].startswith("ew:2021_census") - assert uprating["reference"] == reference - assert "A15" in uprating["adjudication"] + small = uk_ladder_household_uprating(small_ladder, small_reference, period=2025) + assert small["applied"] is True + assert small["factor"] == pytest.approx(1.1) + assert small["ladder_households_total"] == 30.0 + assert small["ladder_oa_vintage"].startswith("ew:2021_census") + assert small["reference"] == small_reference + assert "A15" in small["adjudication"] with pytest.raises(ValueError, match="calibration period"): - uk_ladder_household_uprating(ladder, reference, period=2024) + uk_ladder_household_uprating(small_ladder, small_reference, period=2024) + + def tenure_spec(name, value, **metadata): + return TargetSpec( + name=name, + entity="household", + value=value, + measure="tenure/social_rent", + period=2025, + source="ONS", + family="ons_housing", + metadata={ + "contract_target_id": "ons.tenure.social_rent", + "geography_level": "local_authority", + **metadata, + }, + ) registry = TargetRegistry( [ @@ -1436,15 +1452,51 @@ def test_uk_ladder_household_uprating_scales_ladder_rows_and_receipts() -> None: "geography_id": "K03000001", }, ), + # A census-2021 tenure cell held to 2025 (A17: uprated), a + # Scottish census-2022 hold (uprated), and a tenure cell compiled + # from a 2025 fact with no hold (never touched). + tenure_spec( + "ons.tenure.social_rent@E06000001@2025", + 50.0, + geography_id="E06000001", + uprating_from_period=2021, + uprating_to_period=2025, + ), + tenure_spec( + "ons.tenure.social_rent@S12000005@2025", + 40.0, + geography_id="S12000005", + uprating_from_period=2022, + uprating_to_period=2025, + ), + tenure_spec( + "ons.tenure.social_rent@E06000002@2025", + 30.0, + geography_id="E06000002", + ), ], country="uk", ) + ladder = SimpleNamespace( + households=np.asarray([10.0, 20.0, 5.0]), + constituency_code=np.asarray(["E14000001", "S14000001", "E14000002"]), + local_authority_code=np.asarray(["E06000001", "S12000005", "E06000002"]), + metadata={"oa_vintage": "ew:2021_census;scotland:2022_census;ni:dz2021"}, + ) + reference = uk_ledger_households_total( + (_households_total_fact(2025, 38.5),), period=2025 + ) + uprating = uk_ladder_household_uprating(ladder, reference, period=2025) + assert uprating["factor"] == pytest.approx(1.1) as_published, receipt = uk_local_target_surface( registry, ladder, bound_national_target_ids=(), period=2025 ) assert receipt["ladder_household_uprating"]["applied"] is False + assert receipt["ladder_household_uprating"]["tenure_cells"]["applied"] is False published_rows = as_published.loc[as_published["metric"] == "households"] - assert published_rows["value"].tolist() == [10.0, 20.0, 10.0, 20.0] + assert published_rows["value"].tolist() == [10.0, 5.0, 20.0, 10.0, 5.0, 20.0] + tenure_published = as_published.loc[as_published["metric"] == "tenure/social_rent"] + assert tenure_published["value"].tolist() == [50.0, 40.0, 30.0] uprated, receipt = uk_local_target_surface( registry, @@ -1454,8 +1506,19 @@ def test_uk_ladder_household_uprating_scales_ladder_rows_and_receipts() -> None: ladder_household_uprating=uprating, ) rows = uprated.loc[uprated["metric"] == "households"] - assert rows["value"].tolist() == pytest.approx([11.0, 22.0, 11.0, 22.0]) - assert receipt["ladder_household_uprating"] == uprating + assert rows["value"].tolist() == pytest.approx([11.0, 5.5, 22.0, 11.0, 5.5, 22.0]) + tenure_rows = uprated.loc[uprated["metric"] == "tenure/social_rent"] + assert tenure_rows["value"].tolist() == pytest.approx([55.0, 44.0, 30.0]) + tenure_receipt = receipt["ladder_household_uprating"]["tenure_cells"] + assert tenure_receipt["applied"] is True + assert tenure_receipt["cells"] == 2 + assert tenure_receipt["by_census_vintage"] == {"2021": 1, "2022": 1} + assert "A17" in tenure_receipt["adjudication"] + assert { + k: v + for k, v in receipt["ladder_household_uprating"].items() + if k != "tenure_cells" + } == uprating declined, receipt = uk_local_target_surface( registry, ladder, @@ -1465,11 +1528,15 @@ def test_uk_ladder_household_uprating_scales_ladder_rows_and_receipts() -> None: ) assert declined.loc[declined["metric"] == "households", "value"].tolist() == [ 10.0, + 5.0, 20.0, 10.0, + 5.0, 20.0, ] - assert receipt["ladder_household_uprating"] == { + declined_receipt = receipt["ladder_household_uprating"] + assert declined_receipt["tenure_cells"]["applied"] is False + assert {k: v for k, v in declined_receipt.items() if k != "tenure_cells"} == { "applied": False, "reason": "no facts", } diff --git a/packages/microcosm-build/tests/test_uk_local_release_preflight.py b/packages/microcosm-build/tests/test_uk_local_release_preflight.py new file mode 100644 index 000000000..cf24cdaab --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_local_release_preflight.py @@ -0,0 +1,194 @@ +"""The release-candidate pre-flight fails closed on every missing key or flag.""" + +from __future__ import annotations + +import base64 +import importlib.util +import json +from datetime import date +from pathlib import Path + +import pytest + +REPO_ROOT = Path(__file__).resolve().parents[3] + + +def _load(): + spec = importlib.util.spec_from_file_location( + "preflight_uk_local_release_candidate", + REPO_ROOT / "tools" / "preflight_uk_local_release_candidate.py", + ) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def _good_candidate(tmp_path: Path) -> Path: + candidate = tmp_path / "candidate" + (candidate / "logbook-spool").mkdir(parents=True) + (candidate / "logbook-spool" / "row.json").write_text("{}") + h5 = candidate / "microcosm_uk_2025_local.h5" + h5.write_bytes(b"h5") + import hashlib + + manifest = { + "parameters": { + "release_candidate": True, + "epochs": 1500, + "n_clones": 15, + "skip_holdout": False, + "doctrine": { + "max_weight_ratio": 10.0, + "target_weight_rule": "grain_equal", + "solve_epochs": 1500, + "clone_count": 15, + }, + }, + "releasable": True, + "blocked_at_f100": False, + "solve": { + "measure_resolution": {"blocks": 1}, + "target_weight_rule_override": {}, + }, + "fit": {"rotated_holdout": {"n_folds": 5, "mean_holdout_loss": 0.2}}, + "ladder_household_uprating": { + "applied": True, + "tenure_cells": {"applied": True}, + }, + "measure_exclusions": {"obr.housing_benefit": {"expires_on": "2026-10-03"}}, + "identity": {"spine": {"pin_verified": True}, "ladder": {"pin_verified": True}}, + "outputs": { + "dataset": {"path": str(h5), "sha256": hashlib.sha256(b"h5").hexdigest()} + }, + } + (candidate / "rowwise_candidate_manifest.json").write_text(json.dumps(manifest)) + report = { + "release_candidate": True, + "shippable": True, + "blocked_at_phase": None, + "attestation": {"signature": "abc"}, + "gates": { + "uk_local_area_support": { + "criticality": "release_blocking", + "status": "passed", + }, + "uk_local_target_fit": {"criticality": "diagnostic", "status": "failed"}, + }, + } + (candidate / "microcosm_uk_2025_local.local_gates.json").write_text( + json.dumps(report) + ) + return candidate + + +def test_good_candidate_dir_passes(tmp_path: Path) -> None: + module = _load() + assert ( + module.check_candidate_dir(_good_candidate(tmp_path), today=date(2026, 9, 4)) + == [] + ) + + +@pytest.mark.parametrize( + ("mutate", "needle"), + [ + ( + lambda m, r: m["parameters"].__setitem__("release_candidate", False), + "release_candidate", + ), + (lambda m, r: m.__setitem__("releasable", False), "releasable"), + ( + lambda m, r: m["solve"]["measure_resolution"].__setitem__("blocks", 15), + "blocks", + ), + ( + lambda m, r: m["parameters"]["doctrine"].__setitem__( + "max_weight_ratio", 100.0 + ), + "max_weight_ratio", + ), + (lambda m, r: m["parameters"].__setitem__("skip_holdout", True), "holdout"), + ( + lambda m, r: m["ladder_household_uprating"]["tenure_cells"].__setitem__( + "applied", False + ), + "A17", + ), + (lambda m, r: m.__setitem__("measure_exclusions", {}), "measure_exclusions"), + ( + lambda m, r: m["measure_exclusions"]["obr.housing_benefit"].__setitem__( + "expires_on", "2026-09-01" + ), + "expired", + ), + (lambda m, r: r.__setitem__("release_candidate", False), "dev posture"), + (lambda m, r: r.__setitem__("shippable", False), "shippable"), + ( + lambda m, r: r["gates"]["uk_local_area_support"].__setitem__( + "status", "failed" + ), + "release-blocking gate", + ), + (lambda m, r: r.__setitem__("attestation", {}), "signature"), + ], +) +def test_each_missing_flag_is_named(tmp_path: Path, mutate, needle: str) -> None: + module = _load() + candidate = _good_candidate(tmp_path) + manifest = json.loads((candidate / "rowwise_candidate_manifest.json").read_text()) + report = json.loads( + (candidate / "microcosm_uk_2025_local.local_gates.json").read_text() + ) + mutate(manifest, report) + (candidate / "rowwise_candidate_manifest.json").write_text(json.dumps(manifest)) + (candidate / "microcosm_uk_2025_local.local_gates.json").write_text( + json.dumps(report) + ) + failures = module.check_candidate_dir(candidate, today=date(2026, 9, 4)) + assert any(needle in failure for failure in failures), failures + + +def test_env_check_names_the_missing_key_and_pins(tmp_path: Path) -> None: + module = _load() + pins = tmp_path / "pins.txt" + spine = tmp_path / "spine.h5" + spine.write_bytes(b"s") + ladder = tmp_path / "ladder.npz" + ladder.write_bytes(b"l") + ledger = tmp_path / "ledger" + ledger.mkdir() + (ledger / "consumer_facts.jsonl").write_text("{}\n") + (ledger / "manifest.json").write_text("{}") + import hashlib + + def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + pins.write_text( + f"spine={sha(spine)} ladder={sha(ladder)} facts={sha(ledger / 'consumer_facts.jsonl')} manifest={sha(ledger / 'manifest.json')}\n" + ) + good_env = {module.SIGNING_KEY_ENV: base64.b64encode(b"\x07" * 32).decode()} + assert ( + module.check_env( + pins_path=pins, + spine_h5=spine, + ladder_npz=ladder, + ledger_dir=ledger, + environ=good_env, + ) + == [] + ) + failures = module.check_env( + pins_path=pins, spine_h5=spine, ladder_npz=ladder, ledger_dir=ledger, environ={} + ) + assert any(module.SIGNING_KEY_ENV in f for f in failures) + pins.write_text("spine=deadbeef ladder=x facts=y manifest=z\n") + failures = module.check_env( + pins_path=pins, + spine_h5=spine, + ladder_npz=ladder, + ledger_dir=ledger, + environ=good_env, + ) + assert any("digest mismatch" in f for f in failures) diff --git a/tools/preflight_uk_local_release_candidate.py b/tools/preflight_uk_local_release_candidate.py new file mode 100644 index 000000000..32b4ec53d --- /dev/null +++ b/tools/preflight_uk_local_release_candidate.py @@ -0,0 +1,269 @@ +"""Pre-flight for the UK local release-candidate run (microcosm#762). + +Two postures, both fail-closed and both printing every failure by name: + +``--env`` before the run: the signing key is present and well-formed, the + four pins are present and the pinned files exist with matching + digests, and the doctrine constants are the ruled ones. +``--candidate-dir`` after the run: the manifest and the signed gate report + say what a publishable release candidate must say — release + posture attested, shippable, every release-blocking gate passed, + single-block engine, doctrine values, the A15/A17 uprating and the + measure exclusions receipted, holdout measured, Logbook row + present, artifact digest recorded and matching. + +Exit 0 only when nothing failed. This is the check that stops a 3-hour run +from ending in a manifest that cannot be released for a missing key or flag. +""" + +from __future__ import annotations + +import argparse +import base64 +import glob +import hashlib +import json +import os +import sys +from datetime import date +from pathlib import Path + +SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" +PIN_NAMES = ("spine", "ladder", "facts", "manifest") +RELEASE_BLOCKING = "release_blocking" + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1 << 20), b""): + digest.update(chunk) + return digest.hexdigest() + + +def check_env( + *, + pins_path: Path, + spine_h5: Path, + ladder_npz: Path, + ledger_dir: Path, + environ: dict[str, str] | None = None, + verify_digests: bool = True, +) -> list[str]: + env = os.environ if environ is None else environ + failures: list[str] = [] + key = env.get(SIGNING_KEY_ENV, "") + if not key.strip(): + failures.append( + f"{SIGNING_KEY_ENV} is not set: the gate report cannot be signed." + ) + else: + try: + raw = base64.b64decode(key.strip(), validate=True) + if len(raw) < 32: + failures.append( + f"{SIGNING_KEY_ENV} decodes to {len(raw)} bytes; need ≥ 32." + ) + except Exception: + failures.append(f"{SIGNING_KEY_ENV} is not valid base64.") + if not pins_path.exists(): + failures.append(f"pins file missing: {pins_path}") + return failures + pins: dict[str, str] = {} + for token in pins_path.read_text().split(): + if "=" in token: + name, value = token.split("=", 1) + pins[name] = value.strip() + for name in PIN_NAMES: + if not pins.get(name): + failures.append(f"pin {name!r} missing from {pins_path.name}") + targets = { + "spine": spine_h5, + "ladder": ladder_npz, + "facts": ledger_dir / "consumer_facts.jsonl", + "manifest": ledger_dir / "manifest.json", + } + for name, path in targets.items(): + if not path.exists(): + failures.append(f"pinned input missing on disk: {name} -> {path}") + elif verify_digests and pins.get(name) and _sha256(path) != pins[name]: + failures.append(f"pinned input digest mismatch: {name} -> {path}") + try: + from microcosm.build.uk_runtime.local_doctrine import ( + UK_LOCAL_CLONE_COUNT, + UK_LOCAL_MAX_WEIGHT_RATIO, + UK_LOCAL_SOLVE_DOCTRINE, + UK_LOCAL_SOLVE_EPOCHS, + ) + + ruled = (10.0, "grain_equal", 15, 1500) + found = ( + float(UK_LOCAL_MAX_WEIGHT_RATIO), + UK_LOCAL_SOLVE_DOCTRINE.target_weight_rule, + int(UK_LOCAL_CLONE_COUNT), + int(UK_LOCAL_SOLVE_EPOCHS), + ) + if found != ruled: + failures.append(f"doctrine constants {found} are not the ruled {ruled}.") + except ImportError as error: + failures.append(f"doctrine module not importable: {error}") + return failures + + +def check_candidate_dir(candidate_dir: Path, *, today: date | None = None) -> list[str]: + failures: list[str] = [] + today = today or date.today() + manifest_path = candidate_dir / "rowwise_candidate_manifest.json" + if not manifest_path.exists(): + return [f"manifest missing: {manifest_path}"] + manifest = json.loads(manifest_path.read_text()) + parameters = manifest.get("parameters", {}) + if parameters.get("release_candidate") is not True: + failures.append("parameters.release_candidate is not true.") + if manifest.get("releasable") is not True: + failures.append("manifest.releasable is not true.") + if manifest.get("blocked_at_f100"): + failures.append(f"blocked at f100: {manifest.get('blocking_failures')}") + doctrine = parameters.get("doctrine", {}) + expected = { + "max_weight_ratio": 10.0, + "target_weight_rule": "grain_equal", + "solve_epochs": 1500, + "clone_count": 15, + } + for key, value in expected.items(): + if doctrine.get(key) != value: + failures.append( + f"doctrine.{key} = {doctrine.get(key)!r}, expected {value!r}." + ) + if parameters.get("epochs") != 1500 or parameters.get("n_clones") != 15: + failures.append( + f"run parameters epochs={parameters.get('epochs')} n_clones={parameters.get('n_clones')} are not the doctrine's 1500 / 15." + ) + if parameters.get("skip_holdout"): + failures.append("holdout was skipped.") + solve = manifest.get("solve", {}) + resolution = solve.get("measure_resolution", {}) + if resolution.get("blocks") != 1: + failures.append( + f"engine resolved in {resolution.get('blocks')} blocks; release posture is 1." + ) + if solve.get("target_weight_rule_override"): + failures.append("a target-weight-rule override was applied.") + holdout = manifest.get("fit", {}).get("rotated_holdout", {}) + if ( + holdout.get("skipped") + or holdout.get("n_folds") != 5 + or holdout.get("mean_holdout_loss") is None + ): + failures.append("rotated holdout is not measured with 5 folds.") + uprating = manifest.get("ladder_household_uprating", {}) + if uprating.get("applied") is not True: + failures.append("A15 ladder household uprating not applied.") + if uprating.get("tenure_cells", {}).get("applied") is not True: + failures.append("A17 tenure-cell uprating not applied.") + exclusions = manifest.get("measure_exclusions") or {} + if not exclusions: + failures.append("manifest carries no measure_exclusions receipt.") + for name, record in exclusions.items(): + expires = record.get("expires_on") + try: + if expires and (date.fromisoformat(expires) - today).days < 0: + failures.append(f"measure exclusion {name!r} expired {expires}.") + except ValueError: + failures.append( + f"measure exclusion {name!r} has an unreadable expiry {expires!r}." + ) + for name in ("spine", "ladder"): + if manifest.get("identity", {}).get(name, {}).get("pin_verified") is not True: + failures.append(f"identity.{name}.pin_verified is not true.") + dataset = manifest.get("outputs", {}).get("dataset", {}) + h5_path = Path(str(dataset.get("path", ""))) + if not h5_path.is_absolute(): + h5_path = candidate_dir / h5_path + if not h5_path.exists(): + failures.append(f"artifact missing: {h5_path}") + elif dataset.get("sha256") and _sha256(h5_path) != dataset["sha256"]: + failures.append("artifact digest does not match outputs.dataset.sha256.") + report_paths = glob.glob(str(candidate_dir / "*local_gates.json")) + if not report_paths: + failures.append("gate report missing.") + else: + report = json.loads(Path(report_paths[0]).read_text()) + if report.get("release_candidate") is not True: + failures.append( + "gate report release_candidate is not true (battery ran in dev posture)." + ) + if report.get("shippable") is not True: + failures.append("gate report shippable is not true.") + if report.get("blocked_at_phase") is not None: + failures.append( + f"gate report blocked at phase {report.get('blocked_at_phase')!r}." + ) + attestation = report.get("attestation") or {} + if not any( + key in report or key in attestation + for key in ("signature", "hmac", "signed_by", "signature_sha256") + ): + failures.append("gate report carries no signature field.") + for gate_id, entry in (report.get("gates") or {}).items(): + if ( + entry.get("criticality") == RELEASE_BLOCKING + and entry.get("status") != "passed" + ): + failures.append( + f"release-blocking gate {gate_id} status {entry.get('status')!r}." + ) + if not glob.glob(str(candidate_dir / "logbook-spool" / "*.json")): + failures.append("no Logbook row in logbook-spool/.") + return failures + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + parser.add_argument( + "--env", action="store_true", help="check the launch environment" + ) + parser.add_argument("--pins", type=Path) + parser.add_argument("--spine-h5", type=Path) + parser.add_argument("--ladder", type=Path) + parser.add_argument("--ledger-facts", type=Path) + parser.add_argument("--skip-digests", action="store_true") + parser.add_argument("--candidate-dir", type=Path, help="check a finished run") + args = parser.parse_args(argv) + failures: list[str] = [] + if args.env: + missing = [ + n + for n, v in ( + ("--pins", args.pins), + ("--spine-h5", args.spine_h5), + ("--ladder", args.ladder), + ("--ledger-facts", args.ledger_facts), + ) + if v is None + ] + if missing: + parser.error(f"--env needs {', '.join(missing)}") + failures += check_env( + pins_path=args.pins, + spine_h5=args.spine_h5, + ladder_npz=args.ladder, + ledger_dir=args.ledger_facts, + verify_digests=not args.skip_digests, + ) + if args.candidate_dir is not None: + failures += check_candidate_dir(args.candidate_dir) + if not args.env and args.candidate_dir is None: + parser.error("nothing to check: pass --env and/or --candidate-dir") + for failure in failures: + print(f"FAIL {failure}", file=sys.stderr) + print( + "preflight: " + ("OK" if not failures else f"{len(failures)} failure(s)"), + file=sys.stderr, + ) + return 0 if not failures else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) From ea51092ece91e9bd0f03bb8daa8abb1aaffe8ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 19:26:30 +0200 Subject: [PATCH 14/26] Dense line release path: contract branch, signed local report verification, registry entry, assembler, pre-flight release check (#762 A18) microcosm-uk-2024-25-dense follows the national constant-id approach under the non-default local-area role with UK evidence: the signed local gate-battery report verified with the executor's key (release posture, shippable, the six local entries, scoped digests pinned and lockstep-tested, HMAC recomputed), the incumbent score, and a uk_source_coverage.json naming the spine, Ledger artifact, ladder, incumbent, doctrine, exclusions, signed deferrals, holdout and uprating. Artifacts pin to the release id or a per-cut tag; the registry gains ("uk", 2025, "dense") in the private repo. tools/assemble_uk_dense_release_dir.py verifies the hash join, re-runs the candidate pre-flight, stages, validates and renames; it prints the --no-latest publication command for the human step. Runbook in docs/. Co-Authored-By: Claude Fable 5.1 --- docs/uk-dense-release-assembly-runbook-762.md | 98 +++ .../microcosm/build/uk_runtime/__init__.py | 2 + .../build/uk_runtime/release_identity.py | 11 + .../tests/test_gate_battery_contract_pins.py | 45 ++ .../tests/test_uk_dense_release_assembler.py | 379 ++++++++++ .../src/microcosm/data/contract.py | 350 +++++++++- .../src/microcosm/data/registry.py | 16 + .../microcosm-data/tests/test_registry.py | 10 + .../tests/test_uk_dense_release_contract.py | 308 +++++++++ tools/assemble_uk_dense_release_dir.py | 653 ++++++++++++++++++ tools/preflight_uk_local_release_candidate.py | 16 +- 11 files changed, 1882 insertions(+), 6 deletions(-) create mode 100644 docs/uk-dense-release-assembly-runbook-762.md create mode 100644 packages/microcosm-build/tests/test_uk_dense_release_assembler.py create mode 100644 packages/microcosm-data/tests/test_uk_dense_release_contract.py create mode 100644 tools/assemble_uk_dense_release_dir.py diff --git a/docs/uk-dense-release-assembly-runbook-762.md b/docs/uk-dense-release-assembly-runbook-762.md new file mode 100644 index 000000000..a1db57620 --- /dev/null +++ b/docs/uk-dense-release-assembly-runbook-762.md @@ -0,0 +1,98 @@ +# UK dense line release assembly runbook (#762) + +The dense line `microcosm-uk-2024-25-dense` is the spine cloned K=15 times +through the OA geography ladder and calibrated to the national and local +target surfaces in one solve (`tools/build_uk_rowwise_candidate.py`). It ships +on the **inspect lane only**: a constant release id, an immutable per-cut tag, +`dataset_role: non_default_local_area`, an empty `default_datasets` map, and +`--no-latest` at publication, so it can never displace the default artifact. +It is registered as `("uk", 2025, "dense")` in the private repo +`policyengine/populace-uk-private`. Publication is a separate human step. + +## Prerequisites + +- The four pins the run stood on (`spine`, `ladder`, `facts`, `manifest`) and + the signing key in `MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY` (base64, 32 bytes). +- The Ledger consumer artifact, the spine H5 with its sidecar, the OA ladder. +- The incumbent extraction (`tools/extract_uk_local_incumbent_surface.py`) for + the head-to-head score. + +## 1. Pre-flight the environment + +```bash +uv run --no-sync python tools/preflight_uk_local_release_candidate.py --env \ + --pins --spine-h5 --ladder build/uk/uk_oa_ladder_2021.npz \ + --ledger-facts +``` + +Fails closed and by name on a missing or malformed key, a missing pin, a +digest mismatch, or doctrine constants that are not the ruled ones. + +## 2. Run the release candidate + +```bash +uv run --no-sync python tools/build_uk_rowwise_candidate.py --release-candidate \ + --input-h5 --input-sha256 \ + --ladder build/uk/uk_oa_ladder_2021.npz --ladder-sha256 \ + --ledger-facts --ledger-facts-sha256 \ + --ledger-manifest-sha256 --seed 42 \ + --logbook-prev-row-digest --out +``` + +`--release-candidate` pins the doctrine (bound 10, `grain_equal`, K=15, 1500 +epochs), resolves the engine in a single block, and runs the rotated holdout. +Expect about 3.5 hours and 10 GB at K=15. + +## 3. Pre-flight the finished run, then score it + +```bash +uv run --no-sync python tools/preflight_uk_local_release_candidate.py --candidate-dir +uv run --no-sync python tools/score_uk_local_candidate.py ... --output-json /score_vs_incumbent.json +``` + +The pre-flight checks the manifest and the signed gate report for everything +the contract will demand: release posture attested, shippable, every +release-blocking gate passed, single-block engine, the doctrine values, the +A15/A17 uprating, the measure exclusions and their windows, the holdout, the +Logbook row, the artifact digest. + +## 4. Assemble the release directory + +```bash +uv run --no-sync python tools/assemble_uk_dense_release_dir.py \ + --candidate-dir --spine-h5 \ + --incumbent-manifest /incumbent_local_surface_manifest.json \ + --out-dir releases +``` + +Assembly verifies the hash join (every manifest output against its bytes, the +spine against its pin, the gate report against the Logbook build id), re-runs +the candidate pre-flight, mints the cut tag +`microcosm-uk-2024-25-dense--` from the run's attempt +id, clones the H5 beside itself as `microcosm_uk_2025_dense.h5`, stages +`build_manifest.json`, `release_manifest.json`, `calibration_diagnostics.json`, +`gate_summary.json`, `uk_source_coverage.json`, the signed `uk_local_gates.json`, +`score_vs_incumbent.json` and `sha256sums.txt`, validates the directory with +`microcosm.data.contract.validate_release_dir`, and only then renames it into +`releases/microcosm-uk-2024-25-dense/`. Re-assembling requires removing the +previous directory first. The JSON summary prints the publication command. + +## 5. Publish for inspection (human step) + +Run the printed command. Its shape is: + +```bash +uv run python -m microcosm.data.publish_cli releases/microcosm-uk-2024-25-dense \ + --repo-id policyengine/populace-uk-private --artifact-root \ + --no-latest --tag-name microcosm-uk-2024-25-dense-- +``` + +`--no-latest` is mandatory and enforced: publication refuses to move +`latest.json` for a non-default role. The artifact is reachable by its tag and +by the registry key `("uk", 2025, "dense")` only. + +## Promotion is a separate change + +Making the dense line (or a sparse successor via the L0 penalty, #762 I10) a +default dataset is a registry and contract change with its own review; nothing +in this runbook promotes anything. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py index 2455e8d00..85bc1e918 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py @@ -382,6 +382,7 @@ load_efrs_parity_reference, ) from microcosm.build.uk_runtime.release_identity import ( + UK_DENSE_RELEASE_ID, UK_RELEASE_TIER_CPS_TRANSFER, UK_RELEASE_TIER_FRS, UK_RELEASE_TIERS, @@ -690,6 +691,7 @@ "UK_OA_LADDER_SCHEMA_VERSION", "UK_POSTCODE_OA_MAY25_ZIP_URL", "UK_RELEASE_INPUT_COVERAGE_RESOURCE", + "UK_DENSE_RELEASE_ID", "UK_RELEASE_TIERS", "UK_RELEASE_TIER_CPS_TRANSFER", "UK_RELEASE_TIER_FRS", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/release_identity.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/release_identity.py index 7d7bca2d8..c2e3e04e6 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/release_identity.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/release_identity.py @@ -12,6 +12,7 @@ from dataclasses import dataclass __all__ = [ + "UK_DENSE_RELEASE_ID", "UK_NATIONAL_RELEASE_ID", "UK_RELEASE_TIERS", "UK_RELEASE_TIER_CPS_TRANSFER", @@ -40,6 +41,16 @@ #: "-k" shape and may retire as the migration moves on. UK_NATIONAL_RELEASE_ID = "microcosm-uk-2024-25-national" +#: The dense joint (national + local) line's release id (microcosm#762 A18, +#: ruling 2026-09-03): the same constant-id approach as the national line, +#: same "2024-25" FRS-release vintage segment, "-dense" because the artifact +#: is the spine cloned K times through the OA ladder (792,690 rows at K=15) +#: — a sparse successor via the L0 penalty is a later increment. Published +#: on the inspect lane only (per-cut tag, never the default slot); consumers +#: reach it by the registry key ("uk", 2025, "dense"). +UK_DENSE_RELEASE_ID = "microcosm-uk-2024-25-dense" + + def validate_uk_release_tier(tier: object) -> str: """Return a ratified UK source tier, rejecting every other token.""" diff --git a/packages/microcosm-build/tests/test_gate_battery_contract_pins.py b/packages/microcosm-build/tests/test_gate_battery_contract_pins.py index 311e8062f..96bd5524d 100644 --- a/packages/microcosm-build/tests/test_gate_battery_contract_pins.py +++ b/packages/microcosm-build/tests/test_gate_battery_contract_pins.py @@ -377,3 +377,48 @@ def test_national_release_id_mirrors_the_build_shard(self) -> None: ) assert data_contract._UK_NATIONAL_RELEASE_ID == UK_NATIONAL_RELEASE_ID + + +class TestDenseLineMirrors: + """The dense joint line's contract mirrors (microcosm#762 A18).""" + + def test_release_id_mirrors_the_build_shard(self) -> None: + from microcosm.build.uk_runtime.release_identity import UK_DENSE_RELEASE_ID + + assert data_contract._UK_DENSE_RELEASE_ID == UK_DENSE_RELEASE_ID + assert data_contract._UK_DENSE_CUT_TAG_RE.fullmatch( + f"{UK_DENSE_RELEASE_ID}-20260903T105422Z-ca611e43" + ) + assert data_contract._UK_DENSE_CUT_TAG_RE.fullmatch(UK_DENSE_RELEASE_ID) is None + + def test_entry_ids_mirror_the_local_battery_scope(self) -> None: + from microcosm.build.uk_runtime.calibration_run import UK_LOCAL_GATE_SCOPE + + assert data_contract._UK_DENSE_GATE_ENTRY_IDS == frozenset(UK_LOCAL_GATE_SCOPE) + assert data_contract._UK_DENSE_RELEASE_BLOCKING_IDS < ( + data_contract._UK_DENSE_GATE_ENTRY_IDS + ) + + def test_scoped_digests_mirror_the_live_local_manifest(self) -> None: + import importlib.util + from pathlib import Path + + from microcosm.build.uk_runtime.calibration_run import UK_LOCAL_GATE_SCOPE + from microcosm.build.uk_runtime.release_certification import _scoped_digests + + spec = importlib.util.spec_from_file_location( + "build_uk_rowwise_candidate", + Path(__file__).resolve().parents[3] + / "tools" + / "build_uk_rowwise_candidate.py", + ) + builder = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(builder) + live = _scoped_digests( + frozenset(UK_LOCAL_GATE_SCOPE), + phases=tuple(data_contract._UK_DENSE_GATE_PHASES), + policy_suffix=str(builder._LOCAL_GATE_POLICY_SUFFIX), + ) + for field, mirrored in data_contract._UK_DENSE_GATE_DIGESTS.items(): + assert mirrored == live[field], field diff --git a/packages/microcosm-build/tests/test_uk_dense_release_assembler.py b/packages/microcosm-build/tests/test_uk_dense_release_assembler.py new file mode 100644 index 000000000..5ec037889 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_dense_release_assembler.py @@ -0,0 +1,379 @@ +"""The dense release assembler stages a contract-valid bundle from a run.""" + +from __future__ import annotations + +import base64 +import hashlib +import hmac +import importlib.util +import json +from pathlib import Path + +import pytest + +from microcosm.build.gate_battery import _canonical_json_bytes, _canonical_sha256 +from microcosm.build.uk_runtime.calibration_run import UK_LOCAL_GATE_SCOPE +from microcosm.build.uk_runtime.release_identity import UK_DENSE_RELEASE_ID +from microcosm.data import contract as dc + +REPO_ROOT = Path(__file__).resolve().parents[3] +KEY = base64.b64encode(b"\x09" * 32).decode() +KEY_BYTES = base64.b64decode(KEY) +ATTEMPT = "uk-local-candidate-f100-s42-20260903T105422Z-ca611e43" + + +def _load(name: str): + spec = importlib.util.spec_from_file_location( + name, REPO_ROOT / "tools" / f"{name}.py" + ) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def _sha(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def _signed_report(): + gates = {} + for entry_id in sorted(UK_LOCAL_GATE_SCOPE): + blocking = entry_id in dc._UK_DENSE_RELEASE_BLOCKING_IDS + gates[entry_id] = { + "gate": entry_id.removeprefix("uk_local_"), + "phase": "terminal", + "criticality": "release_blocking" if blocking else "diagnostic", + "status": "passed" if blocking else "failed", + "failures": [] if blocking else ["a diagnostic miss"], + "details": {}, + "reason": None, + } + attestation = { + "schema_version": dc._UK_GATE_BATTERY_ATTESTATION_SCHEMA_VERSION, + "producer": dc._UK_GATE_BATTERY_PRODUCER, + "country": "uk", + "release_id": ATTEMPT, + "release_candidate": True, + "spec_fingerprint": dc._UK_DENSE_GATE_DIGESTS["spec_fingerprint"], + "gates_manifest_sha256": dc._UK_DENSE_GATE_DIGESTS["gates_manifest_sha256"], + "policy_sha256": dc._UK_DENSE_GATE_DIGESTS["policy_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "release_evidence": {}, + "evidence_sha256": {}, + "gate_outcomes_sha256": _canonical_sha256(gates), + "signature_algorithm": "hmac-sha256", + "signing_key_sha256": hashlib.sha256(KEY_BYTES).hexdigest(), + "signature": None, + } + report = { + "schema_version": dc._UK_GATE_BATTERY_SCHEMA_VERSION, + "country": "uk", + "release_id": ATTEMPT, + "release_candidate": True, + "spec_fingerprint": attestation["spec_fingerprint"], + "gates_manifest_sha256": attestation["gates_manifest_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "shippable": True, + "gates": gates, + "policy_sha256": attestation["policy_sha256"], + "release_evidence": {}, + "evidence_sha256": {}, + "attestation": attestation, + "posture": "local_candidate", + "scope_exclusions": {}, + "aggregate_admin_measurement": None, + } + attestation["signature"] = hmac.new( + KEY_BYTES, _canonical_json_bytes(report), hashlib.sha256 + ).hexdigest() + return report + + +def _candidate_dir(root: Path) -> tuple[Path, Path, Path]: + candidate = root / "f100-k15-RC" + (candidate / "logbook-spool").mkdir(parents=True) + spine = root / "spine.h5" + spine.write_bytes(b"spine-stand-in") + h5 = candidate / "microcosm_uk_2025_local.h5" + h5.write_bytes(b"dense-candidate-stand-in") + diagnostics = { + "schema_version": 6, + "n_records": 30, + "final_loss": 0.0156, + "fraction_within_10pct": 0.98, + "targets": [ + { + "name": "ons.age.20_30@E14000001@2025", + "target": 10.0, + "compiled_target": 10.0, + "initial_estimate": 9.0, + "final_estimate": 10.0, + }, + { + "name": "dwp.uc.households@2025", + "target": 5.0, + "compiled_target": 5.0, + "initial_estimate": 4.0, + "final_estimate": 5.0, + }, + ], + } + (candidate / "calibration_diagnostics.json").write_text(json.dumps(diagnostics)) + report = _signed_report() + (candidate / "microcosm_uk_2025_local.local_gates.json").write_text( + json.dumps(report) + ) + (candidate / "score_vs_incumbent.json").write_text( + json.dumps( + { + "candidate_fitted_surface_loss": 0.0146, + "incumbent_fitted_surface_loss": 0.181, + "rows_compared": 2, + "incumbent_missing_areas": {}, + } + ) + ) + (candidate / "logbook-spool" / "row.json").write_text( + json.dumps( + {"build_id": ATTEMPT, "row_digest": "f" * 64, "prev_row_digest": "e" * 64} + ) + ) + manifest = { + "schema_version": 2, + "created_at": "2026-09-03T10:54:22+00:00", + "git_commit": "b" * 40, + "parameters": { + "release_candidate": True, + "epochs": 1500, + "n_clones": 15, + "skip_holdout": False, + "doctrine": { + "max_weight_ratio": 10.0, + "target_weight_rule": "grain_equal", + "solve_epochs": 1500, + "clone_count": 15, + "target_loss_cap": 10.0, + "scale_rule": "default_target_loss_scales", + }, + }, + "releasable": True, + "blocked_at_f100": False, + "blocking_failures": [], + "solve": { + "measure_resolution": {"blocks": 1}, + "target_weight_rule_override": {}, + "n_households": 30, + "final_loss": 0.0156, + "n_targets_by_kind": {"local": 1, "ladder": 0, "national": 1}, + "binding_adjudications": {"stood_on": {"age_structure/constituency": {}}}, + "area_support_exclusions": { + "entries_stood_on": ["local_authority/E06000053"] + }, + }, + "fit": { + "rotated_holdout": { + "n_folds": 5, + "mean_holdout_loss": 0.204, + "worst_holdout_loss": 0.213, + "folds": [{"fold": 0}], + } + }, + "weights": { + "calibration_mass_change": {"declared_factor": 0.989}, + "realized_max_weight_ratio_vs_design": 10.0, + }, + "cross_grain": { + "unbound_bridges": [ + { + "bridge_id": "national_household_composition_partition_vs_census_households" + } + ], + "empty_legs_licensed": [1, 2], + }, + "ladder_household_uprating": { + "applied": True, + "factor": 1.0336, + "reason": "x", + "tenure_cells": {"applied": True, "cells": 3}, + }, + "measure_exclusions": { + "obr.housing_benefit": { + "reason": "unreachable", + "tracking": "microcosm#736", + "expires_on": "2099-01-01", + } + }, + "identity": { + "spine": { + "pin_verified": True, + "sha256": _sha(spine), + "path": str(spine), + "bytes": spine.stat().st_size, + "spine_provenance": { + "rules_engine": {"package": "policyengine-uk", "version": "2.92.1"}, + "source_vintages": {"frs": "2024_25"}, + "stages": ["frs_spine"], + "stochastic_contract_sha256": "9" * 64, + }, + }, + "ladder": { + "pin_verified": True, + "sha256": "d" * 64, + "bytes": 1, + "layer_vintages": {"constituency": "2024_pcon"}, + }, + "ledger": { + "path_name": "chronicle-uk-artifact-1cab809", + "facts_sha256": "1" * 64, + "manifest_sha256": "2" * 64, + "fact_row_count": 3, + "schema_version": "v1", + }, + "code": {"git_commit": "b" * 40}, + "runtime": { + "policyengine-core": "3.31.0", + "policyengine-uk": "2.92.1", + "microcosm-data": "0.1.0", + "python": "3.13.14", + }, + }, + "outputs": { + "dataset": {"path": str(h5), "sha256": _sha(h5)}, + "calibration_diagnostics": { + "path": str(candidate / "calibration_diagnostics.json"), + "sha256": _sha(candidate / "calibration_diagnostics.json"), + }, + "local_gate_report": { + "path": str(candidate / "microcosm_uk_2025_local.local_gates.json"), + "sha256": _sha(candidate / "microcosm_uk_2025_local.local_gates.json"), + }, + }, + } + (candidate / "rowwise_candidate_manifest.json").write_text(json.dumps(manifest)) + incumbent_manifest = root / "incumbent_local_surface_manifest.json" + incumbent_manifest.write_text( + json.dumps( + { + "period": 2025, + "households": 52846, + "inputs": {"incumbent_h5": {"sha256": "5" * 64}}, + } + ) + ) + return candidate, spine, incumbent_manifest + + +def test_assembler_stages_a_contract_valid_dense_release( + tmp_path: Path, monkeypatch, capsys +) -> None: + monkeypatch.setenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY", KEY) + assembler = _load("assemble_uk_dense_release_dir") + candidate, spine, incumbent = _candidate_dir(tmp_path) + out = tmp_path / "releases" + assert ( + assembler.main( + [ + "--candidate-dir", + str(candidate), + "--spine-h5", + str(spine), + "--incumbent-manifest", + str(incumbent), + "--out-dir", + str(out), + ] + ) + == 0 + ) + summary = json.loads(capsys.readouterr().out) + release_dir = out / UK_DENSE_RELEASE_ID + assert summary["release_id"] == UK_DENSE_RELEASE_ID + assert summary["cut_tag"] == f"{UK_DENSE_RELEASE_ID}-20260903T105422Z-ca611e43" + assert release_dir.is_dir() + for name in dc._UK_DENSE_REQUIRED_RELEASE_FILES: + assert (release_dir / name).is_file(), name + published = candidate / "microcosm_uk_2025_dense.h5" + assert ( + published.read_bytes() + == (candidate / "microcosm_uk_2025_local.h5").read_bytes() + ) + manifest = json.loads((release_dir / "release_manifest.json").read_text()) + assert manifest["dataset_role"] == "non_default_local_area" + assert manifest["default_datasets"] == {} and manifest["is_default"] is False + assert ( + manifest["artifacts"]["microcosm_uk_2025_dense"]["revision"] + == summary["cut_tag"] + ) + assert ( + manifest["artifacts"]["microcosm_uk_2025_dense"]["repo_id"] + == "policyengine/populace-uk-private" + ) + assert any( + item["id"].startswith("measure_exclusion:obr.housing_benefit") + for item in manifest["reviewed_limitations"] + ) + diagnostics = json.loads((release_dir / "calibration_diagnostics.json").read_text()) + assert diagnostics["households"] == 30 and diagnostics["n_targets"] == 2 + gate_summary = json.loads((release_dir / "gate_summary.json").read_text()) + assert set(gate_summary["gates"]) == set(dc._UK_DENSE_RELEASE_BLOCKING_IDS) + assert set(gate_summary["diagnostic_gates"]) == set(UK_LOCAL_GATE_SCOPE) - set( + dc._UK_DENSE_RELEASE_BLOCKING_IDS + ) + assert ( + "--no-latest" in summary["publish_command"] + and "populace-uk-private" in summary["publish_command"] + ) + # The contract re-validates the finished directory, and so does the pre-flight. + dc.validate_release_dir(release_dir) + preflight = _load("preflight_uk_local_release_candidate") + assert preflight.main(["--release-dir", str(release_dir)]) == 0 + + +def test_assembler_refuses_a_dev_posture_run(tmp_path: Path, monkeypatch) -> None: + monkeypatch.setenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY", KEY) + assembler = _load("assemble_uk_dense_release_dir") + candidate, spine, incumbent = _candidate_dir(tmp_path) + manifest_path = candidate / "rowwise_candidate_manifest.json" + manifest = json.loads(manifest_path.read_text()) + manifest["parameters"]["release_candidate"] = False + manifest_path.write_text(json.dumps(manifest)) + with pytest.raises(SystemExit, match="pre-flight failed"): + assembler.main( + [ + "--candidate-dir", + str(candidate), + "--spine-h5", + str(spine), + "--incumbent-manifest", + str(incumbent), + "--out-dir", + str(tmp_path / "releases"), + ] + ) + + +def test_assembler_refuses_tampered_candidate_bytes( + tmp_path: Path, monkeypatch +) -> None: + monkeypatch.setenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY", KEY) + assembler = _load("assemble_uk_dense_release_dir") + candidate, spine, incumbent = _candidate_dir(tmp_path) + (candidate / "microcosm_uk_2025_local.h5").write_bytes(b"tampered") + with pytest.raises(SystemExit, match="candidate bytes"): + assembler.main( + [ + "--candidate-dir", + str(candidate), + "--spine-h5", + str(spine), + "--incumbent-manifest", + str(incumbent), + "--out-dir", + str(tmp_path / "releases"), + ] + ) diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index e1c0c6f23..0a3c06052 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -40,7 +40,7 @@ import math import os import re -from collections.abc import Mapping +from collections.abc import Callable, Mapping from pathlib import Path from packaging.specifiers import InvalidSpecifier, SpecifierSet @@ -559,6 +559,68 @@ # microcosm.build.uk_runtime.release_identity.UK_NATIONAL_RELEASE_ID (the # data shard cannot import the build shard); lockstep-tested. _UK_NATIONAL_RELEASE_ID = "microcosm-uk-2024-25-national" +# The dense joint national + local line (microcosm#762 A18, ruling +# 2026-09-03): the same constant-id approach, published on the inspect lane +# under the non-default local-area role. Mirrored from +# microcosm.build.uk_runtime.release_identity.UK_DENSE_RELEASE_ID; lockstep- +# tested in test_gate_battery_contract_pins.py. +_UK_DENSE_RELEASE_ID = "microcosm-uk-2024-25-dense" +_UK_DENSE_CUT_TAG_RE = re.compile( + re.escape(_UK_DENSE_RELEASE_ID) + r"-[0-9]{8}T[0-9]{6}Z-[0-9a-f]{8}" +) +_UK_DENSE_GATE_REPORT_FILE = "uk_local_gates.json" +_UK_DENSE_SCORE_RECEIPT_FILE = "score_vs_incumbent.json" +_UK_DENSE_SOURCE_COVERAGE_FILE = "uk_source_coverage.json" +_UK_DENSE_NAMESPACE = "uk_dense" +_UK_DENSE_REQUIRED_RELEASE_FILES = ( + "build_manifest.json", + "release_manifest.json", + "calibration_diagnostics.json", + "gate_summary.json", + _UK_DENSE_SOURCE_COVERAGE_FILE, + _UK_DENSE_GATE_REPORT_FILE, + _UK_DENSE_SCORE_RECEIPT_FILE, + "sha256sums.txt", +) +# The local battery scope (microcosm.build.uk_runtime.calibration_run +# .UK_LOCAL_GATE_SCOPE) and its scoped spec digests, mirrored and +# lockstep-tested against the live scoped manifest. +_UK_DENSE_GATE_ENTRY_IDS = frozenset( + { + "uk_local_area_support", + "uk_local_geography_ladder_post_calibration", + "uk_local_per_family_fit", + "uk_local_target_fit", + "uk_local_weight_ess", + "uk_local_weight_ratio", + } +) +_UK_DENSE_RELEASE_BLOCKING_IDS = frozenset( + {"uk_local_area_support", "uk_local_geography_ladder_post_calibration"} +) +_UK_DENSE_GATE_PHASES = ("terminal",) +_UK_DENSE_GATE_DIGESTS = { + "policy_sha256": ( + "095b8d34152d45e07e626826ce397f73e4881fc9d870dc2ab0405d8b5f62bd71" + ), + "gates_manifest_sha256": ( + "ee2adc33cb3aaf485dbb5d42225a8f9bcc621c971084b299126e8e842ebc34eb" + ), + "spec_fingerprint": ( + "6d64fac7605ab22149bcc1c780c0b3989c5cd943c942489c3ddc7dc5e9e07114" + ), +} +_UK_DENSE_SOURCE_COVERAGE_KEYS = ( + "spine", + "ledger_artifact", + "geography_ladder", + "incumbent", + "doctrine", + "measure_exclusions", + "signed_deferrals", + "holdout", + "uprating", +) # The per-cut tag grammar the assembler mints from the calibration attempt id # (tools/assemble_uk_release_dir.py). The contract validates the same shape so # a hand-edited or stale revision cannot claim a cut the attempt chain never @@ -4127,10 +4189,278 @@ def _validate_local_area_release_dir(release_dir: Path, release_id: str) -> None raise ReleaseContractError(release_dir, failures) +def _validate_uk_dense_release_dir(release_dir: Path, release_id: str) -> None: + """The dense joint UK line's contract (microcosm#762 A18). + + The non-default local-area role with UK evidence in place of the US + coverage file: the signed local gate-battery report verified with the + executor's key (release posture attested, every release-blocking entry + passed, the scoped spec digests pinned), the head-to-head score against + the incumbent, and a source-coverage receipt naming the spine, the Ledger + artifact, the geography ladder, the incumbent extraction, the doctrine, + the reviewed exclusions and signed deferrals, the holdout and the vintage + uprating. Artifacts pin to the release id or to one of its immutable + per-cut tags. + """ + + failures: list[str] = [] + for filename in _UK_DENSE_REQUIRED_RELEASE_FILES: + if not (release_dir / filename).is_file(): + failures.append(f"required file {filename!r} is missing.") + release_manifest: Mapping | None = None + manifest_path = release_dir / "release_manifest.json" + if manifest_path.is_file(): + release_manifest = _load_json(manifest_path, failures) + if release_manifest is not None: + _check_local_area_release_manifest( + release_manifest, + release_id, + failures, + revision_ok=lambda revision: ( + revision == release_id + or _UK_DENSE_CUT_TAG_RE.fullmatch(revision) is not None + ), + ) + namespace = release_manifest.get("namespace") + if namespace != _UK_DENSE_NAMESPACE: + failures.append( + "release_manifest.json namespace must be " + f"{_UK_DENSE_NAMESPACE!r}, got {namespace!r}." + ) + build_manifest_path = release_dir / "build_manifest.json" + if build_manifest_path.is_file(): + build_manifest = _load_json(build_manifest_path, failures) + if build_manifest is not None and build_manifest.get("build_id") != release_id: + failures.append( + "build_manifest.json 'build_id' is " + f"{build_manifest.get('build_id')!r} but the release directory " + f"is named {release_id!r}." + ) + gate_path = release_dir / "gate_summary.json" + if gate_path.is_file(): + gate_summary = _load_json(gate_path, failures) + if gate_summary is not None: + _check_local_area_gates(gate_summary, failures) + diagnostics_path = release_dir / "calibration_diagnostics.json" + if diagnostics_path.is_file(): + diagnostics = _load_json(diagnostics_path, failures) + if diagnostics is not None: + _check_local_area_calibration_diagnostics(diagnostics, failures) + report_path = release_dir / _UK_DENSE_GATE_REPORT_FILE + if report_path.is_file(): + report = _load_json(report_path, failures) + if report is not None: + _check_uk_dense_gate_report(report, failures=failures) + if ( + _artifact_by_path(release_manifest or {}, _UK_DENSE_GATE_REPORT_FILE) + is None + ): + failures.append( + "release_manifest.json must declare the signed gate report " + f"{_UK_DENSE_GATE_REPORT_FILE!r} as an artifact." + ) + coverage_path = release_dir / _UK_DENSE_SOURCE_COVERAGE_FILE + if coverage_path.is_file(): + coverage = _load_json(coverage_path, failures) + if coverage is not None: + _check_uk_dense_source_coverage(coverage, failures) + _check_local_area_checksum_ledger( + release_dir, + release_manifest, + failures, + required_files=_UK_DENSE_REQUIRED_RELEASE_FILES, + ) + _check_local_artifact_hashes(release_dir, release_manifest, failures) + if failures: + raise ReleaseContractError(release_dir, failures) + + +def _check_uk_dense_gate_report(report: Mapping, *, failures: list[str]) -> None: + """Verify the signed local gate-battery report the dense line ships. + + Same producer and signing dance as the exact-k terminal report, scoped to + the local battery: the six local entries, one terminal phase, the local + scoped digests, release posture attested, every release-blocking entry + passed, ``gate_outcomes_sha256`` recomputed, and the HMAC over the + canonical report re-nulled at the signature slot. + """ + + file = _UK_DENSE_GATE_REPORT_FILE + core_fields = { + "schema_version", + "country", + "release_id", + "release_candidate", + "spec_fingerprint", + "gates_manifest_sha256", + "phases", + "phases_evaluated", + "blocked_at_phase", + "shippable", + "gates", + "policy_sha256", + "release_evidence", + "evidence_sha256", + "attestation", + } + missing = sorted(core_fields - set(map(str, report))) + if missing: + failures.append(f"{file} is missing report field(s) {missing}.") + return + if report.get("schema_version") != _UK_GATE_BATTERY_SCHEMA_VERSION: + failures.append( + f"{file} schema_version must be {_UK_GATE_BATTERY_SCHEMA_VERSION}." + ) + if report.get("country") != "uk": + failures.append(f"{file} country must be 'uk'.") + if report.get("release_candidate") is not True: + failures.append( + f"{file} release_candidate must be true: the battery ran in the " + "dev posture." + ) + if report.get("shippable") is not True: + failures.append(f"{file} shippable must be true.") + if report.get("blocked_at_phase") is not None: + failures.append(f"{file} blocked_at_phase must be null.") + if list(report.get("phases") or ()) != list(_UK_DENSE_GATE_PHASES): + failures.append(f"{file} phases must be {list(_UK_DENSE_GATE_PHASES)}.") + if list(report.get("phases_evaluated") or ()) != list(_UK_DENSE_GATE_PHASES): + failures.append( + f"{file} phases_evaluated must be {list(_UK_DENSE_GATE_PHASES)}." + ) + for field, expected in _UK_DENSE_GATE_DIGESTS.items(): + if report.get(field) != expected: + failures.append( + f"{file} {field} does not match the reviewed local gate spec." + ) + gates = report.get("gates") + if not isinstance(gates, Mapping): + failures.append(f"{file} gates must be an object.") + return + if set(map(str, gates)) != set(_UK_DENSE_GATE_ENTRY_IDS): + failures.append( + f"{file} gates must contain exactly the local battery entries " + f"{sorted(_UK_DENSE_GATE_ENTRY_IDS)}, got {sorted(map(str, gates))}." + ) + for entry_id, entry in gates.items(): + if not isinstance(entry, Mapping): + failures.append(f"{file} gate {entry_id!r} must be an object.") + continue + status = entry.get("status") + if status not in _UK_GATE_BATTERY_STATUSES: + failures.append(f"{file} gate {entry_id!r} has unknown status {status!r}.") + expected_criticality = ( + "release_blocking" + if entry_id in _UK_DENSE_RELEASE_BLOCKING_IDS + else "diagnostic" + ) + if entry.get("criticality") != expected_criticality: + failures.append( + f"{file} gate {entry_id!r} criticality must be " + f"{expected_criticality!r}." + ) + if ( + entry_id in _UK_DENSE_RELEASE_BLOCKING_IDS + and status not in _UK_GATE_BATTERY_SHIPPABLE_STATUSES + ): + failures.append( + f"{file} release-blocking gate {entry_id!r} did not pass ({status!r})." + ) + attestation = report.get("attestation") + if not isinstance(attestation, Mapping): + failures.append(f"{file} attestation must be an object.") + return + if attestation.get("schema_version") != _UK_GATE_BATTERY_ATTESTATION_SCHEMA_VERSION: + failures.append( + f"{file} attestation.schema_version must be " + f"{_UK_GATE_BATTERY_ATTESTATION_SCHEMA_VERSION}." + ) + if attestation.get("producer") != _UK_GATE_BATTERY_PRODUCER: + failures.append( + f"{file} attestation.producer must name the gate-battery executor." + ) + if attestation.get("signature_algorithm") != _UK_TERMINAL_GATE_SIGNATURE_ALGORITHM: + failures.append( + f"{file} attestation.signature_algorithm must be " + f"{_UK_TERMINAL_GATE_SIGNATURE_ALGORITHM!r}." + ) + for field in ( + "release_id", + "release_candidate", + "spec_fingerprint", + "gates_manifest_sha256", + "policy_sha256", + ): + if attestation.get(field) != report.get(field): + failures.append(f"{file} attestation.{field} disagrees with the report.") + if attestation.get("gate_outcomes_sha256") != _canonical_sha256(gates): + failures.append( + f"{file} attestation.gate_outcomes_sha256 does not match gates." + ) + if "signing_error" in attestation: + failures.append( + f"{file} attestation records a signing error; the report is unsigned." + ) + verification_key = _uk_gate_battery_verification_key(failures) + if verification_key is None: + return + if ( + attestation.get("signing_key_sha256") + != hashlib.sha256(verification_key).hexdigest() + ): + failures.append( + f"{file} attestation.signing_key_sha256 does not identify the trusted key." + ) + unsigned_report = dict(report) + unsigned_report["attestation"] = {**attestation, "signature": None} + expected_signature = hmac.new( + verification_key, _canonical_json_bytes(unsigned_report), hashlib.sha256 + ).hexdigest() + signature = attestation.get("signature") + if not isinstance(signature, str) or not hmac.compare_digest( + signature, expected_signature + ): + failures.append( + f"{file} attestation.signature does not authenticate the report " + "with the trusted key." + ) + + +def _check_uk_dense_source_coverage(coverage: Mapping, failures: list[str]) -> None: + file = _UK_DENSE_SOURCE_COVERAGE_FILE + for key in _UK_DENSE_SOURCE_COVERAGE_KEYS: + value = coverage.get(key) + if not isinstance(value, Mapping) or not value: + failures.append(f"{file} is missing the coverage object {key!r}.") + for key, sha_field in ( + ("spine", "sha256"), + ("geography_ladder", "sha256"), + ("ledger_artifact", "facts_sha256"), + ("ledger_artifact", "manifest_sha256"), + ): + block = coverage.get(key) + if isinstance(block, Mapping): + digest = block.get(sha_field) + if not isinstance(digest, str) or not _SHA256_RE.fullmatch(digest): + failures.append(f"{file} {key}.{sha_field} must be a sha256 digest.") + incumbent = coverage.get("incumbent") + if isinstance(incumbent, Mapping) and not incumbent.get("snapshot"): + failures.append(f"{file} incumbent must name the private-repo snapshot.") + holdout = coverage.get("holdout") + if isinstance(holdout, Mapping): + value = holdout.get("mean_holdout_loss") + if not isinstance(value, (int, float)) or not math.isfinite(value): + failures.append( + f"{file} holdout.mean_holdout_loss must be a finite number." + ) + + def _check_local_area_checksum_ledger( release_dir: Path, release_manifest: Mapping | None, failures: list[str], + *, + required_files: tuple[str, ...] = LOCAL_AREA_REQUIRED_RELEASE_FILES, ) -> None: """Validate sha256sums.txt as a real ledger, not a presence token. @@ -4164,7 +4494,7 @@ def _check_local_area_checksum_ledger( continue entries[name] = digest - for filename in LOCAL_AREA_REQUIRED_RELEASE_FILES: + for filename in required_files: if filename == "sha256sums.txt": continue if filename not in entries: @@ -4200,7 +4530,11 @@ def _check_local_area_checksum_ledger( def _check_local_area_release_manifest( - manifest: Mapping, release_id: str, failures: list[str] + manifest: Mapping, + release_id: str, + failures: list[str], + *, + revision_ok: Callable[[str], bool] | None = None, ) -> None: schema_version = manifest.get("schema_version") if schema_version != RELEASE_MANIFEST_SCHEMA_VERSION: @@ -4277,7 +4611,12 @@ def _check_local_area_release_manifest( f"release_manifest.json artifact {name!r} is missing {field!r}." ) revision = entry.get("revision") - if revision is not None and revision != release_id: + pinned = ( + revision == release_id + if revision_ok is None + else bool(revision_ok(str(revision))) + ) + if revision is not None and not pinned: failures.append( f"release_manifest.json artifact {name!r} revision " f"{revision!r} is not pinned to the release id " @@ -4473,6 +4812,9 @@ def validate_release_dir(release_dir: Path | str) -> None: ) role = declared_role if role == NON_DEFAULT_LOCAL_AREA_DATASET_ROLE: + if release_id == _UK_DENSE_RELEASE_ID: + _validate_uk_dense_release_dir(release_dir, release_id) + return _validate_local_area_release_dir(release_dir, release_id) return diff --git a/packages/microcosm-data/src/microcosm/data/registry.py b/packages/microcosm-data/src/microcosm/data/registry.py index 7e0dd0a59..eaa5e190f 100644 --- a/packages/microcosm-data/src/microcosm/data/registry.py +++ b/packages/microcosm-data/src/microcosm/data/registry.py @@ -108,6 +108,22 @@ def register(spec: DatasetSpec) -> DatasetSpec: ) ) +register( + DatasetSpec( + # microcosm#762 A18: the dense joint national + local UK line. Not a + # default variant — the compact national line stays the fast + # microsimulation artifact; this one carries every constituency and + # local authority at K=15 clones per spine household. + country="uk", + year=2025, + variant="dense", + hf_repo="policyengine/populace-uk-private", + filename="microcosm_uk_2025_dense.h5", + engine_module="policyengine_uk.data", + engine_class="UKSingleYearDataset", + engine_package="policyengine-uk", + ) +) register( DatasetSpec( country="us", diff --git a/packages/microcosm-data/tests/test_registry.py b/packages/microcosm-data/tests/test_registry.py index edc3b8553..4a069fef9 100644 --- a/packages/microcosm-data/tests/test_registry.py +++ b/packages/microcosm-data/tests/test_registry.py @@ -109,3 +109,13 @@ def test_register_refuses_to_shadow_a_key_with_a_different_spec() -> None: ) with pytest.raises(ValueError, match="already registered for"): register(conflicting) + + +def test_uk_2025_dense_is_registered_off_the_default_variant() -> None: + spec = REGISTRY[("uk", 2025, "dense")] + assert spec.variant == "dense" != DEFAULT_VARIANT + assert spec.hf_repo == "policyengine/populace-uk-private" + assert spec.filename == "microcosm_uk_2025_dense.h5" + assert spec.engine_class == "UKSingleYearDataset" + assert spec.engine_package == "policyengine-uk" + assert ("uk", 2025, DEFAULT_VARIANT) not in REGISTRY diff --git a/packages/microcosm-data/tests/test_uk_dense_release_contract.py b/packages/microcosm-data/tests/test_uk_dense_release_contract.py new file mode 100644 index 000000000..70ef92692 --- /dev/null +++ b/packages/microcosm-data/tests/test_uk_dense_release_contract.py @@ -0,0 +1,308 @@ +"""The dense joint UK line's release contract (microcosm#762 A18).""" + +from __future__ import annotations + +import base64 +import hashlib +import hmac +import json +from pathlib import Path + +import pytest + +from microcosm.data import contract as dc +from microcosm.data.contract import ( + ReleaseContractError, + _canonical_json_bytes, + _canonical_sha256, + validate_release_dir, +) + +DENSE_ID = "microcosm-uk-2024-25-dense" +CUT_TAG = f"{DENSE_ID}-20260903T105422Z-ca611e43" +KEY = base64.b64encode(b"\x07" * 32).decode() +KEY_BYTES = base64.b64decode(KEY) + + +@pytest.fixture(autouse=True) +def _trusted_key(monkeypatch) -> None: + monkeypatch.setenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY", KEY) + + +def _sha(payload: bytes) -> str: + return hashlib.sha256(payload).hexdigest() + + +def _signed_report(*, blocking_status: str = "passed", release_candidate: bool = True): + gates = {} + for entry_id in sorted(dc._UK_DENSE_GATE_ENTRY_IDS): + blocking = entry_id in dc._UK_DENSE_RELEASE_BLOCKING_IDS + gates[entry_id] = { + "gate": entry_id.removeprefix("uk_local_"), + "phase": "terminal", + "criticality": "release_blocking" if blocking else "diagnostic", + "status": blocking_status if blocking else "failed", + "failures": [] if blocking else ["diagnostic miss"], + "details": {}, + "reason": None, + } + attestation = { + "schema_version": dc._UK_GATE_BATTERY_ATTESTATION_SCHEMA_VERSION, + "producer": dc._UK_GATE_BATTERY_PRODUCER, + "country": "uk", + "release_id": "uk-local-candidate-f100-s42-20260903T105422Z-ca611e43", + "release_candidate": release_candidate, + "spec_fingerprint": dc._UK_DENSE_GATE_DIGESTS["spec_fingerprint"], + "gates_manifest_sha256": dc._UK_DENSE_GATE_DIGESTS["gates_manifest_sha256"], + "policy_sha256": dc._UK_DENSE_GATE_DIGESTS["policy_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "release_evidence": {}, + "evidence_sha256": {}, + "gate_outcomes_sha256": _canonical_sha256(gates), + "signature_algorithm": "hmac-sha256", + "signing_key_sha256": hashlib.sha256(KEY_BYTES).hexdigest(), + "signature": None, + } + report = { + "schema_version": dc._UK_GATE_BATTERY_SCHEMA_VERSION, + "country": "uk", + "release_id": attestation["release_id"], + "release_candidate": release_candidate, + "spec_fingerprint": attestation["spec_fingerprint"], + "gates_manifest_sha256": attestation["gates_manifest_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "shippable": blocking_status == "passed" and release_candidate, + "gates": gates, + "policy_sha256": attestation["policy_sha256"], + "release_evidence": {}, + "evidence_sha256": {}, + "attestation": attestation, + "posture": "local_candidate", + "scope_exclusions": {}, + "aggregate_admin_measurement": None, + } + attestation["signature"] = hmac.new( + KEY_BYTES, _canonical_json_bytes(report), hashlib.sha256 + ).hexdigest() + return report + + +def write_dense_bundle( + root: Path, + *, + release_id: str = DENSE_ID, + revision: str = CUT_TAG, + namespace: str = "uk_dense", + default_datasets: dict | None = None, + report: dict | None = None, + drop_coverage_key: str | None = None, + drop_households: bool = False, +) -> Path: + release_dir = root / "releases" / release_id + release_dir.mkdir(parents=True) + report = report or _signed_report() + diagnostics = { + "schema_version": 6, + "households": 4, + "n_targets": 2, + "n_records": 4, + "final_loss": 0.01, + "fraction_within_10pct": 0.98, + "targets": [ + { + "name": "ons.age.20_30@E14000001@2025", + "target": 10.0, + "compiled_target": 10.0, + "initial_estimate": 9.0, + "final_estimate": 10.0, + }, + { + "name": "dwp.uc.households@2025", + "target": 5.0, + "compiled_target": 5.0, + "initial_estimate": 4.0, + "final_estimate": 5.0, + }, + ], + } + if drop_households: + del diagnostics["households"] + gate_summary = { + "gates": { + entry_id: {"passed": report["gates"][entry_id]["status"] == "passed"} + for entry_id in dc._UK_DENSE_RELEASE_BLOCKING_IDS + }, + "diagnostic_gates": {}, + "reviewed_limitations": [], + } + coverage = { + "schema_version": 1, + "spine": {"path_name": "spine-m.h5", "sha256": "a" * 64}, + "ledger_artifact": { + "path_name": "chronicle-uk-artifact-1cab809", + "facts_sha256": "b" * 64, + "manifest_sha256": "c" * 64, + }, + "geography_ladder": {"sha256": "d" * 64}, + "incumbent": {"snapshot": {"incumbent_h5": {"sha256": "e" * 64}}}, + "doctrine": {"max_weight_ratio": 10.0}, + "measure_exclusions": {"obr.housing_benefit": {"expires_on": "2026-10-03"}}, + "signed_deferrals": {"binding_adjudications": {"x": {}}}, + "holdout": {"mean_holdout_loss": 0.2, "n_folds": 5}, + "uprating": {"applied": True, "factor": 1.03}, + } + if drop_coverage_key: + del coverage[drop_coverage_key] + build_manifest = {"build_id": release_id, "build_sha": "abc1234"} + score = { + "candidate_fitted_surface_loss": 0.01, + "incumbent_fitted_surface_loss": 0.2, + } + payloads = { + "calibration_diagnostics.json": json.dumps(diagnostics, indent=1).encode(), + "gate_summary.json": json.dumps(gate_summary, indent=1).encode(), + "uk_source_coverage.json": json.dumps(coverage, indent=1).encode(), + "uk_local_gates.json": json.dumps(report, indent=1).encode(), + "score_vs_incumbent.json": json.dumps(score, indent=1).encode(), + "build_manifest.json": json.dumps(build_manifest, indent=1).encode(), + } + for name, payload in payloads.items(): + (release_dir / name).write_bytes(payload) + h5_bytes = b"dense-h5-stand-in" + (root / "microcosm_uk_2025_dense.h5").write_bytes(h5_bytes) + + def artifact(kind, path, sha): + return { + "kind": kind, + "path": path, + "repo_id": "policyengine/populace-uk-private", + "revision": revision, + "sha256": sha, + } + + manifest = { + "schema_version": 1, + "data_package": {"name": "microcosm-data", "version": "0.1.0"}, + "dataset_role": "non_default_local_area", + "is_default": False, + "default_datasets": default_datasets if default_datasets is not None else {}, + "namespace": namespace, + "build": {"build_id": release_id}, + "artifacts": { + "microcosm_uk_2025_dense": artifact( + "microdata", "microcosm_uk_2025_dense.h5", _sha(h5_bytes) + ), + **{ + Path(name).stem: artifact("diagnostics", name, _sha(payload)) + for name, payload in payloads.items() + if name != "build_manifest.json" + }, + }, + "reviewed_limitations": [{"id": "rotated_holdout"}], + } + manifest_text = json.dumps(manifest, indent=1) + (release_dir / "release_manifest.json").write_text(manifest_text) + ledger = {name: _sha(payload) for name, payload in payloads.items()} + ledger["release_manifest.json"] = _sha(manifest_text.encode()) + ledger["microcosm_uk_2025_dense.h5"] = _sha(h5_bytes) + (release_dir / "sha256sums.txt").write_text( + "".join(f"{digest} {name}\n" for name, digest in sorted(ledger.items())) + ) + return release_dir + + +def test_valid_dense_bundle_passes(tmp_path: Path) -> None: + validate_release_dir(write_dense_bundle(tmp_path)) + + +def test_dense_bundle_accepts_the_release_id_as_revision(tmp_path: Path) -> None: + validate_release_dir(write_dense_bundle(tmp_path, revision=DENSE_ID)) + + +def _failures(release_dir: Path) -> str: + with pytest.raises(ReleaseContractError) as excinfo: + validate_release_dir(release_dir) + return str(excinfo.value) + + +def test_unpinned_revision_is_rejected(tmp_path: Path) -> None: + assert "not pinned" in _failures(write_dense_bundle(tmp_path, revision="main")) + + +def test_wrong_namespace_is_rejected(tmp_path: Path) -> None: + assert "namespace" in _failures(write_dense_bundle(tmp_path, namespace="uk_local")) + + +def test_default_slot_claim_is_rejected(tmp_path: Path) -> None: + text = _failures(write_dense_bundle(tmp_path, default_datasets={"national": "x"})) + assert "default_datasets" in text + + +def test_failing_release_blocking_gate_is_rejected(tmp_path: Path) -> None: + text = _failures( + write_dense_bundle(tmp_path, report=_signed_report(blocking_status="failed")) + ) + assert "did not pass" in text and "shippable" in text + + +def test_dev_posture_report_is_rejected(tmp_path: Path) -> None: + text = _failures( + write_dense_bundle(tmp_path, report=_signed_report(release_candidate=False)) + ) + assert "release_candidate must be true" in text + + +def test_tampered_signature_is_rejected(tmp_path: Path) -> None: + report = _signed_report() + report["attestation"]["signature"] = "0" * 64 + assert "signature does not authenticate" in _failures( + write_dense_bundle(tmp_path, report=report) + ) + + +def test_report_edited_after_signing_is_rejected(tmp_path: Path) -> None: + report = _signed_report() + report["gates"]["uk_local_target_fit"]["status"] = "passed" + text = _failures(write_dense_bundle(tmp_path, report=report)) + assert "gate_outcomes_sha256" in text + + +def test_foreign_entry_ids_are_rejected(tmp_path: Path) -> None: + report = _signed_report() + report["gates"]["uk_terminal_something"] = report["gates"].pop( + "uk_local_weight_ess" + ) + assert "exactly the local battery entries" in _failures( + write_dense_bundle(tmp_path, report=report) + ) + + +def test_missing_coverage_object_is_rejected(tmp_path: Path) -> None: + assert "coverage object 'incumbent'" in _failures( + write_dense_bundle(tmp_path, drop_coverage_key="incumbent") + ) + + +def test_diagnostics_without_households_are_rejected(tmp_path: Path) -> None: + assert "households" in _failures(write_dense_bundle(tmp_path, drop_households=True)) + + +def test_missing_key_env_names_the_hole(tmp_path: Path, monkeypatch) -> None: + release_dir = write_dense_bundle(tmp_path) + monkeypatch.delenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY") + assert "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" in _failures(release_dir) + + +def test_other_local_area_ids_keep_the_generic_contract(tmp_path: Path) -> None: + # A non-dense local-area id never reaches the dense validator. + release_dir = write_dense_bundle( + tmp_path, + release_id="populace-uk-2025-frs-k9", + revision="populace-uk-2025-frs-k9", + ) + text = _failures(release_dir) + assert "us_source_coverage.json" in text diff --git a/tools/assemble_uk_dense_release_dir.py b/tools/assemble_uk_dense_release_dir.py new file mode 100644 index 000000000..193b97c6a --- /dev/null +++ b/tools/assemble_uk_dense_release_dir.py @@ -0,0 +1,653 @@ +"""Assemble the dense joint UK line's release directory (microcosm#762 A18). + +Mirrors ``assemble_uk_release_dir.py`` for the ``microcosm-uk-2024-25-dense`` +line: verify the complete hash join over a finished ``--release-candidate`` +run of ``build_uk_rowwise_candidate.py`` (its manifest, signed gate report, +diagnostics and incumbent score, plus the spine, ladder, Ledger artifact and +incumbent extraction it stood on), run the release-candidate pre-flight, +mint the per-cut tag from the run's attempt id, stage the bundle under the +non-default local-area role with UK evidence, validate it with the release +contract, and only then rename it into place. The candidate H5 is cloned +beside itself under the published filename; nothing is uploaded — the +summary prints the exact ``publish_cli`` command for the human step +(``--no-latest``, per-cut tag, private repo). +""" + +from __future__ import annotations + +import argparse +import glob +import hashlib +import importlib.util +import json +import re +import shlex +import shutil +import subprocess +import sys +import uuid +from collections.abc import Mapping +from datetime import UTC, datetime +from pathlib import Path + +from microcosm.build.uk_runtime.release_identity import UK_DENSE_RELEASE_ID +from microcosm.data.contract import validate_release_dir + +_REPO_ID = "policyengine/populace-uk-private" +_NAMESPACE = "uk_dense" +_DATASET_KEY = "microcosm_uk_2025_dense" +_DATASET_FILENAME = f"{_DATASET_KEY}.h5" +_ATTEMPT_SUFFIX = re.compile(r"[0-9]{8}T[0-9]{6}Z-[0-9a-f]{8}") +_RUNTIME_PACKAGES = ("policyengine-core", "policyengine-uk", "microcosm-data") +_GIT_COMMIT = re.compile(r"^[0-9a-f]{40}$") + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for chunk in iter(lambda: handle.read(1 << 20), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _load_json(path: Path, *, label: str) -> Mapping[str, object]: + try: + payload = json.loads(path.read_bytes()) + except (OSError, UnicodeDecodeError, json.JSONDecodeError) as error: + raise SystemExit(f"error: {label} is not readable JSON: {error}") from error + if not isinstance(payload, Mapping): + raise SystemExit(f"error: {label} must be a JSON object") + return payload + + +def _mapping(value: object, label: str) -> Mapping[str, object]: + if not isinstance(value, Mapping): + raise SystemExit(f"error: {label} must be a JSON object") + return value + + +def _require_equal(label: str, actual: object, expected: object) -> None: + if actual != expected: + raise SystemExit(f"error: {label}: {actual!r} != {expected!r}") + + +def _write_json(path: Path, payload: Mapping[str, object]) -> None: + temporary = path.with_name(path.name + ".tmp") + temporary.write_text(json.dumps(payload, indent=1, sort_keys=True) + "\n") + temporary.replace(path) + + +def _clone_file(source: Path, destination: Path) -> None: + """Copy with an APFS clone when the platform offers one, else bytes.""" + + if sys.platform == "darwin": + result = subprocess.run( + ["cp", "-c", str(source), str(destination)], + capture_output=True, + check=False, + ) + if result.returncode == 0: + return + shutil.copyfile(source, destination) + + +def _preflight_module(): + spec = importlib.util.spec_from_file_location( + "preflight_uk_local_release_candidate", + Path(__file__).resolve().with_name("preflight_uk_local_release_candidate.py"), + ) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def _cut_tag(attempt_id: str, override: str | None) -> str: + prefix = UK_DENSE_RELEASE_ID + "-" + if override is not None: + if not override.startswith(prefix) or not _ATTEMPT_SUFFIX.fullmatch( + override[len(prefix) :] + ): + raise SystemExit( + f"error: --cut-tag must be {prefix}-" + ) + return override + match = re.search(r"([0-9]{8}T[0-9]{6}Z-[0-9a-f]{8})$", attempt_id) + if match is None: + raise SystemExit( + "error: the run's build id must end with -" + ) + return f"{UK_DENSE_RELEASE_ID}-{match.group(1)}" + + +def _reviewed_limitations( + manifest: Mapping[str, object], report: Mapping[str, object] +) -> list[dict[str, object]]: + limitations: list[dict[str, object]] = [] + for gate_id, entry in (report.get("gates") or {}).items(): + if ( + isinstance(entry, Mapping) + and entry.get("criticality") == "diagnostic" + and entry.get("status") != "passed" + ): + limitations.append( + { + "id": f"diagnostic_gate_{gate_id}", + "summary": f"diagnostic gate {gate_id} did not pass; it never blocks release.", + "failures": list(entry.get("failures") or [])[:5], + } + ) + for name, record in sorted((manifest.get("measure_exclusions") or {}).items()): + if isinstance(record, Mapping): + limitations.append( + { + "id": f"measure_exclusion:{name}", + "summary": str(record.get("reason", ""))[:300], + "tracking": record.get("tracking"), + "expires_on": record.get("expires_on"), + } + ) + solve = _mapping(manifest.get("solve"), "manifest.solve") + exclusions = solve.get("area_support_exclusions") + if isinstance(exclusions, Mapping): + for area in exclusions.get("entries_stood_on") or []: + limitations.append( + { + "id": f"area_support_exclusion:{area}", + "summary": "reviewed exclusion of the local-authority support floor.", + } + ) + cross_grain = _mapping(manifest.get("cross_grain"), "manifest.cross_grain") + for bridge in cross_grain.get("unbound_bridges") or []: + if isinstance(bridge, Mapping): + limitations.append( + { + "id": f"unbound_bridge:{bridge.get('bridge_id')}", + "summary": "cross-grain bridge unbound with a receipt; the lower rows bind as published.", + } + ) + holdout = _mapping( + _mapping(manifest.get("fit"), "manifest.fit").get("rotated_holdout"), + "manifest.fit.rotated_holdout", + ) + limitations.append( + { + "id": "rotated_holdout", + "summary": "capped relative-error loss on local rows the solve never saw.", + "mean_holdout_loss": holdout.get("mean_holdout_loss"), + "worst_holdout_loss": holdout.get("worst_holdout_loss"), + } + ) + return limitations + + +def _assemble(args: argparse.Namespace) -> dict[str, object]: + candidate_dir: Path = args.candidate_dir + manifest = _load_json( + candidate_dir / "rowwise_candidate_manifest.json", + label="rowwise_candidate_manifest.json", + ) + outputs = _mapping(manifest.get("outputs"), "manifest.outputs") + identity = _mapping(manifest.get("identity"), "manifest.identity") + + def output_path(key: str) -> Path: + entry = _mapping(outputs.get(key), f"manifest.outputs.{key}") + path = Path(str(entry.get("path"))) + return path if path.is_absolute() else candidate_dir / path + + candidate_h5 = output_path("dataset") + diagnostics_path = output_path("calibration_diagnostics") + report_path = output_path("local_gate_report") + score_path = candidate_dir / "score_vs_incumbent.json" + inputs = { + "candidate": candidate_h5, + "diagnostics": diagnostics_path, + "gate report": report_path, + "score receipt": score_path, + "spine H5": args.spine_h5, + } + for label, path in inputs.items(): + if not path.is_file(): + raise SystemExit(f"error: {label} missing: {path}") + measured = {label: _sha256(path) for label, path in inputs.items()} + for key, label in ( + ("dataset", "candidate"), + ("calibration_diagnostics", "diagnostics"), + ("local_gate_report", "gate report"), + ): + _require_equal( + f"{label} bytes vs manifest.outputs.{key}.sha256", + measured[label], + _mapping(outputs.get(key), key).get("sha256"), + ) + spine_identity = _mapping(identity.get("spine"), "manifest.identity.spine") + _require_equal( + "spine H5 vs manifest.identity.spine.sha256", + measured["spine H5"], + spine_identity.get("sha256"), + ) + for pinned in ("spine", "ladder"): + if _mapping(identity.get(pinned), pinned).get("pin_verified") is not True: + raise SystemExit( + f"error: manifest.identity.{pinned}.pin_verified is not true" + ) + report = _load_json(report_path, label="local gate report") + rows = sorted(glob.glob(str(candidate_dir / "logbook-spool" / "*.json"))) + if not rows: + raise SystemExit("error: the candidate directory carries no Logbook row") + logbook_row = _load_json(Path(rows[-1]), label="Logbook row") + attempt_id = str(logbook_row.get("build_id") or "") + _require_equal( + "gate report release_id vs Logbook build_id", + report.get("release_id"), + attempt_id, + ) + preflight = _preflight_module() + failures = preflight.check_candidate_dir(candidate_dir) + if failures: + raise SystemExit( + "error: release-candidate pre-flight failed:\n" + + "\n".join(f" - {f}" for f in failures) + ) + diagnostics = _load_json(diagnostics_path, label="calibration diagnostics") + score = _load_json(score_path, label="score receipt") + incumbent = _load_json(args.incumbent_manifest, label="--incumbent-manifest") + runtime_block = _mapping(identity.get("runtime"), "manifest.identity.runtime") + runtime = {} + for package in _RUNTIME_PACKAGES: + value = runtime_block.get(package) + if not isinstance(value, str) or not value: + raise SystemExit(f"error: manifest.identity.runtime.{package} is missing") + runtime[package] = value + code_pin = str( + _mapping(identity.get("code"), "identity.code").get("git_commit") or "" + ) + if not _GIT_COMMIT.fullmatch(code_pin): + raise SystemExit( + "error: manifest.identity.code.git_commit must be a 40-hex commit" + ) + cut_tag = _cut_tag(attempt_id, args.cut_tag) + parameters = _mapping(manifest.get("parameters"), "manifest.parameters") + if parameters.get("release_candidate") is not True: + raise SystemExit("error: the run was not a --release-candidate run") + + destination = args.out_dir / UK_DENSE_RELEASE_ID + if destination.exists() or destination.is_symlink(): + raise SystemExit( + f"error: {destination} already exists; remove the previous assembly first" + ) + artifact_root: Path = args.artifact_root or candidate_h5.parent + published_h5 = artifact_root / _DATASET_FILENAME + if published_h5.exists(): + if _sha256(published_h5) != measured["candidate"]: + raise SystemExit( + f"error: {published_h5} exists with different bytes; remove it first" + ) + else: + _clone_file(candidate_h5, published_h5) + staging_parent = args.out_dir / f".assemble-{uuid.uuid4().hex}" + staging_parent.mkdir(parents=True) + try: + return _stage_and_finalize( + staging_parent=staging_parent, + destination=destination, + artifact_root=artifact_root, + manifest=manifest, + report=report, + diagnostics=diagnostics, + score=score, + incumbent=incumbent, + measured=measured, + attempt_id=attempt_id, + cut_tag=cut_tag, + runtime=runtime, + code_pin=code_pin, + report_path=report_path, + score_path=score_path, + logbook_row=logbook_row, + ) + finally: + shutil.rmtree(staging_parent, ignore_errors=True) + + +def _stage_and_finalize( + *, + staging_parent: Path, + destination: Path, + artifact_root: Path, + manifest: Mapping[str, object], + report: Mapping[str, object], + diagnostics: Mapping[str, object], + score: Mapping[str, object], + incumbent: Mapping[str, object], + measured: Mapping[str, str], + attempt_id: str, + cut_tag: str, + runtime: Mapping[str, str], + code_pin: str, + report_path: Path, + score_path: Path, + logbook_row: Mapping[str, object], +) -> dict[str, object]: + created_at = datetime.now(UTC).isoformat() + release_dir = staging_parent / UK_DENSE_RELEASE_ID + release_dir.mkdir(parents=True) + identity = _mapping(manifest.get("identity"), "identity") + parameters = _mapping(manifest.get("parameters"), "parameters") + solve = _mapping(manifest.get("solve"), "solve") + fit = _mapping(manifest.get("fit"), "fit") + weights = _mapping(manifest.get("weights"), "weights") + n_targets = len(list(diagnostics.get("targets") or [])) + households = int(solve.get("n_households") or diagnostics.get("n_records") or 0) + shipped_diagnostics = { + **diagnostics, + # The local-area contract reads these two; the driver's schema-6 + # diagnostics carry the same facts under n_records / len(targets). + "households": households, + "n_targets": n_targets, + "source_diagnostics_sha256": measured["diagnostics"], + } + _write_json(release_dir / "calibration_diagnostics.json", shipped_diagnostics) + gates = _mapping(report.get("gates"), "report.gates") + gate_summary = { + "schema_version": 1, + "source": _DATASET_KEY, + "signed_report": "uk_local_gates.json", + "gates": { + gate_id: { + "passed": entry.get("status") == "passed", + "status": entry.get("status"), + "failures": list(entry.get("failures") or []), + } + for gate_id, entry in gates.items() + if isinstance(entry, Mapping) + and entry.get("criticality") == "release_blocking" + }, + "diagnostic_gates": { + gate_id: { + "status": entry.get("status"), + "failures": list(entry.get("failures") or [])[:10], + } + for gate_id, entry in gates.items() + if isinstance(entry, Mapping) + and entry.get("criticality") != "release_blocking" + }, + "reviewed_limitations": _reviewed_limitations(manifest, report), + } + _write_json(release_dir / "gate_summary.json", gate_summary) + ladder = _mapping(identity.get("ladder"), "identity.ladder") + ledger = _mapping(identity.get("ledger"), "identity.ledger") + spine = _mapping(identity.get("spine"), "identity.spine") + coverage = { + "schema_version": 1, + "spine": { + "path_name": Path(str(spine.get("path"))).name, + "sha256": spine.get("sha256"), + "bytes": spine.get("bytes"), + "provenance": { + k: v + for k, v in _mapping( + spine.get("spine_provenance"), "spine_provenance" + ).items() + if k + in ( + "rules_engine", + "source_vintages", + "stages", + "stochastic_contract_sha256", + ) + }, + }, + "ledger_artifact": { + "path_name": ledger.get("path_name"), + "facts_sha256": ledger.get("facts_sha256"), + "manifest_sha256": ledger.get("manifest_sha256"), + "fact_row_count": ledger.get("fact_row_count"), + "schema_version": ledger.get("schema_version"), + }, + "geography_ladder": { + "sha256": ladder.get("sha256"), + "bytes": ladder.get("bytes"), + "layer_vintages": ladder.get("layer_vintages"), + }, + "incumbent": { + "snapshot": incumbent.get("inputs"), + "period": incumbent.get("period"), + "households": incumbent.get("households"), + "score_receipt_sha256": measured["score receipt"], + "rows_compared": score.get("rows_compared"), + "incumbent_missing_areas": score.get("incumbent_missing_areas"), + }, + "doctrine": dict(_mapping(parameters.get("doctrine"), "parameters.doctrine")), + "measure_exclusions": { + name: {"expires_on": rec.get("expires_on"), "tracking": rec.get("tracking")} + for name, rec in (manifest.get("measure_exclusions") or {}).items() + if isinstance(rec, Mapping) + }, + "signed_deferrals": { + "binding_adjudications": _mapping( + solve.get("binding_adjudications"), "binding_adjudications" + ).get("stood_on"), + "area_support_exclusions": _mapping( + solve.get("area_support_exclusions"), "area_support_exclusions" + ).get("entries_stood_on"), + "unbound_bridges": [ + b.get("bridge_id") + for b in ( + _mapping(manifest.get("cross_grain"), "cross_grain").get( + "unbound_bridges" + ) + or [] + ) + if isinstance(b, Mapping) + ], + "licensed_empty_legs": len( + _mapping(manifest.get("cross_grain"), "cross_grain").get( + "empty_legs_licensed" + ) + or [] + ), + }, + "holdout": dict(_mapping(fit.get("rotated_holdout"), "fit.rotated_holdout")), + "uprating": { + k: v + for k, v in _mapping( + manifest.get("ladder_household_uprating"), "ladder_household_uprating" + ).items() + if k != "reason" + }, + "weights": { + "calibration_mass_change": weights.get("calibration_mass_change"), + "realized_max_weight_ratio_vs_design": weights.get( + "realized_max_weight_ratio_vs_design" + ), + }, + "logbook_row": { + "build_id": logbook_row.get("build_id"), + "row_digest": logbook_row.get("row_digest"), + "prev_row_digest": logbook_row.get("prev_row_digest"), + }, + } + coverage["holdout"].pop("folds", None) + _write_json(release_dir / "uk_source_coverage.json", coverage) + shutil.copyfile(report_path, release_dir / "uk_local_gates.json") + shutil.copyfile(score_path, release_dir / "score_vs_incumbent.json") + build_manifest = { + "build_id": UK_DENSE_RELEASE_ID, + "build_sha": code_pin[:7], + "code": { + "repository": "PolicyEngine/microcosm", + "git_commit": code_pin, + "git_dirty": False, + }, + "runtime": dict(runtime), + "dataset": { + "filename": _DATASET_FILENAME, + "sha256": measured["candidate"], + "households": households, + "clone_count": parameters.get("n_clones"), + }, + "calibration": { + "doctrine": dict(_mapping(parameters.get("doctrine"), "doctrine")), + "epochs": parameters.get("epochs"), + "n_targets": n_targets, + "n_targets_by_kind": solve.get("n_targets_by_kind"), + "final_loss": solve.get("final_loss"), + }, + "gates": { + gate_id: entry.get("status") + for gate_id, entry in gates.items() + if isinstance(entry, Mapping) + }, + "attempt_id": attempt_id, + "cut_tag": cut_tag, + "created_at": created_at, + } + _write_json(release_dir / "build_manifest.json", build_manifest) + + def artifact(kind: str, path: str, sha256: str) -> dict[str, str]: + return { + "kind": kind, + "path": path, + "repo_id": _REPO_ID, + "revision": cut_tag, + "sha256": sha256, + } + + evidence_files = ( + "calibration_diagnostics.json", + "gate_summary.json", + "uk_source_coverage.json", + "uk_local_gates.json", + "score_vs_incumbent.json", + "build_manifest.json", + ) + evidence_sha = {name: _sha256(release_dir / name) for name in evidence_files} + release_manifest = { + "schema_version": 1, + "data_package": { + "name": "microcosm-data", + "version": runtime["microcosm-data"], + }, + "dataset_role": "non_default_local_area", + "is_default": False, + "default_datasets": {}, + "namespace": _NAMESPACE, + "build": { + "build_id": UK_DENSE_RELEASE_ID, + "built_at": created_at, + "built_with_core_package": { + "name": "policyengine-core", + "version": runtime["policyengine-core"], + }, + "built_with_model_package": { + "name": "policyengine-uk", + "version": runtime["policyengine-uk"], + }, + "attempt_id": attempt_id, + "cut_tag": cut_tag, + }, + "compatible_core_packages": [ + { + "name": "policyengine-core", + "specifier": f"=={runtime['policyengine-core']}", + } + ], + "compatible_model_packages": [ + {"name": "policyengine-uk", "specifier": f"=={runtime['policyengine-uk']}"} + ], + "artifacts": { + _DATASET_KEY: artifact( + "microdata", _DATASET_FILENAME, measured["candidate"] + ), + **{ + Path(name).stem: artifact("diagnostics", name, evidence_sha[name]) + for name in evidence_files + if name != "build_manifest.json" + }, + }, + "reviewed_limitations": gate_summary["reviewed_limitations"], + "description": f"UK dense joint national + local line assembled from attempt {attempt_id} at immutable cut {cut_tag}; inspect lane, never the default slot.", + "publisher_labels": { + "obr": "Office for Budget Responsibility", + "hmrc": "HM Revenue and Customs", + "ons": "Office for National Statistics", + "dwp": "Department for Work and Pensions", + "voa": "Valuation Office Agency", + "slc": "Student Loans Company", + }, + } + _write_json(release_dir / "release_manifest.json", release_manifest) + sums = { + name: _sha256(release_dir / name) + for name in sorted(p.name for p in release_dir.glob("*.json")) + } + sums[_DATASET_FILENAME] = measured["candidate"] + (release_dir / "sha256sums.txt").write_text( + "".join(f"{digest} {name}\n" for name, digest in sorted(sums.items())) + ) + validate_release_dir(release_dir) + release_dir.rename(destination) + publish_command = shlex.join( + [ + "uv", + "run", + "python", + "-m", + "microcosm.data.publish_cli", + str(destination), + "--repo-id", + _REPO_ID, + "--artifact-root", + str(artifact_root), + "--no-latest", + "--tag-name", + cut_tag, + ] + ) + return { + "release_id": UK_DENSE_RELEASE_ID, + "release_dir": str(destination), + "cut_tag": cut_tag, + "dataset": { + "path": str(artifact_root / _DATASET_FILENAME), + "sha256": measured["candidate"], + }, + "evidence": {name: _sha256(destination / name) for name in evidence_files}, + "publish_command": publish_command, + } + + +def _parse_args(argv: list[str] | None) -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--candidate-dir", + required=True, + type=Path, + help="a finished --release-candidate run directory", + ) + parser.add_argument("--spine-h5", required=True, type=Path) + parser.add_argument( + "--incumbent-manifest", + required=True, + type=Path, + help="incumbent_local_surface_manifest.json from the extractor", + ) + parser.add_argument("--out-dir", required=True, type=Path) + parser.add_argument( + "--artifact-root", + type=Path, + help="where the published H5 is cloned (default: beside the candidate)", + ) + parser.add_argument("--cut-tag") + return parser.parse_args(argv) + + +def main(argv: list[str] | None = None) -> int: + summary = _assemble(_parse_args(argv)) + print(json.dumps(summary, indent=2, sort_keys=True)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/preflight_uk_local_release_candidate.py b/tools/preflight_uk_local_release_candidate.py index 32b4ec53d..964cc62bf 100644 --- a/tools/preflight_uk_local_release_candidate.py +++ b/tools/preflight_uk_local_release_candidate.py @@ -230,8 +230,18 @@ def main(argv: list[str] | None = None) -> int: parser.add_argument("--ledger-facts", type=Path) parser.add_argument("--skip-digests", action="store_true") parser.add_argument("--candidate-dir", type=Path, help="check a finished run") + parser.add_argument( + "--release-dir", type=Path, help="validate an assembled release directory" + ) args = parser.parse_args(argv) failures: list[str] = [] + if args.release_dir is not None: + from microcosm.data.contract import ReleaseContractError, validate_release_dir + + try: + validate_release_dir(args.release_dir) + except ReleaseContractError as error: + failures += [str(line) for line in getattr(error, "failures", [str(error)])] if args.env: missing = [ n @@ -254,8 +264,10 @@ def main(argv: list[str] | None = None) -> int: ) if args.candidate_dir is not None: failures += check_candidate_dir(args.candidate_dir) - if not args.env and args.candidate_dir is None: - parser.error("nothing to check: pass --env and/or --candidate-dir") + if not args.env and args.candidate_dir is None and args.release_dir is None: + parser.error( + "nothing to check: pass --env, --candidate-dir and/or --release-dir" + ) for failure in failures: print(f"FAIL {failure}", file=sys.stderr) print( From b47e4ba83f31a6c43322d782a30655796233941c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:08:54 +0200 Subject: [PATCH 15/26] =?UTF-8?q?Receipts=20R16:=20release-candidate=20re-?= =?UTF-8?q?run=20after=20A17=20=E2=80=94=20tenure=2099.2=20percent=20withi?= =?UTF-8?q?n=2010=20percent,=20shippable,=20holdout=200.190=20(#762)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index e5d6ae837..2beb8a65e 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -306,3 +306,25 @@ Mechanism: policyengine-uk's `corporate_land_value` distributes the parameter `a Actions on this branch: the two land entries are withdrawn from `calibration_measure_exclusions.json` (51 → 49; A16 is five rows: savings interest, housing benefit, the two plan-2 borrower stocks, JSA claimants — all block-insensitive, so their evidence stands); the register test pins follow; the manifest's `measure_resolution` block now carries a `block_sensitivity` caveat naming the known population-normalised measures whenever `--engine-blocks > 1`, and the doctrine note is that **evidence from a per-block run must not adjudicate a population-normalised row** — the release posture is single-block already (R11: 10.2 GB at K=15). The #736 item and the R12 table need the same correction (drafted for María's go, not posted). The next release-candidate run binds both land rows. Savings interest, re-examined with the same care: the row is block-insensitive and the miss is real, but it is partly a **concept** gap, not only a frame gap. Three published figures: the FRS-based spine carries £13.8bn at 2025 (engine-uprated by the ONS HAXV index); HMRC's SPI 2023-24 taxable savings interest of taxpayers sums to £18.3bn across the income bands (taxpayers only, ISA interest excluded); the ONS row is UKEA HAXV, households' (S.14) D.41 interest **resources** in the national accounts — £95.5bn for 2025, up from £19.6bn in 2021 — which includes FISIM-adjusted interest and the household sector's unincorporated businesses. The spine is roughly a third under the HMRC taxpayer figure once uprated, which is a frame gap; the further four- to five-fold step to the ONS row is definitional. The right fix is a declared reconciliation on the target side (bind the SPI amount, or a declared D.41-to-cash bridge), not only a spine imputation — that is what the spine issue should ask for. + +## R16 — Release-candidate re-run after A17 (2026-09-03, 16:00–19:07; PR B c3fed31f; `--release-candidate`, single block, holdout 5 folds) + +Pre-flight `--env` OK before launch; pre-flight `--candidate-dir` OK after: release posture attested (`release_candidate: true`, **`shippable: true`**, signed), every release-blocking gate passed, doctrine values, A15 + A17 applied (1,436 tenure cells uprated: 1,308 census-2021, 128 census-2022), 49 measure exclusions receipted, holdout measured, chain intact (row `…160005Z-e39715fc` on R13's). Wall 11,176 s (3.1 h), peak 9.0 GB. Matrix 20,475 rows (359 national — the two land rows back in after R15 — 19,105 local, 1,011 ladder) × 792,690. No warnings; weights all positive. + +| | R13 | **R16** | +|---|---|---| +| loss initial → final | 0.3041 → 0.0156 | 0.3030 → 0.0143 | +| local within 10 %: age / census / HMRC / UC / tenure / council tax | 100 / 99.3 / 99.2 / 99.9 / **87.3** / 91.5 | 100 / 99.7 / 99.2 / 99.9 / **99.2** / 91.9 | +| tenure within 10 % by metric: outright / mortgage / private / social | 65.7 / 90.3 / 95.0 / 98.1 | **97.2 / 99.7 / 100 / 99.7** | +| national within 10 % / 25 % | 94.7 / 99.2 (357 rows) | 94.7 / 99.2 (359 rows; 340 / 356) | +| land rows (now bound): corporate / total / household | excluded | +0.3 % / −6.0 % / +0.4 % | +| max / median weight; ESS fraction | 398; 0.161 | 400; 0.163 | +| constituency ESS min / median | 65.7 / 219 | 63.8 / 220 | +| households (FRS grossing 29.25M) | 28.93M (0.989) | **29.07M (0.994)** | +| lone over-65 households (target 4.25M) | 4.24M | 4.27M | +| Glasgow social rent (target now 105,849 after A17) | 150k / 102k | 136k / 106k | +| holdout mean / worst (uncalibrated 0.304) | 0.204 / 0.213 | **0.190 / 0.199** | +| vs incumbent on 19,089 rows: loss / within 10 % / wins | 0.0146 vs 0.181 / 98.0 vs 60.4 / 16,973 vs 2,116 | 0.0154 vs 0.181 / **98.8 vs 60.4** / 16,936 vs 2,153 | +| gate report | `release_candidate: false`, not shippable | **`release_candidate: true`, shippable, signed** | + +Readings: A17 closes the tenure seam (owned outright 65.7 → 97.2 % within 10 %) with no cost elsewhere; households land 0.6 % under the FRS grossing; the holdout improves because the uprated tenure cells are consistent with the household rows the folds hold out; the land rows bind within 6 % once measured in a single block. Remaining national misses past 25 %: council-tax band D stock (+30 %), UC 5+-children households (−29 %), one SPI self-employment band (+27 %). The diagnostic `target_fit` gate lists 42 local cells past 25 % (council-tax bands and the Kensington/Westminster self-employment amounts). This is the artifact the dense line (`microcosm-uk-2024-25-dense`, A18) assembles from. From b3e1c5e19c0bd61206afb39d7b85e3cb6237bd8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:29:09 +0200 Subject: [PATCH 16/26] Re-sign scoped gate reports with the gate battery's canonical form; pre-flight authenticates the report as the contract will (#762) Found when assembling the dense line from R16: the release contract could not authenticate the signed local report. resign_uk_gate_report (used by finalize_uk_scoped_gate_report for the local and the national seam reports) signed with the Logbook's canonical JSON, which renders integral floats without the .0 (50 instead of 50.0), while the battery and every verifier use json.dumps's form. Any report whose gate details carry an integral float - the local battery's ESS floor 50.0 - therefore failed verification. Sign with the battery's canonical bytes; a regression test finalizes a report carrying 50.0 and verifies it under the contract. The candidate pre-flight now runs the contract's report verification so this class of defect surfaces right after a run. Co-Authored-By: Claude Fable 5.1 --- .../build/uk_runtime/calibration_run.py | 12 ++- .../tests/test_gate_battery_contract_pins.py | 93 +++++++++++++++++++ .../tests/test_uk_local_release_preflight.py | 90 +++++++++++++++--- tools/preflight_uk_local_release_candidate.py | 12 +++ 4 files changed, 192 insertions(+), 15 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 6a53e5c5a..c4679b3d5 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 @@ -28,6 +28,9 @@ GateBatteryRun, gate_signing_key_env, ) +from microcosm.build.gate_battery import ( + _canonical_json_bytes as gate_battery_canonical_json_bytes, +) from microcosm.build.logbook import canonical_json_bytes from microcosm.build.logbook_adoption import ( AttemptState, @@ -1056,8 +1059,15 @@ def resign_uk_gate_report(payload: dict[str, object]) -> None: attestation.pop("signing_error", None) attestation["signing_key_sha256"] = hashlib.sha256(key).hexdigest() attestation["signature"] = None + # Sign with the gate battery's canonical form — the one the battery used + # for the original signature and the one every verifier (the data + # contract's terminal and dense checks) recomputes. The Logbook's + # canonical form renders integral floats without the ".0" (50.0 -> 50), + # so a report re-signed with it cannot be authenticated wherever a gate + # detail carries an integral float (microcosm#762 R17: the local + # battery's ESS floor 50.0). attestation["signature"] = hmac.new( - key, canonical_json_bytes(payload), hashlib.sha256 + key, gate_battery_canonical_json_bytes(payload), hashlib.sha256 ).hexdigest() diff --git a/packages/microcosm-build/tests/test_gate_battery_contract_pins.py b/packages/microcosm-build/tests/test_gate_battery_contract_pins.py index 96bd5524d..0c20790fc 100644 --- a/packages/microcosm-build/tests/test_gate_battery_contract_pins.py +++ b/packages/microcosm-build/tests/test_gate_battery_contract_pins.py @@ -422,3 +422,96 @@ def test_scoped_digests_mirror_the_live_local_manifest(self) -> None: ) for field, mirrored in data_contract._UK_DENSE_GATE_DIGESTS.items(): assert mirrored == live[field], field + + +class TestResignCanonicalForm: + """A re-signed scoped report authenticates under the contract (#762 R17).""" + + def test_resigned_report_with_integral_float_verifies(self, monkeypatch) -> None: + import base64 + import copy + import hashlib + import json + + from microcosm.build.gate_battery import _canonical_sha256 + from microcosm.build.uk_runtime.calibration_run import ( + finalize_uk_scoped_gate_report, + ) + + key = base64.b64encode(b"\x05" * 32).decode() + monkeypatch.setenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY", key) + gates = {} + for entry_id in sorted(data_contract._UK_DENSE_GATE_ENTRY_IDS): + blocking = entry_id in data_contract._UK_DENSE_RELEASE_BLOCKING_IDS + gates[entry_id] = { + "gate": entry_id.removeprefix("uk_local_"), + "phase": "terminal", + "criticality": "release_blocking" if blocking else "diagnostic", + "status": "passed", + "failures": [], + # The integral float that separates the Logbook canonical + # form (50) from the gate battery's (50.0). + "details": {"floors": {"minimum_effective_sample_size": 50.0}}, + "reason": None, + } + attestation = { + "schema_version": data_contract._UK_GATE_BATTERY_ATTESTATION_SCHEMA_VERSION, + "producer": data_contract._UK_GATE_BATTERY_PRODUCER, + "country": "uk", + "release_id": "uk-local-candidate-f100-s42-20260903T160005Z-e39715fc", + "release_candidate": True, + "spec_fingerprint": data_contract._UK_DENSE_GATE_DIGESTS[ + "spec_fingerprint" + ], + "gates_manifest_sha256": data_contract._UK_DENSE_GATE_DIGESTS[ + "gates_manifest_sha256" + ], + "policy_sha256": data_contract._UK_DENSE_GATE_DIGESTS["policy_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "release_evidence": {}, + "evidence_sha256": {}, + "gate_outcomes_sha256": _canonical_sha256(gates), + "signature_algorithm": "hmac-sha256", + "signing_key_sha256": None, + "signature": None, + "signing_error": "unsigned at battery time", + } + payload = { + "schema_version": data_contract._UK_GATE_BATTERY_SCHEMA_VERSION, + "country": "uk", + "release_id": attestation["release_id"], + "release_candidate": True, + "spec_fingerprint": attestation["spec_fingerprint"], + "gates_manifest_sha256": attestation["gates_manifest_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "shippable": True, + "gates": gates, + "policy_sha256": attestation["policy_sha256"], + "release_evidence": {}, + "evidence_sha256": {}, + "attestation": attestation, + } + finalize_uk_scoped_gate_report( + payload, + posture="local_candidate", + scope_exclusions={}, + aggregate_admin_measurement=None, + ) + # Round-trip through JSON exactly as the driver persists it. + persisted = json.loads(json.dumps(payload, sort_keys=True)) + assert ( + persisted["attestation"]["signing_key_sha256"] + == hashlib.sha256(base64.b64decode(key)).hexdigest() + ) + failures: list[str] = [] + data_contract._check_uk_dense_gate_report(persisted, failures=failures) + assert failures == [], failures + tampered = copy.deepcopy(persisted) + tampered["posture"] = "edited" + failures = [] + data_contract._check_uk_dense_gate_report(tampered, failures=failures) + assert any("signature does not authenticate" in f for f in failures) diff --git a/packages/microcosm-build/tests/test_uk_local_release_preflight.py b/packages/microcosm-build/tests/test_uk_local_release_preflight.py index cf24cdaab..5fd292dff 100644 --- a/packages/microcosm-build/tests/test_uk_local_release_preflight.py +++ b/packages/microcosm-build/tests/test_uk_local_release_preflight.py @@ -63,23 +63,85 @@ def _good_candidate(tmp_path: Path) -> Path: }, } (candidate / "rowwise_candidate_manifest.json").write_text(json.dumps(manifest)) + (candidate / "microcosm_uk_2025_local.local_gates.json").write_text( + json.dumps(_signed_report()) + ) + return candidate + + +KEY = base64.b64encode(b"\x06" * 32).decode() + + +@pytest.fixture(autouse=True) +def _trusted_key(monkeypatch) -> None: + monkeypatch.setenv("MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY", KEY) + + +def _signed_report() -> dict: + """A complete schema-4 local report signed the way the battery signs.""" + + import hashlib + import hmac + + from microcosm.build.gate_battery import _canonical_json_bytes, _canonical_sha256 + from microcosm.data import contract as dc + + key_bytes = base64.b64decode(KEY) + gates = {} + for entry_id in sorted(dc._UK_DENSE_GATE_ENTRY_IDS): + blocking = entry_id in dc._UK_DENSE_RELEASE_BLOCKING_IDS + gates[entry_id] = { + "gate": entry_id.removeprefix("uk_local_"), + "phase": "terminal", + "criticality": "release_blocking" if blocking else "diagnostic", + "status": "passed" if blocking else "failed", + "failures": [] if blocking else ["a diagnostic miss"], + "details": {"floors": {"minimum_effective_sample_size": 50.0}}, + "reason": None, + } + attestation = { + "schema_version": dc._UK_GATE_BATTERY_ATTESTATION_SCHEMA_VERSION, + "producer": dc._UK_GATE_BATTERY_PRODUCER, + "country": "uk", + "release_id": "uk-local-candidate-f100-s42-20260903T160005Z-e39715fc", + "release_candidate": True, + "spec_fingerprint": dc._UK_DENSE_GATE_DIGESTS["spec_fingerprint"], + "gates_manifest_sha256": dc._UK_DENSE_GATE_DIGESTS["gates_manifest_sha256"], + "policy_sha256": dc._UK_DENSE_GATE_DIGESTS["policy_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], + "blocked_at_phase": None, + "release_evidence": {}, + "evidence_sha256": {}, + "gate_outcomes_sha256": _canonical_sha256(gates), + "signature_algorithm": "hmac-sha256", + "signing_key_sha256": hashlib.sha256(key_bytes).hexdigest(), + "signature": None, + } report = { + "schema_version": dc._UK_GATE_BATTERY_SCHEMA_VERSION, + "country": "uk", + "release_id": attestation["release_id"], "release_candidate": True, - "shippable": True, + "spec_fingerprint": attestation["spec_fingerprint"], + "gates_manifest_sha256": attestation["gates_manifest_sha256"], + "phases": ["terminal"], + "phases_evaluated": ["terminal"], "blocked_at_phase": None, - "attestation": {"signature": "abc"}, - "gates": { - "uk_local_area_support": { - "criticality": "release_blocking", - "status": "passed", - }, - "uk_local_target_fit": {"criticality": "diagnostic", "status": "failed"}, - }, + "shippable": True, + "gates": gates, + "policy_sha256": attestation["policy_sha256"], + "release_evidence": {}, + "evidence_sha256": {}, + "attestation": attestation, + "posture": "local_candidate", + "scope_exclusions": {}, + "aggregate_admin_measurement": None, } - (candidate / "microcosm_uk_2025_local.local_gates.json").write_text( - json.dumps(report) - ) - return candidate + attestation["signature"] = hmac.new( + key_bytes, _canonical_json_bytes(report), hashlib.sha256 + ).hexdigest() + return report def test_good_candidate_dir_passes(tmp_path: Path) -> None: @@ -130,7 +192,7 @@ def test_good_candidate_dir_passes(tmp_path: Path) -> None: ), "release-blocking gate", ), - (lambda m, r: r.__setitem__("attestation", {}), "signature"), + (lambda m, r: r["attestation"].__setitem__("signature", "0" * 64), "signature"), ], ) def test_each_missing_flag_is_named(tmp_path: Path, mutate, needle: str) -> None: diff --git a/tools/preflight_uk_local_release_candidate.py b/tools/preflight_uk_local_release_candidate.py index 964cc62bf..9d340129e 100644 --- a/tools/preflight_uk_local_release_candidate.py +++ b/tools/preflight_uk_local_release_candidate.py @@ -214,6 +214,18 @@ def check_candidate_dir(candidate_dir: Path, *, today: date | None = None) -> li failures.append( f"release-blocking gate {gate_id} status {entry.get('status')!r}." ) + # Authenticate the report exactly as the release contract will, so a + # signing defect surfaces right after the run rather than at assembly. + try: + from microcosm.data.contract import _check_uk_dense_gate_report + + contract_failures: list[str] = [] + _check_uk_dense_gate_report(report, failures=contract_failures) + failures += [f"contract: {line}" for line in contract_failures] + except ImportError: + failures.append( + "microcosm.data.contract is not importable; the report cannot be verified." + ) if not glob.glob(str(candidate_dir / "logbook-spool" / "*.json")): failures.append("no Logbook row in logbook-spool/.") return failures From d5eedb83ed234b91c118a931bd0a620534adfbfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:39:46 +0200 Subject: [PATCH 17/26] Seam test verifies the re-signed report with the gate battery's canonical form (#762) The test had encoded the Logbook canonical form the defective re-signer used; it now recomputes the HMAC the way every verifier does. Co-Authored-By: Claude Fable 5.1 --- .../tests/test_uk_calibration_run.py | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/packages/microcosm-build/tests/test_uk_calibration_run.py b/packages/microcosm-build/tests/test_uk_calibration_run.py index 5781eb777..7e2afd1f5 100644 --- a/packages/microcosm-build/tests/test_uk_calibration_run.py +++ b/packages/microcosm-build/tests/test_uk_calibration_run.py @@ -11,7 +11,9 @@ import pytest from microcosm.build.country_spec import load_country_spec -from microcosm.build.logbook import canonical_json_bytes +from microcosm.build.gate_battery import ( + _canonical_json_bytes as canonical_json_bytes, +) from microcosm.build.uk_runtime import calibration_run from microcosm.build.uk_runtime.calibration_run import ( UK_CALIBRATION_GATE_SCOPE, @@ -137,9 +139,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 +178,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 +238,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 +262,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 +287,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 +474,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 +517,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 +570,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 +633,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 +773,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 +830,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 +881,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", From fb2dc742362eb2cb36a40ccd4a881fc0f990ec40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 00:37:20 +0200 Subject: [PATCH 18/26] Receipts R17: release-candidate re-run on the fixed re-signer (byte-identical weights to R16) and the first contract-valid dense release directory (#762) Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index 2beb8a65e..c2ea7d8dd 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -328,3 +328,28 @@ Pre-flight `--env` OK before launch; pre-flight `--candidate-dir` OK after: rele | gate report | `release_candidate: false`, not shippable | **`release_candidate: true`, shippable, signed** | Readings: A17 closes the tenure seam (owned outright 65.7 → 97.2 % within 10 %) with no cost elsewhere; households land 0.6 % under the FRS grossing; the holdout improves because the uprated tenure cells are consistent with the household rows the folds hold out; the land rows bind within 6 % once measured in a single block. Remaining national misses past 25 %: council-tax band D stock (+30 %), UC 5+-children households (−29 %), one SPI self-employment band (+27 %). The diagnostic `target_fit` gate lists 42 local cells past 25 % (council-tax bands and the Kensington/Westminster self-employment amounts). This is the artifact the dense line (`microcosm-uk-2024-25-dense`, A18) assembles from. + +## R17 — Release-candidate re-run on the fixed re-signer, and the first assembled dense release directory (2026-09-03 19:30 → 2026-09-04 00:10; PR B 0f5c1978) + +**Why a re-run.** Assembling the dense line from R16 stopped at one contract failure: the signed local gate report did not authenticate. `resign_uk_gate_report` (called by `finalize_uk_scoped_gate_report` for the local report and for the national seam report) signed with the Logbook's canonical JSON, which renders integral floats without the decimal (`50` for `50.0`), while the gate battery and every verifier use `json.dumps`'s form — so any report whose gate details carry an integral float (the local battery's ESS floor `50.0`) could not be verified. Fixed on PR B (0f5c1978: sign with the battery's canonical bytes; regression test finalizes a report carrying `50.0` and verifies it under the contract; the candidate pre-flight now runs the contract's report verification). Re-signing R16's report in place would have changed bytes under a recorded manifest, so the candidate was re-run end to end on the fixed code. + +**R17 is byte-identical to R16 in everything the solve produced.** Same seed, same inputs, same code apart from the signature: the household weights are equal element for element (max abs diff 0.0), the loss trajectory, every fit share, the holdout and the incumbent score are identical; only the build id, timestamps, the H5 provenance columns and the signature differ (H5 sha `c352448b…` vs `09166f9c…`). Wall 11,122 s, peak 11.1 GB; chain intact on R16's row; no warnings. Pre-flight `--env` OK before; pre-flight `--candidate-dir` OK after, now including the contract's own signature verification. + +| R17 (= R16) | | +|---|---| +| loss | 0.3030 → 0.01427 | +| local within 10 %: age / census / HMRC / UC / tenure / council tax | 100 / 99.7 / 99.2 / 99.9 / 99.2 / 91.9 | +| national within 10 % / 25 % (359 rows) | 94.7 / 99.2 | +| max / median weight; ESS fraction; constituency ESS min / median | 400; 0.163; 63.8 / 220 | +| households | 29,073,744 (FRS grossing 29,247,433; −0.6 %) | +| holdout mean / worst (uncalibrated 0.304) | 0.1895 / 0.1991 | +| vs incumbent, 19,089 rows: loss / wins | 0.0154 vs 0.1815 / 16,936 vs 2,153 | +| gate report | `release_candidate: true`, `shippable: true`, signed and **contract-verified** | + +**The assembled dense release (A18).** `tools/assemble_uk_dense_release_dir.py` verified the hash join (every manifest output against its bytes, the spine against its pin, the gate report against the Logbook build id), re-ran the pre-flight, minted the cut tag **`microcosm-uk-2024-25-dense-20260903T192959Z-3bcacf74`** from the attempt id, cloned the H5 beside the run as `microcosm_uk_2025_dense.h5` (sha equal to the candidate's), staged `build_manifest.json`, `release_manifest.json` (`dataset_role: non_default_local_area`, `default_datasets: {}`, `is_default: false`, namespace `uk_dense`, six artifacts pinned to the cut tag in `policyengine/populace-uk-private`, 55 reviewed limitations: the two failing diagnostic gates, the 49 measure exclusions, the two micro-authority exclusions, the unbound composition bridge, the holdout), `calibration_diagnostics.json` (the run's, plus `households` and `n_targets`), `gate_summary.json` (both release-blocking gates passed; `target_fit` and `weight_ratio` recorded as diagnostic failures), `uk_source_coverage.json`, the signed `uk_local_gates.json`, `score_vs_incumbent.json`, `sha256sums.txt`; `microcosm.data.contract.validate_release_dir` passed; the directory was renamed into `data/ukds/acceptance/762-rowwise-candidate/releases/microcosm-uk-2024-25-dense/`; the pre-flight `--release-dir` check passed. **Nothing was published.** The printed human step is: + +``` +uv run python -m microcosm.data.publish_cli /microcosm-uk-2024-25-dense --repo-id policyengine/populace-uk-private --artifact-root --no-latest --tag-name microcosm-uk-2024-25-dense-20260903T192959Z-3bcacf74 +``` + +This closes the plan's I8: the machinery (PR A), the rulings and registers (PR B), the measured doctrine, the release candidate, the incumbent comparison and the contract-valid release directory all exist; what remains before any publication is María's review of both PRs and her go on the human step. I9 (the evaluator on the incumbent's target surface) and I10 (L0 sparsity) follow. From f29ca4990735b33415c091369211beddd64f037e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:53:55 +0200 Subject: [PATCH 19/26] Evaluate the candidate on the incumbent's target surface, every grain, signed items included (#762 I9) tools/evaluate_uk_incumbent_surface.py scores a dense candidate on the vendored, hash-pinned fixtures of the incumbent's national (637 rows) and local (23,545 rows) target surfaces: the national rows join to our compiled specs by name, normalised name or single-cell contract id and are estimated through the un-excluded registry's constraint matrix over the calibrated weights, so the signed-out rows are measured too; the local rows map to our metrics by name (the VOA bands by alias) and are estimated from the engine-resolved household metrics; every row carries our status - bound, measure-excluded (with tracking and expiry), signed-deferred (with the reason id), no fact, or not ported with the parity register's concern - and the incumbent's own estimates on its local surface come from the extractor tables. Summaries by grain, source and metric; a markdown report that leads with the ugly part. Co-Authored-By: Claude Fable 5.1 --- .../incumbent_surface_evaluation.py | 460 ++++++++++++++++++ .../test_uk_incumbent_surface_evaluation.py | 265 ++++++++++ tools/evaluate_uk_incumbent_surface.py | 266 ++++++++++ 3 files changed, 991 insertions(+) create mode 100644 packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py create mode 100644 packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py create mode 100644 tools/evaluate_uk_incumbent_surface.py diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py new file mode 100644 index 000000000..b80d190e4 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py @@ -0,0 +1,460 @@ +"""Evaluate a UK candidate on the incumbent's target surface (microcosm#762 I9). + +The scorer compares both artifacts on *our* register. This module answers the +opposite question: how does the candidate do on the surface the incumbent +(uk-data at the pinned ref) calibrates to — every grain, every row, signed +items included — so the parts we deliberately do not bind are still measured +and the reader can see what we do not do and why. + +Inputs are the two vendored, hash-pinned fixtures of the incumbent's surface +(``registry_parity_fixture_2025.json`` for the national rows, +``local_registry_parity_fixture_2025.json`` for the local rows), the parity +register (``uk_data_target_parity.json``) for the status of families we route +or fence, the local reference membership for per-cell statuses, and the +measure-exclusion register. The candidate's estimates come from the caller +(engine-resolved metrics and a constraint matrix over the calibrated weights); +this module owns the joins, the classification and the summaries. +""" + +from __future__ import annotations + +import json +from collections.abc import Iterable, Mapping +from importlib import resources as importlib_resources +from typing import Any + +import numpy as np +import pandas as pd + +__all__ = [ + "INCUMBENT_LOCAL_METRIC_ALIASES", + "classify_local_rows", + "classify_national_rows", + "evaluation_summary", + "load_incumbent_local_fixture", + "load_incumbent_national_fixture", + "load_uk_data_target_parity", + "match_national_rows", + "national_family_status", + "render_markdown", +] + +#: Incumbent local metric name -> our metric name where the concept is the +#: same VOA band-count column under a different name. Every other incumbent +#: metric either shares our name exactly or has no counterpart in our surface. +INCUMBENT_LOCAL_METRIC_ALIASES: Mapping[str, str] = { + f"voa/council_tax/{band}": f"council_tax/band_{band.lower()}" for band in "ABCDEFGH" +} + +_AREA_TYPE_TO_LEVEL = { + "constituency": "constituency", + "local_authority": "local_authority", +} +_AREA_TYPE_TO_METRIC_GRAIN = {"constituency": "constituency", "local_authority": "la"} + + +def _resource_text(name: str) -> str: + return ( + importlib_resources.files("microcosm.build.uk") + .joinpath(name) + .read_text(encoding="utf-8") + ) + + +def load_incumbent_national_fixture() -> dict[str, Any]: + return json.loads(_resource_text("registry_parity_fixture_2025.json")) + + +def load_incumbent_local_fixture() -> dict[str, Any]: + return json.loads(_resource_text("local_registry_parity_fixture_2025.json")) + + +def load_uk_data_target_parity() -> dict[str, Any]: + return json.loads(_resource_text("uk_data_target_parity.json")) + + +def national_family_status(parity: Mapping[str, Any]) -> dict[str, tuple[str, str]]: + """Map an incumbent source token (``fixture row['source']``) to the parity + register's ``(status, concern_id)`` through the concern's ``covers``.""" + + import re + + by_source: dict[str, tuple[str, str]] = {} + for concern in parity.get("concerns", ()): + for covered in concern.get("covers", ()): + match = re.search(r"targets\.sources\.([a-z_0-9]+)$", str(covered)) + if match is None: + continue + source = match.group(1) + # A ported status wins over a routed/excluded one for the same + # source token: the family is on our surface, the concern narrows it. + current = by_source.get(source) + if current is None or ( + current[0] not in ("ported_national",) + and concern["status"] == "ported_national" + ): + by_source[source] = (str(concern["status"]), str(concern["concern_id"])) + # The incumbent's source tokens are shorter than the module names. + aliases = { + "hmrc_spi": "hmrc_spi", + "hmrc": "hmrc_cgt", + "ons": "ons_demographics", + "voa": "voa_council_tax", + "obr": "obr", + "dwp": "dwp", + "slc": "slc", + "nts": "nts_vehicles", + "ehs": "housing", + "scottish_government": "scottish_government", + "scotland_census": "ons_households", + } + return { + token: by_source[module] + for token, module in aliases.items() + if module in by_source + } + + +def _normalise(name: str) -> str: + return name.replace("/", ".").lower() + + +def _with_nullable_objects(frame: pd.DataFrame, columns: Iterable[str]) -> pd.DataFrame: + """Keep ``None`` (not ``NaN``) in optional columns so callers can test + identity and JSON round-trips stay ``null``.""" + + for column in columns: + if column in frame.columns: + values = frame[column].astype(object) + frame[column] = values.where(values.notna(), None) + return frame + + +def match_national_rows( + fixture_rows: Iterable[Mapping[str, Any]], + our_specs: Iterable[Mapping[str, Any]], +) -> pd.DataFrame: + """Join incumbent national rows to our compiled specs. + + ``our_specs`` rows carry ``name`` (the compiled spec name, no period), + ``contract_target_id`` and ``value`` (our target). Matching order: exact + name, then name with ``/`` read as ``.``, then a contract id that names a + single cell on both sides. Everything else is ``unmatched`` and keeps the + incumbent's value so it is still listed. + """ + + ours = list(our_specs) + by_name = {str(s["name"]): s for s in ours} + by_norm = {_normalise(str(s["name"])): s for s in ours} + by_cid: dict[str, list[Mapping[str, Any]]] = {} + for s in ours: + cid = s.get("contract_target_id") + if cid: + by_cid.setdefault(str(cid), []).append(s) + inc_cid_counts: dict[str, int] = {} + rows = list(fixture_rows) + for r in rows: + cid = r.get("contract_target_id") + if cid: + inc_cid_counts[str(cid)] = inc_cid_counts.get(str(cid), 0) + 1 + out = [] + for r in rows: + name = str(r["name"]) + cid = r.get("contract_target_id") + match, how = None, "unmatched" + if name in by_name: + match, how = by_name[name], "name" + elif _normalise(name) in by_norm: + match, how = by_norm[_normalise(name)], "normalised_name" + elif ( + cid + and inc_cid_counts.get(str(cid)) == 1 + and len(by_cid.get(str(cid), [])) == 1 + ): + match, how = by_cid[str(cid)][0], "contract_id" + out.append( + { + "incumbent_name": name, + "contract_target_id": cid, + "source": r.get("source"), + "family": r.get("family"), + "incumbent_target": float(r["value"]), + "resolved_from_year": r.get("resolved_from_year"), + "our_name": None if match is None else str(match["name"]), + "our_target": None if match is None else float(match["value"]), + "match": how, + } + ) + return _with_nullable_objects( + pd.DataFrame(out), ("our_name", "our_target", "contract_target_id") + ) + + +def classify_national_rows( + matched: pd.DataFrame, + *, + bound_names: set[str], + exclusions: Mapping[str, Mapping[str, Any]], + source_status: Mapping[str, tuple[str, str]], +) -> pd.DataFrame: + """Attach our status to every incumbent national row.""" + + statuses, reasons = [], [] + for row in matched.itertuples(index=False): + if not isinstance(row.our_name, str): + status, concern = source_status.get(str(row.source), ("not_ported", "")) + statuses.append( + f"not_ported:{status}" if status != "not_ported" else "not_ported" + ) + reasons.append(concern) + elif row.our_name in exclusions: + rec = exclusions[row.our_name] + statuses.append("measure_excluded") + reasons.append( + f"{rec.get('tracking', '')} expires {rec.get('expires_on', '')}" + ) + elif row.our_name in bound_names: + statuses.append("bound") + reasons.append("") + else: + statuses.append("compiled_not_bound") + reasons.append("") + frame = matched.copy() + frame["status"] = statuses + frame["status_detail"] = reasons + return frame + + +def classify_local_rows( + fixture_rows: Iterable[Mapping[str, Any]], + *, + metric_target_ids: Mapping[str, str], + membership: Mapping[str, Any], + our_metric_names: Mapping[str, Iterable[str]], + bound_names: set[str], + unmapped_concern: Mapping[str, tuple[str, str]], +) -> pd.DataFrame: + """Map incumbent local rows to our metrics and attach our per-cell status. + + ``metric_target_ids`` maps our metric name to the contract target id; + ``membership`` is ``local_target_reference_membership.json``; + ``our_metric_names`` maps grain (``constituency`` / ``la``) to the declared + metric names; ``unmapped_concern`` maps an incumbent metric with no + counterpart to its parity ``(status, concern_id)``. + """ + + candidates: dict[tuple[str, str, str], Mapping[str, Any]] = {} + targets = membership.get("targets", {}) + for target_id, payload in targets.items(): + for level, level_payload in (payload.get("geography_levels") or {}).items(): + for cand in level_payload.get("candidates") or (): + candidates[ + (str(target_id), str(level), str(cand.get("geography_id"))) + ] = cand + deferral_reason: dict[tuple[str, str, str], str] = {} + for d in membership.get("signed_deferrals", ()): + for area in d.get("area_ids", ()): + deferral_reason[ + (str(d["target_id"]), str(d["geography_level"]), str(area)) + ] = str(d["reason_id"]) + out = [] + for r in fixture_rows: + area_type = str(r["area_type"]) + grain = _AREA_TYPE_TO_METRIC_GRAIN.get(area_type, area_type) + level = _AREA_TYPE_TO_LEVEL.get(area_type, area_type) + metric = str(r["metric"]) + our_metric = INCUMBENT_LOCAL_METRIC_ALIASES.get(metric, metric) + declared = our_metric in set(our_metric_names.get(grain, ())) + target_id = metric_target_ids.get(our_metric) if declared else None + area = str(r["geography_id"]) + key = (str(target_id), level, area) + if not declared: + status, concern = unmapped_concern.get(metric, ("not_ported", "")) + status = f"not_ported:{status}" if status != "not_ported" else "not_ported" + detail = concern + elif f"{target_id}@{area}@{r.get('period', 2025)}" in bound_names or ( + f"{target_id}@{area}" in bound_names + ): + status, detail = "bound", "" + elif key in deferral_reason: + status, detail = "signed_deferred", deferral_reason[key] + elif key in candidates: + status, detail = str(candidates[key].get("status")), "" + else: + status, detail = "no_reference", "" + out.append( + { + "incumbent_name": r["name"], + "area_type": area_type, + "geography_id": area, + "incumbent_metric": metric, + "our_metric": our_metric if declared else None, + "target_id": target_id, + "incumbent_target": float(r["value"]), + "incumbent_raw_value": float(r.get("raw_value", r["value"])), + "adjustment_factor": r.get("adjustment_factor"), + "boundary_mapped_from_2010": bool( + r.get("boundary_mapped_from_2010", False) + ), + "status": status, + "status_detail": detail, + } + ) + return _with_nullable_objects(pd.DataFrame(out), ("our_metric", "target_id")) + + +def _relative_error(estimate: pd.Series, target: pd.Series) -> pd.Series: + denom = target.where(target.abs() > 0, np.nan) + return (estimate - target) / denom + + +def evaluation_summary(national: pd.DataFrame, local: pd.DataFrame) -> dict[str, Any]: + """Counts and fit shares by grain, family/metric and status.""" + + def block( + frame: pd.DataFrame, group: str, estimate_col: str + ) -> list[dict[str, Any]]: + rows = [] + if frame.empty: + return rows + rel = _relative_error(frame[estimate_col], frame["incumbent_target"]) + frame = frame.assign(_rel=rel) + for key, sub in frame.groupby(group, dropna=False): + measured = sub["_rel"].notna() + rows.append( + { + group: key, + "rows": int(len(sub)), + "measured": int(measured.sum()), + "within_10pct": float( + (sub["_rel"].abs() <= 0.10).sum() / max(1, measured.sum()) + ), + "within_25pct": float( + (sub["_rel"].abs() <= 0.25).sum() / max(1, measured.sum()) + ), + "median_abs_rel": float(sub.loc[measured, "_rel"].abs().median()) + if measured.any() + else None, + "by_status": { + str(k): int(v) for k, v in sub["status"].value_counts().items() + }, + } + ) + return rows + + def overall(frame: pd.DataFrame, estimate_col: str) -> dict[str, Any]: + if frame.empty: + return {"rows": 0, "measured": 0} + rel = _relative_error(frame[estimate_col], frame["incumbent_target"]) + measured = rel.notna() + return { + "rows": int(len(frame)), + "measured": int(measured.sum()), + "within_10pct": float((rel.abs() <= 0.10).sum() / max(1, measured.sum())), + "within_25pct": float((rel.abs() <= 0.25).sum() / max(1, measured.sum())), + "median_abs_rel": float(rel[measured].abs().median()) + if measured.any() + else None, + "by_status": { + str(k): int(v) for k, v in frame["status"].value_counts().items() + }, + } + + summary: dict[str, Any] = { + "national": { + "candidate": overall(national, "candidate_estimate"), + "by_source": block(national, "source", "candidate_estimate"), + }, + "local": { + "candidate": overall(local, "candidate_estimate"), + "by_area_type": block(local, "area_type", "candidate_estimate"), + "by_metric": block(local, "incumbent_metric", "candidate_estimate"), + }, + } + if "incumbent_estimate" in local.columns: + summary["local"]["incumbent"] = overall(local, "incumbent_estimate") + summary["local"]["incumbent_by_metric"] = block( + local, "incumbent_metric", "incumbent_estimate" + ) + return summary + + +def render_markdown( + summary: Mapping[str, Any], national: pd.DataFrame, local: pd.DataFrame +) -> str: + lines = ["# Candidate on the incumbent's target surface", ""] + nat = summary["national"]["candidate"] + lines.append( + f"**National** ({nat['rows']} incumbent rows, {nat['measured']} measurable on our side): " + f"within 10 % {100 * nat.get('within_10pct', 0):.1f} %, within 25 % {100 * nat.get('within_25pct', 0):.1f} %, " + f"median abs error {nat.get('median_abs_rel')}. By status: {nat.get('by_status')}." + ) + loc = summary["local"]["candidate"] + lines.append( + f"**Local** ({loc['rows']} incumbent rows, {loc['measured']} measurable): " + f"within 10 % {100 * loc.get('within_10pct', 0):.1f} %, within 25 % {100 * loc.get('within_25pct', 0):.1f} %, " + f"median abs error {loc.get('median_abs_rel')}. By status: {loc.get('by_status')}." + ) + if "incumbent" in summary["local"]: + inc = summary["local"]["incumbent"] + lines.append( + f"**Incumbent on its own local surface** (same mapped rows): within 10 % " + f"{100 * inc.get('within_10pct', 0):.1f} %, within 25 % {100 * inc.get('within_25pct', 0):.1f} %." + ) + lines += [ + "", + "## National by source", + "", + "| source | rows | measured | within 10 % | within 25 % | median abs | statuses |", + "|---|---|---|---|---|---|---|", + ] + for b in summary["national"]["by_source"]: + lines.append( + f"| {b['source']} | {b['rows']} | {b['measured']} | {100 * b['within_10pct']:.0f} % | {100 * b['within_25pct']:.0f} % | {b['median_abs_rel'] if b['median_abs_rel'] is None else round(b['median_abs_rel'], 3)} | {b['by_status']} |" + ) + lines += [ + "", + "## Local by metric", + "", + "| metric | rows | measured | candidate within 10 % | incumbent within 10 % | statuses |", + "|---|---|---|---|---|---|", + ] + inc_by_metric = { + b["incumbent_metric"]: b + for b in summary["local"].get("incumbent_by_metric", []) + } + for b in summary["local"]["by_metric"]: + inc = inc_by_metric.get(b["incumbent_metric"], {}) + lines.append( + f"| {b['incumbent_metric']} | {b['rows']} | {b['measured']} | {100 * b['within_10pct']:.0f} % | {100 * inc.get('within_10pct', 0):.0f} % | {b['by_status']} |" + ) + worst = national.assign( + rel_error=_relative_error( + national["candidate_estimate"], national["incumbent_target"] + ) + ) + worst = worst.reindex( + worst["rel_error"].abs().sort_values(ascending=False).index + ).head(15) + lines += [ + "", + "## The ugly part: worst national rows (measurable)", + "", + "| incumbent row | status | incumbent target | our estimate | rel. error |", + "|---|---|---|---|---|", + ] + for r in worst.itertuples(index=False): + if pd.isna(r.rel_error): + continue + lines.append( + f"| {r.incumbent_name} | {r.status} | {r.incumbent_target:,.4g} | {r.candidate_estimate:,.4g} | {r.rel_error:+.1%} |" + ) + unmeasured = national[national["candidate_estimate"].isna()] + lines += ["", f"## Not measurable on our side: {len(unmeasured)} national rows", ""] + for status, sub in unmeasured.groupby("status"): + lines.append( + f"- **{status}** ({len(sub)}): " + + ", ".join(sorted(sub["incumbent_name"].astype(str))[:12]) + + (" …" if len(sub) > 12 else "") + ) + return "\n".join(lines) + "\n" diff --git a/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py b/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py new file mode 100644 index 000000000..2d81f8f4b --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py @@ -0,0 +1,265 @@ +"""The incumbent-surface evaluator's joins, statuses and summaries (#762 I9).""" + +from __future__ import annotations + +import pandas as pd + +from microcosm.build.uk_runtime.incumbent_surface_evaluation import ( + INCUMBENT_LOCAL_METRIC_ALIASES, + classify_local_rows, + classify_national_rows, + evaluation_summary, + load_incumbent_local_fixture, + load_incumbent_national_fixture, + load_uk_data_target_parity, + match_national_rows, + national_family_status, + render_markdown, +) + + +def test_fixtures_and_parity_load_from_the_package() -> None: + national = load_incumbent_national_fixture() + local = load_incumbent_local_fixture() + parity = load_uk_data_target_parity() + assert national["fixture"] == "incumbent_2025" and len(national["rows"]) == 637 + assert local["fixture"] == "incumbent_local_2025" and len(local["rows"]) == 23_545 + assert set(INCUMBENT_LOCAL_METRIC_ALIASES) <= set(local["surface"]["metrics"]) + status = national_family_status(parity) + assert status["hmrc_spi"][0] == "ported_national" + assert status["nts"][0] == "routed" + + +def test_national_rows_match_by_name_then_normalised_name_then_single_cell_contract_id() -> ( + None +): + fixture = [ + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "source": "hmrc_spi", + "family": "hmrc_spi", + "value": 10.0, + }, + { + "name": "dwp/esa_claimants", + "contract_target_id": "dwp.esa_claimants", + "source": "dwp", + "family": "dwp", + "value": 20.0, + }, + { + "name": "dwp/pip_dl_standard_claimants", + "contract_target_id": "dwp.pip.daily_living_standard_claimants", + "source": "dwp", + "family": "dwp", + "value": 30.0, + }, + {"name": "nts/vehicles_total", "source": "nts", "family": "nts", "value": 40.0}, + ] + ours = [ + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000", + "contract_target_id": "hmrc.spi.employment_income.amount_by_total_income_band", + "value": 11.0, + }, + { + "name": "dwp.esa_claimants", + "contract_target_id": "dwp.esa_claimants", + "value": 21.0, + }, + { + "name": "dwp.pip.daily_living_standard", + "contract_target_id": "dwp.pip.daily_living_standard_claimants", + "value": 31.0, + }, + ] + matched = match_national_rows(fixture, ours) + assert matched["match"].tolist() == [ + "name", + "normalised_name", + "contract_id", + "unmatched", + ] + assert matched["our_target"].tolist()[:3] == [11.0, 21.0, 31.0] + assert matched["our_name"].isna().tolist() == [False, False, False, True] + + classified = classify_national_rows( + matched, + bound_names={"hmrc/employment_income_income_band_12_570_to_15_000"}, + exclusions={ + "dwp.esa_claimants": { + "tracking": "microcosm#736", + "expires_on": "2026-10-03", + } + }, + source_status={"nts": ("routed", "national_nts_vehicle_counts")}, + ) + assert classified["status"].tolist() == [ + "bound", + "measure_excluded", + "compiled_not_bound", + "not_ported:routed", + ] + assert classified["status_detail"].tolist()[1] == "microcosm#736 expires 2026-10-03" + assert classified["status_detail"].tolist()[3] == "national_nts_vehicle_counts" + + +def test_local_rows_map_metrics_and_carry_our_cell_status() -> None: + fixture = [ + { + "name": "age/20_30@E14000001", + "metric": "age/20_30", + "area_type": "constituency", + "geography_id": "E14000001", + "period": 2025, + "value": 100.0, + "raw_value": 100.0, + "adjustment_factor": 1.0, + "boundary_mapped_from_2010": True, + }, + { + "name": "voa/council_tax/A@E06000001", + "metric": "voa/council_tax/A", + "area_type": "local_authority", + "geography_id": "E06000001", + "period": 2025, + "value": 50.0, + "raw_value": 50.0, + }, + { + "name": "voa/council_tax/H@S12000005", + "metric": "voa/council_tax/H", + "area_type": "local_authority", + "geography_id": "S12000005", + "period": 2025, + "value": 5.0, + "raw_value": 5.0, + }, + { + "name": "housing/council_tax_net@E06000001", + "metric": "housing/council_tax_net", + "area_type": "local_authority", + "geography_id": "E06000001", + "period": 2025, + "value": 7.0, + "raw_value": 7.0, + }, + ] + membership = { + "targets": { + "voa.council_tax_stock.by_area.band_h": { + "geography_levels": { + "local_authority": { + "candidates": [ + {"geography_id": "S12000005", "status": "no_fact_for_area"} + ] + } + } + } + }, + "signed_deferrals": [ + { + "target_id": "voa.council_tax_stock.by_area.band_h", + "geography_level": "local_authority", + "reason_id": "council_tax_band_h_spine_support_absent", + "area_ids": ["S12000005"], + } + ], + } + local = classify_local_rows( + fixture, + metric_target_ids={ + "age/20_30": "ons.age.20_30", + "council_tax/band_a": "voa.council_tax_stock.by_area.band_a", + "council_tax/band_h": "voa.council_tax_stock.by_area.band_h", + }, + membership=membership, + our_metric_names={ + "constituency": ("age/20_30",), + "la": ("council_tax/band_a", "council_tax/band_h"), + }, + bound_names={ + "ons.age.20_30@E14000001", + "voa.council_tax_stock.by_area.band_a@E06000001", + }, + unmapped_concern={ + "housing/council_tax_net": ("blocked_source", "local_council_tax_net") + }, + ) + assert local["our_metric"].tolist() == [ + "age/20_30", + "council_tax/band_a", + "council_tax/band_h", + None, + ] + assert local["status"].tolist() == [ + "bound", + "bound", + "signed_deferred", + "not_ported:blocked_source", + ] + assert ( + local["status_detail"].tolist()[2] == "council_tax_band_h_spine_support_absent" + ) + assert local["status_detail"].tolist()[3] == "local_council_tax_net" + + +def test_summary_and_markdown_measure_only_what_has_an_estimate() -> None: + national = pd.DataFrame( + [ + { + "incumbent_name": "a", + "source": "dwp", + "status": "bound", + "incumbent_target": 100.0, + "candidate_estimate": 105.0, + }, + { + "incumbent_name": "b", + "source": "dwp", + "status": "measure_excluded", + "incumbent_target": 100.0, + "candidate_estimate": 40.0, + }, + { + "incumbent_name": "c", + "source": "nts", + "status": "not_ported:routed", + "incumbent_target": 100.0, + "candidate_estimate": None, + }, + ] + ) + local = pd.DataFrame( + [ + { + "incumbent_name": "x", + "area_type": "constituency", + "incumbent_metric": "age/20_30", + "status": "bound", + "incumbent_target": 10.0, + "candidate_estimate": 10.5, + "incumbent_estimate": 12.0, + }, + { + "incumbent_name": "y", + "area_type": "local_authority", + "incumbent_metric": "housing/council_tax_net", + "status": "not_ported:blocked_source", + "incumbent_target": 10.0, + "candidate_estimate": None, + "incumbent_estimate": None, + }, + ] + ) + summary = evaluation_summary(national, local) + assert summary["national"]["candidate"]["rows"] == 3 + assert summary["national"]["candidate"]["measured"] == 2 + assert summary["national"]["candidate"]["within_10pct"] == 0.5 + assert summary["national"]["candidate"]["by_status"]["measure_excluded"] == 1 + assert summary["local"]["candidate"]["measured"] == 1 + assert summary["local"]["incumbent"]["within_25pct"] == 1.0 + text = render_markdown(summary, national, local) + assert "The ugly part" in text and "| b | measure_excluded |" in text + assert "Not measurable on our side: 1 national rows" in text diff --git a/tools/evaluate_uk_incumbent_surface.py b/tools/evaluate_uk_incumbent_surface.py new file mode 100644 index 000000000..dfb64b07c --- /dev/null +++ b/tools/evaluate_uk_incumbent_surface.py @@ -0,0 +1,266 @@ +"""Score a UK candidate on the incumbent's target surface, every grain (#762 I9). + +Reads the dense candidate H5 (calibrated weights), compiles the national +registries from the pinned Ledger artifact (the un-excluded registry, so the +signed-out rows are measured too), resolves the engine once over the frame +for the local metrics, builds the national constraint matrix over the +calibrated weights, and evaluates every row of the incumbent's vendored +national and local fixtures. The incumbent's own estimates on its local +surface come from the extractor's household-metric and wide-weight tables. + +Outputs a JSON evidence file and a markdown summary; refuses nothing that +merely fits badly — the point is to see the ugly part. +""" + +from __future__ import annotations + +import argparse +import importlib.util +import json +import sys +import tempfile +from importlib import resources as importlib_resources +from pathlib import Path + +import numpy as np +import pandas as pd + +from microcosm.build.ledger_artifact import load_ledger_consumer_artifact +from microcosm.build.uk_runtime import load_uk_national_frame +from microcosm.build.uk_runtime.frs_release import load_uk_frs_release +from microcosm.build.uk_runtime.incumbent_surface_evaluation import ( + classify_local_rows, + classify_national_rows, + evaluation_summary, + load_incumbent_local_fixture, + load_incumbent_national_fixture, + load_uk_data_target_parity, + match_national_rows, + national_family_status, + render_markdown, +) +from microcosm.build.uk_runtime.ledger_targets import ( + _uk_local_metric_target_ids, + compile_uk_target_registry, +) +from microcosm.build.uk_runtime.local_targets import metric_names +from microcosm.build.uk_runtime.measure_simulation import ( + load_uk_calibration_measure_exclusions, +) +from microcosm.calibrate.matrix import build_constraint_matrix + + +def _driver(): + spec = importlib.util.spec_from_file_location( + "build_uk_rowwise_candidate", + Path(__file__).resolve().with_name("build_uk_rowwise_candidate.py"), + ) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def _parse_args(argv): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--candidate-h5", required=True, type=Path) + p.add_argument("--candidate-manifest", required=True, type=Path) + p.add_argument("--ledger-facts", required=True, type=Path) + p.add_argument("--ledger-facts-sha256", required=True) + p.add_argument("--ledger-manifest-sha256", required=True) + p.add_argument("--incumbent-metrics-csv", type=Path) + p.add_argument("--incumbent-weights-csv", type=Path) + p.add_argument("--out-json", required=True, type=Path) + p.add_argument("--out-md", required=True, type=Path) + p.add_argument("--engine-blocks", type=int, default=1) + return p.parse_args(argv) + + +def main(argv=None) -> int: + args = _parse_args(argv) + driver = _driver() + artifact = load_ledger_consumer_artifact( + args.ledger_facts, + expected_facts_sha256=args.ledger_facts_sha256, + expected_manifest_sha256=args.ledger_manifest_sha256, + ) + period = int(load_uk_frs_release().calibration_year) + compilation = compile_uk_target_registry(artifact.facts, target_period=period) + if compilation.unsupported: + raise SystemExit( + f"{len(compilation.unsupported)} national references failed to compile" + ) + registry = compilation.registry # un-excluded: signed-out rows are measured too + manifest = json.loads(args.candidate_manifest.read_text()) + bound = set() + for name in json.loads( + Path(str(manifest["outputs"]["calibration_diagnostics"]["path"])).read_text() + )["targets"]: + bound.add(str(name["name"]).rsplit("@", 1)[0]) + exclusions = {e["name"]: e for e in load_uk_calibration_measure_exclusions()} + + print("loading the candidate frame ...", file=sys.stderr, flush=True) + frame, _ = load_uk_national_frame(args.candidate_h5) + weights = np.asarray(frame.resolve_weights("household").values, dtype=np.float64) + + print("resolving the engine over the frame ...", file=sys.stderr, flush=True) + with tempfile.TemporaryDirectory(prefix="uk-incumbent-eval-") as scratch: + _adapter, _inputs, national_rows, local_metrics, resolution = ( + driver._resolve_candidate_engine_surface( + frame, + registry, + period=period, + scratch_dir=Path(scratch), + band_edge_registry=registry, + blocks=args.engine_blocks, + ) + ) + print("building the national constraint matrix ...", file=sys.stderr, flush=True) + problem = build_constraint_matrix(frame, national_rows.targets) + estimates = np.asarray(problem.matrix @ weights, dtype=np.float64) + est_by_name = { + str(n).rsplit("@", 1)[0]: float(v) + for n, v in zip(problem.names, estimates, strict=True) + } + our_specs = [ + { + "name": s.name, + "contract_target_id": s.metadata.get("contract_target_id"), + "value": s.value, + } + for s in registry.specs + ] + nat_fixture = load_incumbent_national_fixture() + parity = load_uk_data_target_parity() + national = match_national_rows(nat_fixture["rows"], our_specs) + national = classify_national_rows( + national, + bound_names=bound, + exclusions=exclusions, + source_status=national_family_status(parity), + ) + national["candidate_estimate"] = [ + est_by_name.get(n) if isinstance(n, str) else None for n in national["our_name"] + ] + + print("evaluating the local surface ...", file=sys.stderr, flush=True) + household = frame.table("household") + area_cols = {"constituency": "constituency_code", "la": "local_authority_code"} + local_est: dict[tuple[str, str, str], float] = {} + for grain, metrics in local_metrics.items(): + codes = household[area_cols[grain]].astype(str).to_numpy() + m = ( + metrics.reindex(household["household_id"].tolist()) + if not metrics.index.equals(pd.Index(household["household_id"])) + else metrics + ) + weighted = m.multiply(weights, axis=0) + sums = weighted.groupby(codes).sum() + area_type = "constituency" if grain == "constituency" else "local_authority" + for area, row in sums.iterrows(): + for metric, value in row.items(): + local_est[(area_type, str(area), str(metric))] = float(value) + loc_fixture = load_incumbent_local_fixture() + target_ids = {metric: tid for tid, metric in _uk_local_metric_target_ids().items()} + unmapped_concern = { + "housing/council_tax_net": ("blocked_source", "local_council_tax_net"), + "housing/scotland_private_rent_amount": ( + "reviewed_exclusion", + "local_devolved_constituency_rent_anchors", + ), + "housing/scotland_private_renter_households": ( + "reviewed_exclusion", + "local_devolved_constituency_rent_anchors", + ), + "housing/wales_private_rent_amount": ( + "reviewed_exclusion", + "local_devolved_constituency_rent_anchors", + ), + "housing/wales_private_renter_households": ( + "reviewed_exclusion", + "local_devolved_constituency_rent_anchors", + ), + } + membership = json.loads( + importlib_resources.files("microcosm.build.uk") + .joinpath("local_target_reference_membership.json") + .read_text(encoding="utf-8") + ) + local = classify_local_rows( + loc_fixture["rows"], + metric_target_ids=target_ids, + membership=membership, + our_metric_names={ + "constituency": metric_names("constituency"), + "la": metric_names("la"), + }, + bound_names=bound, + unmapped_concern=unmapped_concern, + ) + local["candidate_estimate"] = [ + local_est.get((a, g, m)) if isinstance(m, str) else None + for a, g, m in zip( + local["area_type"], local["geography_id"], local["our_metric"], strict=True + ) + ] + if ( + args.incumbent_metrics_csv is not None + and args.incumbent_weights_csv is not None + ): + print( + "incumbent's own estimates on its local surface ...", + file=sys.stderr, + flush=True, + ) + inc_metrics = pd.read_csv(args.incumbent_metrics_csv).set_index("household_id") + inc_weights = pd.read_csv(args.incumbent_weights_csv).set_index("household_id") + inc_weights = inc_weights.reindex(inc_metrics.index) + inc_est: dict[tuple[str, str], float] = {} + metric_cols = [ + c for c in inc_metrics.columns if c in set(local["our_metric"].dropna()) + ] + metric_matrix = inc_metrics[metric_cols].to_numpy(dtype=np.float64) + for area in inc_weights.columns: + w = inc_weights[area].to_numpy(dtype=np.float64) + if not np.isfinite(w).all(): + continue + vals = w @ metric_matrix + for metric, value in zip(metric_cols, vals, strict=True): + inc_est[(str(area), metric)] = float(value) + local["incumbent_estimate"] = [ + inc_est.get((g, m)) if isinstance(m, str) else None + for g, m in zip(local["geography_id"], local["our_metric"], strict=True) + ] + summary = evaluation_summary(national, local) + payload = { + "schema_version": 1, + "kind": "uk_incumbent_surface_evaluation", + "candidate_h5": str(args.candidate_h5), + "calibration_year": period, + "incumbent_fixtures": { + "national": nat_fixture.get("provenance"), + "local": loc_fixture.get("provenance"), + }, + "measure_resolution": dict(resolution), + "summary": summary, + "national_rows": national.replace({np.nan: None}).to_dict(orient="records"), + "local_rows": local.replace({np.nan: None}).to_dict(orient="records"), + } + args.out_json.write_text(json.dumps(payload, indent=1, default=str)) + args.out_md.write_text(render_markdown(summary, national, local)) + print( + json.dumps( + { + "national": summary["national"]["candidate"], + "local": summary["local"]["candidate"], + "local_incumbent": summary["local"].get("incumbent"), + }, + indent=1, + default=str, + ) + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From f2373c0cf5805991bdfd5b22a6e3bdfdd52eb89e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 12:58:55 +0200 Subject: [PATCH 20/26] Read a written rowwise artifact back: load_uk_rowwise_dataset undoes the export rename (#762) The rowwise writer renames every entity's clone-index column to the artifact's shared clone_index at export; the Frame's flattening rule then refuses the artifact in the compact national loader, so no tool of ours could open the dense H5 (found by the incumbent-surface evaluator). The reader renames clone_index to _clone_index per table and assembles and validates the frame as the national loader does. The end-to-end test pins both behaviours; the evaluator loads through it. Co-Authored-By: Claude Fable 5.1 --- .../microcosm/build/uk_runtime/__init__.py | 2 + .../build/uk_runtime/rowwise_dataset.py | 40 +++++++++++++++++++ .../tests/test_uk_rowwise_candidate.py | 22 ++++++++++ tools/evaluate_uk_incumbent_surface.py | 4 +- 4 files changed, 66 insertions(+), 2 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py index 85bc1e918..65862e805 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py @@ -422,6 +422,7 @@ clone_uk_dataset_with_ladder_geography, clone_uk_dataset_with_rowwise_geography, ladder_clone_index_column, + load_uk_rowwise_dataset, read_uk_single_year_weight_metadata, validate_uk_ladder_rowwise_dataset_tables, validate_uk_rowwise_dataset_tables, @@ -914,6 +915,7 @@ "write_uk_calibration_diagnostics", "load_bound_spine_sidecar", "spine_provenance_from_sidecar", + "load_uk_rowwise_dataset", "write_uk_rowwise_dataset", "write_hmrc_replay_report", "UK_DEFAULT_ZERO_WEIGHT_STRATA", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/rowwise_dataset.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/rowwise_dataset.py index 86f67c702..c49a78a1e 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/rowwise_dataset.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/rowwise_dataset.py @@ -675,6 +675,46 @@ def clone_uk_dataset_with_rowwise_geography( ) +def load_uk_rowwise_dataset(path: str | Path): + """Load a written rowwise (ladder-cloned) UK H5 back into a Frame. + + The export boundary renames every entity's in-memory clone-index column + to the artifact's single ``clone_index`` name; the Frame's flattening + rule refuses that name on three tables, so the compact national loader + cannot open a rowwise artifact. This reader is the inverse of the + writer's rename: ``clone_index`` becomes ``_clone_index`` on each + table before the Frame is assembled and validated exactly as the + national loader does. Returns ``(frame, provenance)``. + """ + + from microcosm.build.uk_runtime.national_frame import ( + UKStagingProvenance, + _read_uk_national_tables, + uk_national_frame, + validate_uk_national_frame, + ) + + payload, fingerprint, input_path = _read_uk_national_tables(path) + tables = {} + for entity in ("person", "benunit", "household"): + table = payload[entity] + if ARTIFACT_CLONE_INDEX_COLUMN in table.columns: + table = table.rename( + columns={ARTIFACT_CLONE_INDEX_COLUMN: ladder_clone_index_column(entity)} + ) + tables[entity] = table + frame = uk_national_frame( + person=tables["person"], + benunit=tables["benunit"], + household=tables["household"], + time_period=payload["time_period"], + weight_kind=payload["household_weight_kind"], + mass_log=payload["mass_log"], + ) + validate_uk_national_frame(frame) + return frame, UKStagingProvenance(source_h5=input_path, fingerprint=fingerprint) + + def write_uk_rowwise_dataset( result: UKRowwiseDatasetResult | UKLadderRowwiseDatasetResult, output_path: str | Path, diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index 49633d68e..30683dd56 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -1172,6 +1172,28 @@ def support_summary(household, ladder_arg): ) f100 = json.loads((f100_out / builder.MANIFEST_FILENAME).read_text()) assert f100["schema_version"] == 2 + # The written rowwise artifact carries the shared ``clone_index`` name on + # every table: the compact national loader must refuse it (flattening + # rule) and the rowwise reader must undo the export rename. + from microcosm.build.uk_runtime.rowwise_dataset import ( + ladder_clone_index_column, + load_uk_rowwise_dataset, + ) + + dataset_path = Path(f100["outputs"]["dataset"]["path"]) + with pytest.raises(ValueError, match="globally unique"): + builder.load_uk_national_frame(dataset_path) + reloaded, provenance = load_uk_rowwise_dataset(dataset_path) + assert provenance.source_h5 == dataset_path.resolve() or str( + provenance.source_h5 + ).endswith(dataset_path.name) + for entity in ("person", "benunit", "household"): + assert ladder_clone_index_column(entity) in reloaded.table(entity).columns + assert "clone_index" not in reloaded.table(entity).columns + assert len(reloaded.table("household")) == f100["solve"]["n_households"] + assert reloaded.weights_for("household").total == pytest.approx( + f100["weights"]["calibration_mass_change"]["new_total"] + ) assert f100["solve"]["n_targets_by_kind"] == { "local": 1, "ladder": 12, diff --git a/tools/evaluate_uk_incumbent_surface.py b/tools/evaluate_uk_incumbent_surface.py index dfb64b07c..340c1344c 100644 --- a/tools/evaluate_uk_incumbent_surface.py +++ b/tools/evaluate_uk_incumbent_surface.py @@ -26,7 +26,6 @@ import pandas as pd from microcosm.build.ledger_artifact import load_ledger_consumer_artifact -from microcosm.build.uk_runtime import load_uk_national_frame from microcosm.build.uk_runtime.frs_release import load_uk_frs_release from microcosm.build.uk_runtime.incumbent_surface_evaluation import ( classify_local_rows, @@ -47,6 +46,7 @@ from microcosm.build.uk_runtime.measure_simulation import ( load_uk_calibration_measure_exclusions, ) +from microcosm.build.uk_runtime.rowwise_dataset import load_uk_rowwise_dataset from microcosm.calibrate.matrix import build_constraint_matrix @@ -100,7 +100,7 @@ def main(argv=None) -> int: exclusions = {e["name"]: e for e in load_uk_calibration_measure_exclusions()} print("loading the candidate frame ...", file=sys.stderr, flush=True) - frame, _ = load_uk_national_frame(args.candidate_h5) + frame, _ = load_uk_rowwise_dataset(args.candidate_h5) weights = np.asarray(frame.resolve_weights("household").values, dtype=np.float64) print("resolving the engine over the frame ...", file=sys.stderr, flush=True) From 73b1322f72e5e82ad65987f9732729e7657cf792 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:40:37 +0200 Subject: [PATCH 21/26] Evaluator: build the national constraint matrix over the resolver's prepared frame (#762 I9) The resolver returns the adapter's prepared frame carrying the resolved measure columns; building the matrix over the raw frame skipped all 403 rows. Also keys the counterfactual filter on the contract's measurement kind, since compiled specs carry the measure as a column name. Co-Authored-By: Claude Fable 5.1 --- tools/evaluate_uk_incumbent_surface.py | 55 ++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/tools/evaluate_uk_incumbent_surface.py b/tools/evaluate_uk_incumbent_surface.py index 340c1344c..4f062fb82 100644 --- a/tools/evaluate_uk_incumbent_surface.py +++ b/tools/evaluate_uk_incumbent_surface.py @@ -47,6 +47,7 @@ load_uk_calibration_measure_exclusions, ) from microcosm.build.uk_runtime.rowwise_dataset import load_uk_rowwise_dataset +from microcosm.calibrate import TargetRegistry from microcosm.calibrate.matrix import build_constraint_matrix @@ -91,13 +92,47 @@ def main(argv=None) -> int: f"{len(compilation.unsupported)} national references failed to compile" ) registry = compilation.registry # un-excluded: signed-out rows are measured too + exclusions_all = {e["name"]: e for e in load_uk_calibration_measure_exclusions()} + # Every excluded row stays measurable except the counterfactual measures, + # which have no live route (that is why they are excluded): the resolver + # would refuse the whole pass on them. + contract = json.loads( + importlib_resources.files("microcosm.build.uk") + .joinpath("uk_population_targets.json") + .read_text(encoding="utf-8") + ) + counterfactual_ids: set[str] = set() + + def _collect(node) -> None: + if isinstance(node, dict): + if ( + "target_id" in node + and "input_substitution_counterfactual" in json.dumps(node) + ): + counterfactual_ids.add(str(node["target_id"])) + for value in node.values(): + _collect(value) + elif isinstance(node, list): + for value in node: + _collect(value) + + _collect(contract) + unresolvable = { + s.name + for s in registry.specs + if s.name in exclusions_all + and str(s.metadata.get("contract_target_id")) in counterfactual_ids + } + resolver_registry = TargetRegistry( + [s for s in registry.specs if s.name not in unresolvable], country="uk" + ) manifest = json.loads(args.candidate_manifest.read_text()) bound = set() for name in json.loads( Path(str(manifest["outputs"]["calibration_diagnostics"]["path"])).read_text() )["targets"]: bound.add(str(name["name"]).rsplit("@", 1)[0]) - exclusions = {e["name"]: e for e in load_uk_calibration_measure_exclusions()} + exclusions = exclusions_all print("loading the candidate frame ...", file=sys.stderr, flush=True) frame, _ = load_uk_rowwise_dataset(args.candidate_h5) @@ -105,10 +140,10 @@ def main(argv=None) -> int: print("resolving the engine over the frame ...", file=sys.stderr, flush=True) with tempfile.TemporaryDirectory(prefix="uk-incumbent-eval-") as scratch: - _adapter, _inputs, national_rows, local_metrics, resolution = ( + prepared_frame, _restore, national_rows, local_metrics, resolution = ( driver._resolve_candidate_engine_surface( frame, - registry, + resolver_registry, period=period, scratch_dir=Path(scratch), band_edge_registry=registry, @@ -116,8 +151,14 @@ def main(argv=None) -> int: ) ) print("building the national constraint matrix ...", file=sys.stderr, flush=True) - problem = build_constraint_matrix(frame, national_rows.targets) + # The resolver returns the adapter's prepared frame carrying the resolved + # measure columns; the raw frame has none of them (403 skipped). + problem = build_constraint_matrix(prepared_frame, national_rows.targets) estimates = np.asarray(problem.matrix @ weights, dtype=np.float64) + skipped = { + str(getattr(t, "name", t)): str(getattr(t, "reason", "")) + for t in problem.skipped + } est_by_name = { str(n).rsplit("@", 1)[0]: float(v) for n, v in zip(problem.names, estimates, strict=True) @@ -142,6 +183,12 @@ def main(argv=None) -> int: national["candidate_estimate"] = [ est_by_name.get(n) if isinstance(n, str) else None for n in national["our_name"] ] + national.loc[national["our_name"].isin(unresolvable), "status"] = ( + "measure_excluded:unresolvable_counterfactual" + ) + national["skip_reason"] = [ + skipped.get(n) if isinstance(n, str) else None for n in national["our_name"] + ] print("evaluating the local surface ...", file=sys.stderr, flush=True) household = frame.table("household") From c48aa1bcbb400357b0717b2312efbcbd73ae81e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 13:59:44 +0200 Subject: [PATCH 22/26] Evaluator: roll the frame up by region for the incumbent's regional rows; fix the local target-id lookup (#762 I9) The metric -> target-id map was inverted, so every incumbent local row read 'no_reference'; a unit test pins the direction. The incumbent's 198 regional rows (ONS age by region, VOA council-tax band by region) are now measured by rolling the frame up by assigned-area region, with the FRS region agreement receipted, instead of being reported as unmatched. Co-Authored-By: Claude Fable 5.1 --- .../incumbent_surface_evaluation.py | 98 +++++++++++++++++++ .../test_uk_incumbent_surface_evaluation.py | 68 +++++++++++++ tools/evaluate_uk_incumbent_surface.py | 62 +++++++++++- 3 files changed, 227 insertions(+), 1 deletion(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py index b80d190e4..5084f6fcd 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/incumbent_surface_evaluation.py @@ -19,6 +19,7 @@ from __future__ import annotations import json +import re from collections.abc import Iterable, Mapping from importlib import resources as importlib_resources from typing import Any @@ -52,6 +53,37 @@ } _AREA_TYPE_TO_METRIC_GRAIN = {"constituency": "constituency", "local_authority": "la"} +_ONS_REGION_AGE_RE = re.compile( + r"^ons/(?P[a-z_]+)_age_(?P\d+)_(?P\d+)$" +) +_VOA_REGION_BAND_RE = re.compile( + r"^voa/council_tax/(?P[A-Z_]+)/(?P[A-H]|total)$" +) +# The incumbent's regional labels that differ from the FRS region enum. +INCUMBENT_REGION_ALIASES: Mapping[str, str] = { + "EAST": "EAST_OF_ENGLAND", + "YORKSHIRE_AND_THE_HUMBER": "YORKSHIRE", +} +# GSS region codes as the row-wise artifact writes them (the devolved +# nations carry the ladder's placeholder codes) -> FRS region enum names. +GSS_REGION_CODES: Mapping[str, str] = { + "E12000001": "NORTH_EAST", + "E12000002": "NORTH_WEST", + "E12000003": "YORKSHIRE", + "E12000004": "EAST_MIDLANDS", + "E12000005": "WEST_MIDLANDS", + "E12000006": "EAST_OF_ENGLAND", + "E12000007": "LONDON", + "E12000008": "SOUTH_EAST", + "E12000009": "SOUTH_WEST", + "W92000004": "WALES", + "W99999999": "WALES", + "S92000003": "SCOTLAND", + "S99999999": "SCOTLAND", + "N92000002": "NORTHERN_IRELAND", + "N99999999": "NORTHERN_IRELAND", +} + def _resource_text(name: str) -> str: return ( @@ -303,6 +335,72 @@ def classify_local_rows( return _with_nullable_objects(pd.DataFrame(out), ("our_metric", "target_id")) +def regional_rollup_estimates( + names: Iterable[str], + *, + household_region: pd.Series, + household_weight: pd.Series, + household_band: pd.Series, + person_household_id: pd.Series, + person_age: pd.Series, +) -> dict[str, dict[str, Any]]: + """Measure the incumbent's regional rows by rolling the frame up by region. + + ``ons/_age__`` rows count people in the closed age band; + ``voa/council_tax//`` rows count households by + council-tax band (``total`` is every household in the region). The three + household series share the household-id index; the two person series are + positionally aligned. Names neither pattern recognises are ignored; a + region the frame does not carry is an error rather than a silent zero. + Returns ``name -> {"estimate", "rollup", "region"}``. + """ + hh_region = household_region.astype(str) + hh_weight = household_weight.astype(float) + hh_band = household_band.astype(str) + known_regions = set(hh_region.unique()) + p_ids = person_household_id.to_numpy() + p_region = hh_region.reindex(p_ids).to_numpy(dtype=object) + p_weight = hh_weight.reindex(p_ids).to_numpy(dtype=float) + if np.isnan(p_weight).any(): + raise ValueError( + "person rows reference households missing from the household series." + ) + age = person_age.to_numpy(dtype=float) + hh_region_values = hh_region.to_numpy(dtype=object) + hh_band_values = hh_band.to_numpy(dtype=object) + hh_weight_values = hh_weight.to_numpy(dtype=float) + out: dict[str, dict[str, Any]] = {} + for name in names: + match = _ONS_REGION_AGE_RE.match(name) + if match: + region = match["region"].upper() + region = INCUMBENT_REGION_ALIASES.get(region, region) + if region not in known_regions: + raise ValueError(f"{name}: region {region!r} is not on the frame.") + lo, hi = int(match["lo"]), int(match["hi"]) + mask = (p_region == region) & (age >= lo) & (age <= hi) + out[name] = { + "estimate": float(p_weight[mask].sum()), + "rollup": "age_band_by_region", + "region": region, + } + continue + match = _VOA_REGION_BAND_RE.match(name) + if match: + region = INCUMBENT_REGION_ALIASES.get(match["region"], match["region"]) + if region not in known_regions: + raise ValueError(f"{name}: region {region!r} is not on the frame.") + mask = hh_region_values == region + if match["band"] != "total": + mask = mask & (hh_band_values == match["band"]) + out[name] = { + "estimate": float(hh_weight_values[mask].sum()), + "rollup": "council_tax_band_by_region", + "region": region, + } + return out + + def _relative_error(estimate: pd.Series, target: pd.Series) -> pd.Series: denom = target.where(target.abs() > 0, np.nan) return (estimate - target) / denom diff --git a/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py b/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py index 2d81f8f4b..98393dfcf 100644 --- a/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py +++ b/packages/microcosm-build/tests/test_uk_incumbent_surface_evaluation.py @@ -3,8 +3,10 @@ from __future__ import annotations import pandas as pd +import pytest from microcosm.build.uk_runtime.incumbent_surface_evaluation import ( + GSS_REGION_CODES, INCUMBENT_LOCAL_METRIC_ALIASES, classify_local_rows, classify_national_rows, @@ -14,6 +16,7 @@ load_uk_data_target_parity, match_national_rows, national_family_status, + regional_rollup_estimates, render_markdown, ) @@ -263,3 +266,68 @@ def test_summary_and_markdown_measure_only_what_has_an_estimate() -> None: text = render_markdown(summary, national, local) assert "The ugly part" in text and "| b | measure_excluded |" in text assert "Not measurable on our side: 1 national rows" in text + + +def test_regional_rollup_measures_age_and_band_rows_by_region() -> None: + hh = pd.Index([1, 2, 3, 4]) + region = pd.Series(["LONDON", "LONDON", "EAST_OF_ENGLAND", "YORKSHIRE"], index=hh) + weight = pd.Series([10.0, 20.0, 5.0, 7.0], index=hh) + band = pd.Series(["A", "H", "A", "D"], index=hh) + person_hh = pd.Series([1, 1, 2, 3, 4]) + age = pd.Series([5, 40, 9, 89, 90]) + out = regional_rollup_estimates( + [ + "ons/london_age_0_9", + "ons/east_age_80_89", + "ons/yorkshire_and_the_humber_age_80_89", + "voa/council_tax/LONDON/A", + "voa/council_tax/LONDON/total", + "voa/council_tax/EAST_OF_ENGLAND/H", + "obr/income_tax", + ], + household_region=region, + household_weight=weight, + household_band=band, + person_household_id=person_hh, + person_age=age, + ) + assert out["ons/london_age_0_9"] == { + "estimate": 30.0, + "rollup": "age_band_by_region", + "region": "LONDON", + } + assert out["ons/east_age_80_89"]["estimate"] == 5.0 + assert out["ons/east_age_80_89"]["region"] == "EAST_OF_ENGLAND" + # The band is closed: age 90 is outside 80_89. + assert out["ons/yorkshire_and_the_humber_age_80_89"]["estimate"] == 0.0 + assert out["voa/council_tax/LONDON/A"]["estimate"] == 10.0 + assert out["voa/council_tax/LONDON/total"]["estimate"] == 30.0 + assert out["voa/council_tax/LONDON/total"]["rollup"] == "council_tax_band_by_region" + assert out["voa/council_tax/EAST_OF_ENGLAND/H"]["estimate"] == 0.0 + assert "obr/income_tax" not in out + with pytest.raises(ValueError, match="not on the frame"): + regional_rollup_estimates( + ["voa/council_tax/MARS/A"], + household_region=region, + household_weight=weight, + household_band=band, + person_household_id=person_hh, + person_age=age, + ) + + +def test_gss_region_codes_cover_the_artifact_placeholders() -> None: + assert GSS_REGION_CODES["E12000007"] == "LONDON" + assert GSS_REGION_CODES["N99999999"] == "NORTHERN_IRELAND" + assert GSS_REGION_CODES["W99999999"] == "WALES" + assert GSS_REGION_CODES["S99999999"] == "SCOTLAND" + + +def test_local_metric_target_ids_map_metric_name_to_contract_id() -> None: + from microcosm.build.uk_runtime.ledger_targets import _uk_local_metric_target_ids + + mapping = _uk_local_metric_target_ids() + # Direction matters: the evaluator looks our metric name up to find the + # contract id the membership register is keyed by. + assert mapping["council_tax/band_h"] == "voa.council_tax_stock.by_area.band_h" + assert mapping["uc_households"] == "dwp.uc.households_by_area" diff --git a/tools/evaluate_uk_incumbent_surface.py b/tools/evaluate_uk_incumbent_surface.py index 4f062fb82..00e951089 100644 --- a/tools/evaluate_uk_incumbent_surface.py +++ b/tools/evaluate_uk_incumbent_surface.py @@ -15,6 +15,7 @@ from __future__ import annotations import argparse +import collections import importlib.util import json import sys @@ -28,6 +29,7 @@ from microcosm.build.ledger_artifact import load_ledger_consumer_artifact from microcosm.build.uk_runtime.frs_release import load_uk_frs_release from microcosm.build.uk_runtime.incumbent_surface_evaluation import ( + GSS_REGION_CODES, classify_local_rows, classify_national_rows, evaluation_summary, @@ -36,6 +38,7 @@ load_uk_data_target_parity, match_national_rows, national_family_status, + regional_rollup_estimates, render_markdown, ) from microcosm.build.uk_runtime.ledger_targets import ( @@ -190,6 +193,61 @@ def _collect(node) -> None: skipped.get(n) if isinstance(n, str) else None for n in national["our_name"] ] + print( + "rolling the frame up by region for the incumbent's regional rows ...", + file=sys.stderr, + flush=True, + ) + household = frame.table("household") + person = frame.table("person") + hh_index = pd.Index(household["household_id"].to_numpy()) + assigned_region = household["region_code"].astype(str).map(GSS_REGION_CODES) + if assigned_region.isna().any(): + unknown = sorted( + household["region_code"].astype(str)[assigned_region.isna()].unique() + ) + raise RuntimeError(f"unknown region codes on the household table: {unknown}") + region_agree = ( + assigned_region.to_numpy() == household["region"].astype(str).to_numpy() + ) + rollup = regional_rollup_estimates( + national["incumbent_name"].tolist(), + household_region=pd.Series(assigned_region.to_numpy(), index=hh_index), + household_weight=pd.Series(weights, index=hh_index), + household_band=pd.Series( + household["council_tax_band"].astype(str).to_numpy(), index=hh_index + ), + person_household_id=person["person_household_id"], + person_age=person["age"], + ) + rollup_mask = national["candidate_estimate"].isna() & national[ + "incumbent_name" + ].isin(rollup) + rolled = national.loc[rollup_mask, "incumbent_name"].tolist() + national.loc[rollup_mask, "candidate_estimate"] = [ + rollup[n]["estimate"] for n in rolled + ] + national.loc[rollup_mask, "status"] = [ + "rolled_up:" + rollup[n]["rollup"] for n in rolled + ] + national.loc[rollup_mask, "status_detail"] = ( + "measured by rolling the frame up by assigned-area region; " + "not a target row on our side" + ) + rollup_receipt = { + "rows": int(rollup_mask.sum()), + "region_source": ( + "household.region_code (assigned area) mapped through GSS_REGION_CODES" + ), + "frs_region_agreement_share": float(region_agree.mean()), + "frs_region_agreement_weighted": float( + weights[region_agree].sum() / weights.sum() + ), + "by_rollup": dict( + collections.Counter(rollup[n]["rollup"] for n in rolled).most_common() + ), + } + print("evaluating the local surface ...", file=sys.stderr, flush=True) household = frame.table("household") area_cols = {"constituency": "constituency_code", "la": "local_authority_code"} @@ -208,7 +266,8 @@ def _collect(node) -> None: for metric, value in row.items(): local_est[(area_type, str(area), str(metric))] = float(value) loc_fixture = load_incumbent_local_fixture() - target_ids = {metric: tid for tid, metric in _uk_local_metric_target_ids().items()} + # _uk_local_metric_target_ids already maps metric name -> target id. + target_ids = dict(_uk_local_metric_target_ids()) unmapped_concern = { "housing/council_tax_net": ("blocked_source", "local_council_tax_net"), "housing/scotland_private_rent_amount": ( @@ -289,6 +348,7 @@ def _collect(node) -> None: "local": loc_fixture.get("provenance"), }, "measure_resolution": dict(resolution), + "regional_rollup": rollup_receipt, "summary": summary, "national_rows": national.replace({np.nan: None}).to_dict(orient="records"), "local_rows": local.replace({np.nan: None}).to_dict(orient="records"), From 2dbec61517945afb0184ebe891fb69125c207012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 14:00:16 +0200 Subject: [PATCH 23/26] Receipt R18: the candidate on the incumbent's target surface, signed items measured (#762 I9) Co-Authored-By: Claude Fable 5.1 --- .../762-uk-rowwise-candidate-receipts.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/experiments/762-uk-rowwise-candidate-receipts.md b/experiments/762-uk-rowwise-candidate-receipts.md index c2ea7d8dd..2b374af46 100644 --- a/experiments/762-uk-rowwise-candidate-receipts.md +++ b/experiments/762-uk-rowwise-candidate-receipts.md @@ -353,3 +353,34 @@ uv run python -m microcosm.data.publish_cli /microcosm-uk-2024-25-dens ``` This closes the plan's I8: the machinery (PR A), the rulings and registers (PR B), the measured doctrine, the release candidate, the incumbent comparison and the contract-valid release directory all exist; what remains before any publication is María's review of both PRs and her go on the human step. I9 (the evaluator on the incumbent's target surface) and I10 (L0 sparsity) follow. + +## R18 — The candidate on the incumbent's target surface, every grain, signed items included (2026-09-04; PR B c7c20581; `tools/evaluate_uk_incumbent_surface.py` over R17) + +**What was measured.** The incumbent's own 2025 target surface as vendored in PR A (637 national rows; 23,545 local rows: 13,650 constituency, 9,895 local authority), evaluated against R17's weights. National rows go through the same engine resolution and constraint matrix the solve uses (single block); local rows through the resolver's per-household metrics summed by assigned area; and 198 regional rows the incumbent binds nationally (ONS age × region, VOA council-tax band × region) by rolling the frame up by assigned-area region (the assigned region agrees with the FRS region on 100 % of rows). Every row carries our status for that cell — `bound`, `signed_deferred` with the reason id, `not_ported:reviewed_exclusion`, `not_ported:blocked_source`, `measure_excluded`, `rolled_up`, or `not_ported` — so the signed items are measured, not hidden. The incumbent's own estimates on its local rows come from the extractor outputs (`incumbent-2025/`). + +| national (637 rows) | | +|---|---| +| measurable on our side | 565 — bound 324, rolled up 198, measure-excluded 46 (signed A16 / composition / £1m+ bands; measured anyway) | +| within 10 % / 25 % | 84.6 / 90.4 (median abs error 1.2 %) | +| by source, within 10 % | dwp 86, hmrc_spi 88, ons 90, voa 78, obr 64, slc 57 | +| not measurable | 71 — 64 rows whose *concern* is ported but whose *row* is not (CGT bands 18, property-income amounts 13, PIP by component 2, benefit-cap reduction, four degenerate `uc_payment_dist` rows, …), 3 routed NTS vehicle rows, 2 EHS rent rows (blocked source), 2 salary-sacrifice counterfactuals | + +| local (23,545 rows) | candidate | incumbent on its own rows | +|---|---|---| +| measurable | 20,627 — bound 18,817, signed-deferred 1,810 | same rows | +| within 10 % / 25 % | 62.7 / 90.6 | 77.3 / 87.9 | +| constituency, within 10 % / 25 % | 52.0 / 91.3 | — | +| local authority, within 10 % / 25 % | 75.0 / 89.8 | — | +| not measurable | 2,918 — 2,600 devolved constituency rent anchors (reviewed exclusion), 318 `council_tax_net` (blocked source) | | + +**Where the incumbent's surface says we are worse, row by row.** + +1. *Constituency age and HMRC rows.* The incumbent's constituency targets are crosswalked from 2010 boundaries (`boundary_mapped_from_2010`). On those rows we sit at 63 % (age) and 53 % (HMRC) within 10 % against its 93 / 95 %; on the local-authority rows it does not crosswalk, age is 91 % against its 92 %. Its HMRC counts are SPI counts × 1.235; ours run 11.5 % below that adjusted count (employment-income count 39 % within 10 %). +2. *UC households.* Our estimates run 13 % above the incumbent's targets (2025 ledger facts against its vintage): 3 % within 10 %. The incumbent fits its own UC rows at 13 %; on the by-children rows we are at 45–59 % against its 13–14 %. +3. *Signed-deferred rows, where the deferral is what hides the miss on our own surface.* Band H by local authority (`council_tax_band_h_spine_support_absent` 296 areas, `council_tax_wales_country_control_absent` 20): our band-H count is 1.8 % of VOA's at the median area (1 % within 10 %; the incumbent 90 %); the national VOA band-H row is bound, so the stock's placement across areas is unconstrained. Equivalised housing costs by local authority (`msoa_mean_to_la_deferred`, 301 rows): ours 1.56× the incumbent's target in England, 1.38× in Wales (8 % within 10 %; incumbent 68 %), while equivalised net income BHC / AHC on the same deferral fit at 88 / 86 % (incumbent 88 / 90). Private rent by local authority (`private_rent_pipr_after_target_period`, 286): ours 1.20× (21 % within 10 %; incumbent 64 %). +4. *Regional roll-ups, rows we never bind directly.* Age: 99 of 108 within 10 %, but the 80–89 band is short by 53 % in Scotland, 40 % in Wales, 34 % in Northern Ireland and 20–25 % in the north; our national `ons.population.age_80_89_by_region@2025` is a single bound total that fits at +0.6 %, and our local age bands stop at 70–80, so the 80+ regional distribution floats. VOA bands: 68 of 90 within 10 %; the misses are band H (North East, North West, Yorkshire at 0; East of England −96 %) and Wales, where the spine's band distribution is wrong against VOA (H 112k vs 13k, G 1.4k vs 55k, F 11k vs 123k, E 69k vs 201k; A–C over). Both are spine-side. +5. *National rows.* The fifteen worst are all signed measure exclusions — household-composition rows +207 to +2336 %, UC outside the cap +467 %, SLC plan-5 borrowers +321 %, the £1m+ SPI bands at 0 — visible here, not on our surface. + +**Tool defects fixed on the way** (31fa0ab8, c7c20581 on PR B): the constraint matrix was built over the raw frame (403 rows skipped) rather than the resolver's prepared frame; the counterfactual filter now keys on the contract's measurement kind; the metric → target-id map was applied inverted, so every local row read `no_reference` (a unit test pins the direction); the regional roll-up is new and unit-tested. + +**Files.** `data/ukds/acceptance/762-rowwise-candidate/incumbent-surface-eval/{incumbent_surface_evaluation.json,incumbent_surface_evaluation.md,stdout.json,run.log}`; copies in the Desktop share folder under `incumbent-surface-eval/`. Run: 5.5 min, 8.7 GB peak. From cd7f85693213327d2b3443078084add43306ba3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 16:18:14 +0200 Subject: [PATCH 24/26] Format the two test files merged during the re-stack onto PR A 8be32dc9 (#762 PR B) Co-Authored-By: Claude Fable 5.1 --- packages/microcosm-build/tests/test_uk_ledger_targets.py | 2 ++ packages/microcosm-build/tests/test_uk_rowwise_candidate.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/microcosm-build/tests/test_uk_ledger_targets.py b/packages/microcosm-build/tests/test_uk_ledger_targets.py index 9d8240775..2acecc225 100644 --- a/packages/microcosm-build/tests/test_uk_ledger_targets.py +++ b/packages/microcosm-build/tests/test_uk_ledger_targets.py @@ -1353,6 +1353,8 @@ def test_uk_local_target_surface_receipts_a_single_cell_dropped_by_the_fanout_ru } assert ("K03000001", 2) in entries assert entries[("K02000001", 1)].startswith("Single cell at this geography") + + def _households_total_fact(period: int, value: float, **overrides): fact = { "concept_alignment": {"canonical_concept": "ons.households_total"}, diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index 30683dd56..01360864b 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -1710,6 +1710,8 @@ def test_gate_criticality_reads_fail_closed() -> None: ) assert blocking == ["[uk_local_area_support] ESS 42.3 < 50"] assert diagnostic == ["[uk_local_weight_ratio] ratio 578 > 100"] + + def test_release_candidate_refuses_non_doctrine_solve_settings(tmp_path) -> None: builder = _load_builder_module() pin = "0" * 64 From 9f4efc77af88ae7356659f20c0812f178de0f27e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Fri, 4 Sep 2026 18:12:30 +0200 Subject: [PATCH 25/26] Vahid's residuals from the PR A approval: end-to-end releasable under --engine-blocks K, exact golden frame (#762 PR B) An f100 run resolved in two engine blocks now has an end-to-end assertion that the manifest writes releasable: false with release_posture naming single_block_engine, so a future caller bypassing _release_verdict is caught. The dense builder's golden target_frame is compared exactly, like its matrix. Co-Authored-By: Claude Fable 5.1 --- .../tests/test_uk_local_rowwise.py | 3 ++ .../tests/test_uk_rowwise_candidate.py | 51 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/packages/microcosm-build/tests/test_uk_local_rowwise.py b/packages/microcosm-build/tests/test_uk_local_rowwise.py index 592c60d09..faecd4975 100644 --- a/packages/microcosm-build/tests/test_uk_local_rowwise.py +++ b/packages/microcosm-build/tests/test_uk_local_rowwise.py @@ -1177,10 +1177,13 @@ def test_dense_builder_result_equals_frozen_pre_pr_fixture() -> None: frozen = pd.DataFrame(golden["target_frame"]) common = [column for column in frozen.columns if column in dense.target_frame] assert common == list(frozen.columns) + # Exact, like the matrix: the golden's values round-trip through JSON + # without loss, so a tolerance would only hide a drift. pd.testing.assert_frame_equal( dense.target_frame[common].reset_index(drop=True), frozen[common].reset_index(drop=True), check_dtype=False, + check_exact=True, ) diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index 01360864b..cca33b0ea 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -1749,3 +1749,54 @@ def test_release_candidate_refuses_non_doctrine_solve_settings(tmp_path) -> None builder._validate_cli_args( builder._parse_args([*base, "--target-weight-rule", "uniform"]) ) + + +def test_candidate_multi_block_engine_run_is_never_releasable( + monkeypatch, tmp_path, capsys +) -> None: + """End to end: ``--engine-blocks K`` on f100 writes ``releasable: false``. + + Every release-blocking gate passes here; the posture alone withholds the + verdict, and the manifest names the leg (``single_block_engine``). This is + the assertion that catches a future caller bypassing ``_release_verdict``. + """ + + pytest.importorskip("tables") + pytest.importorskip("h5py") + builder = _load_builder_module() + input_h5 = tmp_path / "staging.h5" + ladder_path = tmp_path / "ladder.npz" + output_dir = tmp_path / "candidate" + _write_staging_h5( + input_h5, households_per_region=200, region_masses=(4.0, 10.0, 10.0, 9.0) + ) + _write_ladder(ladder_path) + ladder = load_uk_oa_ladder(ladder_path) + import microcosm.build.uk_runtime.battery_bindings as battery_bindings + + monkeypatch.setattr( + battery_bindings, + "_local_area_roster", + lambda _resource, levels: { + "constituency": tuple(sorted(set(ladder.constituency_code))), + "local_authority": tuple(sorted(set(ladder.local_authority_code))), + }, + ) + + args = [ + *_joint_f100_args(input_h5, ladder_path, output_dir), + "--engine-blocks", + "2", + ] + assert builder.main(args) == 0 + + capsys.readouterr() + manifest = json.loads((output_dir / builder.MANIFEST_FILENAME).read_text()) + assert manifest["parameters"]["engine_blocks"] == 2 + assert manifest["blocking_failures"] == [] + assert manifest["releasable"] is False + assert manifest["release_posture"] == { + "full_rung": True, + "single_block_engine": False, + "release_blocking_gates_passed": True, + } From 60e104211c970ea5268468e0efe84a32464f81b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Juaristi?= <127882282+juaristi22@users.noreply.github.com> Date: Sat, 5 Sep 2026 20:11:30 +0200 Subject: [PATCH 26/26] Add exact-household-count UK dataset candidates (#355) --- CLAUDE.md | 6 + changelog.d/uk-dataset-sizes-355.added.md | 1 + docs/uk-dataset-size-plan-355.md | 105 +++++++++ .../build/uk_runtime/dataset_size.py | 198 +++++++++++++++++ .../build/uk_runtime/local_rowwise.py | 62 +++++- .../tests/test_uk_local_rowwise.py | 199 +++++++++++++++++- .../tests/test_uk_rowwise_candidate.py | 80 +++++++ .../src/microcosm/calibrate/gates.py | 39 +++- .../src/microcosm/calibrate/initialization.py | 64 ++++++ .../src/microcosm/calibrate/solve.py | 41 +++- .../tests/test_informed_gates.py | 42 ++++ tools/build_uk_rowwise_candidate.py | 56 ++++- 12 files changed, 879 insertions(+), 14 deletions(-) create mode 100644 changelog.d/uk-dataset-sizes-355.added.md create mode 100644 docs/uk-dataset-size-plan-355.md create mode 100644 packages/microcosm-build/src/microcosm/build/uk_runtime/dataset_size.py create mode 100644 packages/microcosm-calibrate/src/microcosm/calibrate/initialization.py create mode 100644 packages/microcosm-calibrate/tests/test_informed_gates.py diff --git a/CLAUDE.md b/CLAUDE.md index ce1b71c3e..73a10fb72 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -106,3 +106,9 @@ with the journal pointing to them. Update this guide in the same PR whenever the workspace layout, test commands, or release flow change. If you find it contradicting the repo, trust the repo and fix this file. + +UK size experiments use `tools/build_uk_rowwise_candidate.py --dataset-households` +with the same pool inputs as the dense candidate. The flag changes exported +support, not clone K. Sizes remain candidate-only until their matched comparison +and promotion scorecard are adjudicated; see +[the size plan](docs/uk-dataset-size-plan-355.md). diff --git a/changelog.d/uk-dataset-sizes-355.added.md b/changelog.d/uk-dataset-sizes-355.added.md new file mode 100644 index 000000000..4e9bea82a --- /dev/null +++ b/changelog.d/uk-dataset-sizes-355.added.md @@ -0,0 +1 @@ +Add exact-household-count UK rowwise candidates using contribution-informed L0 initialization, protected target carriers, fixed-size sampling and refitting. Preserve the dense pool doctrine and local gates, export compact linked entities, and record selection provenance without promoting candidates to the certified dense release or changing dataset defaults. diff --git a/docs/uk-dataset-size-plan-355.md b/docs/uk-dataset-size-plan-355.md new file mode 100644 index 000000000..a098ee0ae --- /dev/null +++ b/docs/uk-dataset-size-plan-355.md @@ -0,0 +1,105 @@ +# UK dataset sizes: implementation plan and operating boundary + +This implements the candidate-building part of [#355](https://github.com/PolicyEngine/microcosm/issues/355) +on [#870](https://github.com/PolicyEngine/microcosm/pull/870)'s branch. The PR is still open as of +2026-09-05 and itself stacks on #852. Do not base the work on the old issue's +535,080-household 2023 dataset. The authoritative inputs are the current raw-FRS +2024-25 spine, OA ladder, and pinned Chronicle facts used by the joint candidate. + +## Decisions retained + +- Pool generation keeps clone count **K=15**. Requested output households is a + different parameter, applied after cloning and materialization. +- The joint surface retains national, constituency and local-authority rows, + the declared stretch bound **10**, loss cap **10**, **grain_equal** weighting, + and **1,500 epochs** per solve in the normal driver defaults. +- Existing binding adjudications, signed deferrals, measure exclusions, + census-vintage uprating, and all local gates remain in force. Size selection + does not silently drop target rows, loosen ESS floors or change registers. +- Population-normalized engine measures are frozen from the full pool. The + refit uses their selected household contributions rather than re-running + those formulas on a smaller population. +- The Frame carries complete households, benefit units and people; every + non-dry attempt retains the existing Logbook recording envelope. + +## Implemented sequence + +1. Build the usual joint dense solve from the pinned inputs. This also supplies + the same-target reference loss for the size comparison. +2. Compute each household's maximum absolute target-contribution share from + original pool weights and the compiled sparse matrix, following + [#346's correction](https://github.com/PolicyEngine/microcosm/issues/346#issuecomment-4902880142). + Protect the largest absolute weighted carrier of each nonzero target, with + first-column tie breaking. Initialize open probabilities with + `0.1 + 0.8 * score / (score + median_positive_score)`. This bounded smooth + prior is an implementation choice for candidate evaluation, not a measured + UK release ruling. Run L0 budget search; never select the largest prior scores. +3. Use the existing exact-count Sampford sampler on learned probabilities. + Probability-one gates are certainties (`pi_hi=1`), including every protected + carrier. Refuse impossible budgets or sampling designs rather than clamp. +4. Refit on the selected support through `microcosm.calibrate`, with no L0 + penalty. Reuse the existing normalized Horvitz–Thompson `w/q` baseline. + The stretch multiplier remains 10 **relative to that inclusion-adjusted + baseline**; this is the shared exact-k refit's contract, not a claim that + sparse weights remain within 10 times the unexpanded pool-row weights. + The manifest names the reference explicitly. Its empirical suitability for + UK release remains to be assessed alongside the size scorecard. +5. Restore the prepared carrier and export only selected linked entities. + Re-run the existing local gate battery on the compact frame. Each holdout + fold independently reruns selection on training targets; held targets do + not inform the prior or protected set. +6. Record requested/realized counts, pool positions, inclusion probabilities, + protected count, seed, learned penalty, dense/refit loss and target change, + the gate reports, and ordinary byte-pinned output metadata. + +## Running a candidate + +Use the inputs and environment from the existing +[UK dense assembly runbook](uk-dense-release-assembly-runbook-762.md). +Pass the same pinned source arguments to the existing driver and add: + +```bash +uv run python tools/build_uk_rowwise_candidate.py \ + --input-h5 "$UK_SPINE_H5" --input-sha256 "$UK_SPINE_SHA256" \ + --ladder "$UK_LADDER_NPZ" --ladder-sha256 "$UK_LADDER_SHA256" \ + --ledger-facts "$UK_LEDGER_FACTS" \ + --ledger-facts-sha256 "$UK_LEDGER_FACTS_SHA256" \ + --ledger-manifest-sha256 "$UK_LEDGER_MANIFEST_SHA256" \ + --dataset-households 50000 --seed 42 --out out/uk-k50000 +``` + +Repeat with another positive household count and a fresh output directory to +compare sizes. These are requested counts, not certified presets. Omit +`--dataset-households` to retain the existing dense path. Add `--dry-run` to +inspect input binding and parameters without solving or writing a candidate. +Never reduce `--n-clones` to request a smaller output. Full builds still need +the dense build's peak memory and add L0/refit work; the reduction is in the +exported dataset's storage and downstream loading/simulation footprint. + +## Certification and publication still required + +The implementation produces **candidates**, not a new certified UK default. +A size request refuses `--release-candidate`, and its manifest records +`releasable=false` even if the diagnostic gate run passes. The dense assembler +must not interpret a compact candidate as the already reviewed dense line. +The existing registry, production pointers and pe.py default are unchanged. + +Before any size can be promoted: + +1. Run the licensed full-input build, retain all gate failures and measure + local ESS and fit. A nominal 50k size is not guaranteed to clear the floors + that motivated K=15. +2. Run #355's matched sound-comparison protocol and the referenced promotion + scorecard, including reform/distributional validation and untargeted bases. + Calibration loss alone is not a certificate. The included same-target loss + comparison is a diagnostic, not a substitute for those protocols. +3. Adjudicate any new size-specific acceptance decisions, including the + inclusion-adjusted stretch reference. A national-only product would need + its own explicit scope; this implementation does not downgrade local claims. +4. Add size-specific certified release identities, assembly contracts and + downstream bundle entries against that evidence; publication remains the + repository's deliberate human step. + +Accordingly, this increment does not close #355's default-flip requirement. +Synthetic CI checks prove code behavior and artifact structure; they do not +establish licensed-data fit, storage measurements, or release eligibility. diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/dataset_size.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/dataset_size.py new file mode 100644 index 000000000..1a61ff4f8 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/dataset_size.py @@ -0,0 +1,198 @@ +"""Exact household-count UK candidates on a fixed, materialized target surface.""" + +from dataclasses import dataclass, replace + +import numpy as np +import pandas as pd + +from microcosm.calibrate import ( + CalibrationResult, + TargetSet, + assert_exact_k_support, + calibrate, + refit_l0_selection, + select_exact_k, +) +from microcosm.calibrate.initialization import contribution_initialization +from microcosm.frame import Frame + + +@dataclass(frozen=True) +class UKDatasetSize: + """A compact refit with its full-pool row identities and selection evidence.""" + + result: CalibrationResult + support: np.ndarray + receipt: dict[str, object] + + +def refit_uk_dataset_size( + frame: Frame, + dense: CalibrationResult, + *, + households: int, + epochs: int, + learning_rate: float, + seed: int, +) -> UKDatasetSize: + """Run informed L0, a fixed-size draw, and refit under the dense doctrine. + + Freeze the already compiled household contributions, including engine + measures that depend on the full population. Re-evaluating those formulas + on a subset would change the target system. Target values, order, loss + weights, cap and stretch bound remain those of the dense solve. + """ + n = frame.n("household") + if ( + isinstance(households, bool) + or not isinstance(households, int) + or not 0 < households <= n + ): + raise ValueError(f"households must be an integer in [1, {n}]; never clamped.") + if ( + dense.skipped + or len(dense.weights) != n + or dense.l0_lambda != 0 + or dense.weight_entity != "household" + or not np.array_equal( + frame.table("household")["household_id"].to_numpy(), + dense.frame.table("household")["household_id"].to_numpy(), + ) + or not np.array_equal( + frame.weights_for("household").values, dense.initial_weights + ) + ): + raise ValueError( + "size selection requires an aligned, fully compiled dense solve." + ) + if households == n: + return UKDatasetSize( + dense, + np.arange(n), + { + "method": "full_pool", + "requested_households": n, + "realized_households": n, + "pool_households": n, + "seed": seed, + }, + ) + problem = dense.problem + # Input weights are the pool design, not the concentrated dense weights. + init = contribution_initialization( + problem.matrix, dense.initial_weights, problem.target_vector + ) + if int(init.protected.sum()) > households: + raise ValueError( + f"requested {households} households cannot retain {int(init.protected.sum())} protected target carriers." + ) + common = dict( + weight_entity="household", + epochs=epochs, + learning_rate=learning_rate, + mass=dense.options["mass"], + max_weight_ratio=dense.options["max_weight_ratio"], + seed=seed, + target_loss_weights=dense.target_loss_weights, + target_loss_scales=dense.target_loss_scales, + target_loss_cap=dense.target_loss_cap, + ) + selection = calibrate( + frame, + TargetSet(problem.targets), + target_records=households, + gate_initialization=init, + mass_reason=dense.options["mass_reason"], + **common, + ) + probabilities = selection.gate_open_probabilities + if probabilities is None: + raise RuntimeError("informed L0 returned no selection probabilities.") + # Exact-one certainties are protected by the gates themselves; no top-k + # ranking or post-hoc promotion of learned boundary scores is performed. + support, sampling, q = select_exact_k( + probabilities, households, pi_hi=1.0, seed=seed + ) + support = assert_exact_k_support(support, households, pool_size=n) + if not np.isin(np.flatnonzero(init.protected), support).all(): + raise RuntimeError("exact-count selection lost a protected carrier.") + frozen = _frozen_targets(frame, dense, support) + refit = refit_l0_selection( + frame, + frozen, + selection, + support=support, + k=households, + support_inclusion_probabilities=q, + mass_reason=dense.options["mass_reason"], + **common, + ).refit + if ( + refit.skipped + or refit.frame.n("household") != households + or (refit.weights <= 0).any() + ): + raise RuntimeError("compact refit lost targets or positive household support.") + if not np.array_equal(refit.problem.target_vector, problem.target_vector): + raise RuntimeError("compact refit changed target values.") + errors_dense = np.asarray([d.final_estimate for d in dense.diagnostics]) + errors_small = np.asarray([d.final_estimate for d in refit.diagnostics]) + return UKDatasetSize( + refit, + support, + { + "method": "contribution_informed_l0_exact_count_refit", + "requested_households": households, + "realized_households": households, + "pool_households": n, + "seed": seed, + "protected_carriers": int(init.protected.sum()), + "selection_receipt": sampling, + "selection_l0_lambda": selection.l0_lambda, + "selection_epochs": epochs, + "refit_epochs": epochs, + "pool_row_indices": support.tolist(), + "inclusion_probabilities": q.tolist(), + "refit_baseline": "normalized_horvitz_thompson_w_over_q", + "stretch_reference": "normalized_horvitz_thompson_w_over_q", + "dense_loss": dense.final_loss, + "compact_loss": refit.final_loss, + "max_target_scaled_change": float( + np.max(np.abs(errors_small - errors_dense) / dense.target_loss_scales) + ), + "certification": "candidate_only_pending_matched_comparison_and_promotion_scorecard", + }, + ) + + +def _frozen_targets( + frame: Frame, dense: CalibrationResult, support: np.ndarray +) -> TargetSet: + """Bind sparse contribution rows to selected ids, with one shared id join.""" + ids = pd.Index(frame.table("household")["household_id"].iloc[support]) + matrix = dense.problem.matrix[:, support].tocsr() + cached_ids = None + cached_positions = None + + def positions(subset): + nonlocal cached_ids, cached_positions + current = subset.table("household")["household_id"] + if cached_ids is None or not current.equals(cached_ids): + cached_positions = ids.get_indexer(current) + if (cached_positions < 0).any(): + raise ValueError("frozen target requested unknown household ids.") + cached_ids = current.copy() + return cached_positions + + def measure(row): + def values(subset): + return np.asarray(matrix[[row], :].toarray()).reshape(-1)[positions(subset)] + + return values + + return TargetSet( + [ + replace(target, entity="household", measure=measure(row), filter=None) + for row, target in enumerate(dense.problem.targets) + ] + ) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_rowwise.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_rowwise.py index 538f8b87c..205ff52b4 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/local_rowwise.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/local_rowwise.py @@ -151,6 +151,8 @@ class UKRowwiseDoctrineSolve: national_past_cap_census: Mapping[str, Any] all_past_cap_census: Mapping[str, Any] binding_adjudications: Mapping[str, Any] + selected_support: np.ndarray | None = None + size_receipt: Mapping[str, Any] | None = None def past_cap_census( @@ -1008,6 +1010,7 @@ def solve_uk_rowwise_weights_under_doctrine( learning_rate: float = 0.15, conserve_mass: bool = False, target_records: int | None = None, + dataset_households: int | None = None, l0_lambda: float = 0.0, budget_iters: int = 10, seed: int = 0, @@ -1142,6 +1145,26 @@ def solve_uk_rowwise_weights_under_doctrine( target_loss_weights=target_loss_weights, target_loss_cap=doctrine.target_loss_cap, ) + selected_support = None + size_receipt = None + if dataset_households is not None: + if target_records is not None or l0_lambda != 0: + raise ValueError( + "dataset_households requires an unpruned dense reference solve." + ) + from microcosm.build.uk_runtime.dataset_size import refit_uk_dataset_size + + sized = refit_uk_dataset_size( + frame, + result, + households=dataset_households, + epochs=epochs, + learning_rate=learning_rate, + seed=seed, + ) + result = sized.result + selected_support = sized.support + size_receipt = sized.receipt if result.skipped: reasons = [ f"{skipped.target.name}: {skipped.reason}" for skipped in result.skipped[:5] @@ -1280,9 +1303,32 @@ def solve_uk_rowwise_weights_under_doctrine( # ship if the kernel product held strata or metadata the rebuilt frame # lost (both trivially equal today; the guard is the boundary marker # for the day they are not). - clean_result = result.frame if restore is None else restore(result.frame) + if selected_support is None: + clean_result = result.frame if restore is None else restore(result.frame) + expected_ids = problem.household_ids + else: + # Restore the full prepared carrier before selecting: legacy restorers + # retain full original tables and cannot accept compact weight arrays. + clean_pool = frame if restore is None else restore(frame) + expected_ids = tuple(problem.household_ids[i] for i in selected_support) + clean_subset = clean_pool.select( + clean_pool.table("person")["person_household_id"] + .isin(expected_ids) + .to_numpy() + ) + clean_result = Frame( + {entity: clean_subset.table(entity) for entity in clean_subset.entities}, + clean_subset.schema, + { + entity: result.frame.weights_for(entity) + for entity in result.frame.weighted_entities + }, + clean_subset.strata, + mass_log=result.frame.mass_log, + metadata=result.frame.metadata, + ) restored_ids = tuple(clean_result.table("household")["household_id"].tolist()) - if restored_ids != problem.household_ids: + if restored_ids != expected_ids: raise ValueError( "restore returned households that do not match the problem's rows " "(same ids, same order); weights are written back by position, so a " @@ -1344,6 +1390,8 @@ def solve_uk_rowwise_weights_under_doctrine( national_past_cap_census=national_census, all_past_cap_census=all_census, binding_adjudications=binding_adjudications, + selected_support=selected_support, + size_receipt=size_receipt, ) @@ -1380,6 +1428,7 @@ def rotated_uk_local_holdout( learning_rate: float = 0.15, conserve_mass: bool = False, target_records: int | None = None, + dataset_households: int | None = None, l0_lambda: float = 0.0, budget_iters: int = 10, solve_seed: int = 0, @@ -1424,13 +1473,20 @@ def rotated_uk_local_holdout( learning_rate=learning_rate, conserve_mass=conserve_mass, target_records=target_records, + dataset_households=dataset_households, l0_lambda=l0_lambda, budget_iters=budget_iters, seed=solve_seed, ) held_targets = problem.targets[holdout_indices] held_estimates = np.asarray( - problem.matrix[holdout_indices] @ train_solve.weights, + problem.matrix[holdout_indices][ + :, + np.arange(problem.n_households) + if train_solve.selected_support is None + else train_solve.selected_support, + ] + @ train_solve.weights, dtype=np.float64, ).reshape(-1) held_weights = uk_local_target_loss_weights( diff --git a/packages/microcosm-build/tests/test_uk_local_rowwise.py b/packages/microcosm-build/tests/test_uk_local_rowwise.py index faecd4975..bf7a838bc 100644 --- a/packages/microcosm-build/tests/test_uk_local_rowwise.py +++ b/packages/microcosm-build/tests/test_uk_local_rowwise.py @@ -651,7 +651,7 @@ def test_rotated_holdout_keeps_national_rows_in_every_training_fold( def fake_solve(frame, training_problem, **kwargs): calls.append(kwargs["national_rows"]) - return type("Solve", (), {"weights": np.ones(3)})() + return type("Solve", (), {"weights": np.ones(3), "selected_support": None})() monkeypatch.setattr( local_rowwise, "solve_uk_rowwise_weights_under_doctrine", fake_solve @@ -1220,3 +1220,200 @@ def reordering_restore(frame): restore=reordering_restore, epochs=2, ) + + +def test_exact_size_preserves_targets_and_household_links(): + from microcosm.build.uk_runtime.dataset_size import refit_uk_dataset_size + from microcosm.calibrate import Target, TargetSet, calibrate + + frame = _clone_frame() + dense = calibrate( + frame, + TargetSet( + [Target("count", "household", lambda f: np.ones(f.n("household")), 3)] + ), + epochs=2, + ) + sized = refit_uk_dataset_size( + frame, dense, households=2, epochs=2, learning_rate=0.02, seed=7 + ) + assert sized.result.frame.n("household") == 2 + assert sized.result.frame.n("person") == 2 + assert sized.result.frame.n("benunit") == 2 + assert sized.result.problem.names == dense.problem.names + assert sized.result.initial_weights.sum() == pytest.approx( + dense.initial_weights.sum() + ) + assert (sized.result.weights <= 10 * sized.result.initial_weights).all() + again = refit_uk_dataset_size( + frame, dense, households=2, epochs=2, learning_rate=0.02, seed=7 + ) + np.testing.assert_array_equal(sized.support, again.support) + + +@pytest.mark.parametrize("size", [0, -1, True, 4, 1.5]) +def test_exact_size_refuses_invalid_sizes(size): + from microcosm.build.uk_runtime.dataset_size import refit_uk_dataset_size + from microcosm.calibrate import Target, TargetSet, calibrate + + frame = _clone_frame() + dense = calibrate( + frame, + TargetSet( + [Target("count", "household", lambda f: np.ones(f.n("household")), 3)] + ), + epochs=1, + ) + with pytest.raises(ValueError, match="integer"): + refit_uk_dataset_size( + frame, dense, households=size, epochs=1, learning_rate=0.02, seed=7 + ) + + +def test_size_solve_restores_full_prepared_tables_before_subsetting(): + frame = _clone_frame() + metrics = pd.DataFrame({"households": [1.0, 1.0, 1.0]}, index=[101, 102, 103]) + problem = build_uk_rowwise_local_matrix( + metrics, + _assigned(), + pd.DataFrame({"code": ["E001", "S001"], "households": [2.0, 1.0]}), + ) + restored_counts = [] + + def restore(full): + restored_counts.append(full.n("household")) + return full + + result = solve_uk_rowwise_weights_under_doctrine( + frame, + problem, + bound_families=["census_households/constituency"], + dataset_households=2, + epochs=2, + seed=7, + restore=restore, + ) + assert restored_counts == [3] + assert result.frame.n("household") == 2 + assert result.frame.n("person") == 2 + assert len(result.diagnostics) == 2 + assert "census_households/constituency" in result.frame.mass_log[-1].reason + assert result.selected_support.tolist() == [0, 2] + + +def test_size_holdout_uses_compact_support_and_reselects_each_fold(monkeypatch): + import microcosm.build.uk_runtime.local_rowwise as runtime + + metrics = pd.DataFrame({"households": [1.0, 2.0, 3.0]}, index=[101, 102, 103]) + calls = [] + + def solve(frame, training, **kwargs): + calls.append((len(training.targets), kwargs["dataset_households"])) + return type( + "Solve", + (), + {"weights": np.array([1.0, 1.0]), "selected_support": np.array([0, 2])}, + )() + + monkeypatch.setattr(runtime, "solve_uk_rowwise_weights_under_doctrine", solve) + # The holdout helper needs at least one target in each of five folds. + richer = build_uk_rowwise_local_matrix( + pd.DataFrame( + { + name: [1.0, 2.0, 3.0] + for name in ("households", "tenure/social_rent", "tenure/private_rent") + }, + index=metrics.index, + ), + _assigned(), + pd.DataFrame( + { + "code": ["E001", "S001"], + **{ + name: [3.0, 3.0] + for name in ( + "households", + "tenure/social_rent", + "tenure/private_rent", + ) + }, + } + ), + ) + monkeypatch.setattr( + runtime, "_derive_uk_local_bound_families_from_target_frame", lambda *a, **k: () + ) + receipt = rotated_uk_local_holdout( + _clone_frame(), richer, dataset_households=2, epochs=1 + ) + assert len(calls) == 5 + assert all(n < len(richer.targets) and k == 2 for n, k in calls) + assert np.isfinite(receipt["mean_holdout_loss"]) + + +def test_size_refit_freezes_population_dependent_measures(): + from microcosm.build.uk_runtime.dataset_size import refit_uk_dataset_size + from microcosm.calibrate import Target, TargetSet, calibrate + + frame = _clone_frame() + # A population-normalized measure changes if evaluated on two instead of + # three households. The refit must retain the full-pool value of 1/3. + targets = TargetSet( + [ + Target( + "normalized", + "household", + lambda f: np.full(f.n("household"), 1 / f.n("household")), + 1, + ) + ] + ) + dense = calibrate(frame, targets, epochs=2) + small = refit_uk_dataset_size( + frame, dense, households=2, epochs=2, learning_rate=0.02, seed=7 + ) + np.testing.assert_allclose(small.result.problem.matrix.toarray(), [[1 / 3, 1 / 3]]) + + +def test_full_size_returns_dense_reference_without_search(): + from microcosm.build.uk_runtime.dataset_size import refit_uk_dataset_size + from microcosm.calibrate import Target, TargetSet, calibrate + + frame = _clone_frame() + dense = calibrate( + frame, + TargetSet( + [Target("count", "household", lambda f: np.ones(f.n("household")), 3)] + ), + epochs=1, + ) + full = refit_uk_dataset_size( + frame, dense, households=3, epochs=1, learning_rate=0.02, seed=7 + ) + assert full.result is dense + assert full.support.tolist() == [0, 1, 2] + + +def test_size_refuses_budget_smaller_than_protected_carriers(): + from microcosm.build.uk_runtime.dataset_size import refit_uk_dataset_size + from microcosm.calibrate import Target, TargetSet, calibrate + + frame = _clone_frame() + targets = TargetSet( + [ + Target( + str(i), + "household", + lambda f, i=i: ( + f.table("household").household_id.to_numpy() == i + ).astype(float), + 1, + ) + for i in [101, 102, 103] + ] + ) + dense = calibrate(frame, targets, epochs=1) + with pytest.raises(ValueError, match="3 protected target carriers"): + refit_uk_dataset_size( + frame, dense, households=2, epochs=1, learning_rate=0.02, seed=7 + ) diff --git a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py index cca33b0ea..9ecd51939 100644 --- a/packages/microcosm-build/tests/test_uk_rowwise_candidate.py +++ b/packages/microcosm-build/tests/test_uk_rowwise_candidate.py @@ -1800,3 +1800,83 @@ def test_candidate_multi_block_engine_run_is_never_releasable( "single_block_engine": False, "release_blocking_gates_passed": True, } + + +def test_size_candidate_exports_compact_links_and_cannot_claim_dense_release( + monkeypatch, tmp_path +): + builder = _load_builder_module() + input_h5 = tmp_path / "spine.h5" + ladder_path = tmp_path / "ladder.npz" + out = tmp_path / "k300" + _write_staging_h5(input_h5, households_per_region=52) + ladder = _write_ladder(ladder_path) + import microcosm.build.uk_runtime.battery_bindings as bindings + + monkeypatch.setattr( + bindings, + "_local_area_roster", + lambda _resource, levels: { + "constituency": tuple(sorted(set(ladder.constituency_code))), + "local_authority": tuple(sorted(set(ladder.local_authority_code))), + }, + ) + status = builder.main( + [ + "--input-h5", + str(input_h5), + "--ladder", + str(ladder_path), + "--out", + str(out), + "--n-clones", + "2", + "--dataset-households", + "300", + "--epochs", + "2", + "--skip-holdout", + "--seed", + "7", + ] + ) + assert status in (0, 1) # Gate failures remain reportable candidates. + manifest = json.loads((out / builder.MANIFEST_FILENAME).read_text()) + assert manifest["releasable"] is False + assert manifest["release_posture"]["size_certification_present"] is False + size = manifest["solve"]["dataset_size"] + assert size["requested_households"] == size["realized_households"] == 300 + assert size["pool_households"] == 416 + assert manifest["parameters"]["n_clones"] == 2 + assert ( + manifest["weights"]["stretch_reference"] + == "normalized_horvitz_thompson_w_over_q" + ) + path = out / builder.CANDIDATE_FILENAME_TEMPLATE.format(calibration_year=2025) + with pd.HDFStore(path, "r") as store: + households = store["household"] + persons = store["person"] + benunits = store["benunit"] + assert len(households) == 300 + assert set(persons.person_household_id) == set(households.household_id) + assert set(persons.person_benunit_id) == set(benunits.benunit_id) + assert len(_spool_rows(out)) == 1 + + +def test_size_cli_refuses_promotion_without_separate_certification(tmp_path): + builder = _load_builder_module() + args = builder._parse_args( + [ + "--input-h5", + str(tmp_path / "spine.h5"), + "--ladder", + str(tmp_path / "ladder.npz"), + "--out", + str(tmp_path / "out"), + "--dataset-households", + "50000", + "--release-candidate", + ] + ) + with pytest.raises(ValueError, match="candidate-only"): + builder._validate_cli_args(args) diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/gates.py b/packages/microcosm-calibrate/src/microcosm/calibrate/gates.py index 306d42615..5874d3803 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/gates.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/gates.py @@ -19,6 +19,7 @@ import math +import numpy as np import torch from torch import nn @@ -66,6 +67,10 @@ class HardConcrete(nn.Module): penalty close them). Must lie in ``(0, 1)``. temperature: Concrete-distribution temperature; lower is closer to a hard Bernoulli. + initial_probabilities: Optional per-record actual open probabilities + in (0, 1); overrides the historical scalar initialization. + protected_mask: Optional boolean vector. These records have gates + fixed at one during training and evaluation. Raises: ValueError: If ``init_mean`` is not strictly between 0 and 1, or @@ -78,6 +83,8 @@ def __init__( *, init_mean: float = 0.999, temperature: float = 0.25, + initial_probabilities: np.ndarray | None = None, + protected_mask: np.ndarray | None = None, ) -> None: super().__init__() if not (0.0 < init_mean < 1.0): @@ -88,6 +95,22 @@ def __init__( raise ValueError( f"HardConcrete.temperature must be positive, got {temperature!r}." ) + if initial_probabilities is not None: + probabilities = np.asarray(initial_probabilities, dtype=np.float64) + if ( + probabilities.shape != (n,) + or not np.isfinite(probabilities).all() + or ((probabilities <= 0) | (probabilities >= 1)).any() + ): + raise ValueError( + "initial_probabilities must align with gates and lie in (0, 1)." + ) + if protected_mask is None: + protected_mask = np.zeros(n, dtype=bool) + protected_mask = np.asarray(protected_mask) + if protected_mask.shape != (n,) or protected_mask.dtype != np.bool_: + raise ValueError("protected_mask must be an aligned boolean vector.") + self.register_buffer("protected_mask", torch.tensor(protected_mask)) self.temperature = float(temperature) self.gamma = _GAMMA self.zeta = _ZETA @@ -95,6 +118,12 @@ def __init__( init_val = math.log(init_mean / (1.0 - init_mean)) with torch.no_grad(): self.qz_logits.fill_(init_val) + if initial_probabilities is not None: + # The new vector is an actual open probability, unlike the + # historical scalar init_mean's sigmoid-logit convention. + shift = self.temperature * math.log(-self.gamma / self.zeta) + logits = np.log(probabilities / (1 - probabilities)) + shift + self.qz_logits.copy_(torch.tensor(logits, dtype=self.qz_logits.dtype)) def forward(self) -> torch.Tensor: """Return the current gates: sampled in training, deterministic in eval.""" @@ -105,7 +134,7 @@ def forward(self) -> torch.Tensor: else: s = torch.sigmoid(self.qz_logits) stretched = s * (self.zeta - self.gamma) + self.gamma - return torch.clamp(stretched, 0.0, 1.0) + return torch.where(self.protected_mask, 1.0, torch.clamp(stretched, 0.0, 1.0)) def get_penalty(self) -> torch.Tensor: """Expected number of open gates — the differentiable L0 surrogate. @@ -116,9 +145,13 @@ def get_penalty(self) -> torch.Tensor: ``l0_lambda`` and adds to the loss. """ shift = self.temperature * math.log(-self.gamma / self.zeta) - return torch.sigmoid(self.qz_logits - shift).sum() + return torch.where( + self.protected_mask, 1.0, torch.sigmoid(self.qz_logits - shift) + ).sum() def get_active_prob(self) -> torch.Tensor: """Per-gate open-probability (the per-record version of the penalty).""" shift = self.temperature * math.log(-self.gamma / self.zeta) - return torch.sigmoid(self.qz_logits - shift) + return torch.where( + self.protected_mask, 1.0, torch.sigmoid(self.qz_logits - shift) + ) diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/initialization.py b/packages/microcosm-calibrate/src/microcosm/calibrate/initialization.py new file mode 100644 index 000000000..f8d15d2ab --- /dev/null +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/initialization.py @@ -0,0 +1,64 @@ +"""Contribution-informed L0 initialization (microcosm#346, #355).""" + +from dataclasses import dataclass + +import numpy as np +from scipy import sparse + + +@dataclass(frozen=True) +class GateInitialization: + """Aligned open probabilities and records excluded from gate pruning.""" + + probabilities: np.ndarray + protected: np.ndarray + + +def contribution_initialization( + matrix: sparse.sparray, + weights: np.ndarray, + targets: np.ndarray, +) -> GateInitialization: + """Initialize search from maximum absolute target-contribution share. + + Protect the largest absolute weighted carrier of each nonzero target + (first column breaks ties deterministically). The smooth bounded prior + uses the median positive share as its scale. It only initializes L0; + neither these scores nor their ranks select the final support. Zero + targets use a unit denominator, matching the default calibration scale. + Work and storage are sparse in the target matrix, never targets x pool. + """ + matrix = sparse.csr_array(matrix, dtype=np.float64, copy=True) + matrix.sum_duplicates() + matrix.eliminate_zeros() + weights = np.asarray(weights, dtype=np.float64) + targets = np.asarray(targets, dtype=np.float64) + if weights.shape != (matrix.shape[1],) or targets.shape != (matrix.shape[0],): + raise ValueError("matrix, weights and targets must align.") + if ( + not np.isfinite(matrix.data).all() + or not np.isfinite(weights).all() + or not np.isfinite(targets).all() + or (weights <= 0).any() + ): + raise ValueError( + "contribution initialization requires finite inputs and positive weights." + ) + scores = np.zeros(len(weights)) + protected = np.zeros(len(weights), dtype=bool) + for row, target in enumerate(targets): + start, stop = matrix.indptr[row : row + 2] + indices = matrix.indices[start:stop] + contributions = np.abs(matrix.data[start:stop]) * weights[indices] + if not len(indices): + if target != 0: + raise ValueError(f"nonzero target at row {row} has no support.") + continue + shares = contributions / (abs(target) if target != 0 else 1.0) + np.maximum.at(scores, indices, shares) + if target != 0: + protected[indices[np.argmax(contributions)]] = True + positive = scores[scores > 0] + scale = float(np.median(positive)) if len(positive) else 1.0 + probabilities = 0.1 + 0.8 * scores / (scores + scale) + return GateInitialization(probabilities, protected) diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/solve.py b/packages/microcosm-calibrate/src/microcosm/calibrate/solve.py index 746ed9e6a..066be5c9e 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/solve.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/solve.py @@ -77,6 +77,7 @@ from microcosm.calibrate.exact_k import assert_exact_k_support from microcosm.calibrate.gates import HardConcrete +from microcosm.calibrate.initialization import GateInitialization from microcosm.calibrate.matrix import ( CalibrationProblem, SkippedTarget, @@ -754,6 +755,7 @@ def _optimize( target_loss_cap: float, initial_weights: np.ndarray, *, + gate_initialization: GateInitialization | None = None, warm_start_weights: np.ndarray | None = None, epochs: int, learning_rate: float, @@ -799,7 +801,19 @@ def _optimize( gates: HardConcrete | None = None params: list[torch.Tensor] = [log_w] if l0_lambda > 0.0 or target_records is not None: - gates = HardConcrete(len(w0), init_mean=init_mean, temperature=temperature) + gates = HardConcrete( + len(w0), + init_mean=init_mean, + temperature=temperature, + **( + {} + if gate_initialization is None + else { + "initial_probabilities": gate_initialization.probabilities, + "protected_mask": gate_initialization.protected, + } + ), + ) params = [log_w, *gates.parameters()] optimizer = torch.optim.Adam(params, lr=learning_rate) @@ -1053,6 +1067,7 @@ def _search_l0_lambda_for_budget( target_loss_cap: float, initial_weights: np.ndarray, *, + gate_initialization: GateInitialization | None = None, target_records: int, epochs: int, learning_rate: float, @@ -1144,6 +1159,8 @@ def evaluate( "l0_lambda": lam, }, } + if gate_initialization is not None: + optimize_kwargs["gate_initialization"] = gate_initialization if return_gate_open_probabilities: weights, trajectory, gate_open_probabilities = _optimize( matrix, @@ -1332,6 +1349,7 @@ def calibrate( frame: Frame, targets: TargetSet, *, + gate_initialization: GateInitialization | None = None, weight_entity: str = "household", method: str = "adam", epochs: int = 256, @@ -1432,6 +1450,9 @@ def calibrate( cannot express, e.g. the pre-selection *design* weights during a post-L0 refit. When supplied, ``l2_anchor`` becomes a free-form provenance label recorded in options (e.g. ``"design"``). + gate_initialization: Optional informed L0 prior and protected-record + mask, aligned to the weight entity. Requires an Adam L0 solve; + protected gates remain open throughout training and selection. init_mean: Initial expected open-probability of the L0 gates (only used when pruning). temperature: Hard-concrete temperature (only used when pruning). @@ -1519,6 +1540,9 @@ def calibrate( "total cannot be conserved (sum of caps < input total). Use " "max_weight_ratio >= 1, or mass='free'." ) + if gate_initialization is not None: + if method != "adam" or (target_records is None and l0_lambda <= 0): + raise ValueError("gate_initialization requires an Adam L0 solve.") if target_records is not None and ( not isinstance(target_records, int) or target_records <= 0 ): @@ -1708,6 +1732,11 @@ def calibrate( progress_callback=progress_callback, budget_iters=budget_iters, return_gate_open_probabilities=True, + **( + {} + if gate_initialization is None + else {"gate_initialization": gate_initialization} + ), ) else: effective_l0 = l0_lambda @@ -1732,6 +1761,11 @@ def calibrate( temperature=temperature, progress_callback=progress_callback, return_gate_open_probabilities=True, + **( + {} + if gate_initialization is None + else {"gate_initialization": gate_initialization} + ), ) n_nonzero = int((final_weights > prune_atol).sum()) if effective_l0 > 0.0 and n_nonzero == 0: @@ -1792,6 +1826,7 @@ def calibrate( target_loss_scales=target_loss_scales_np.copy(), target_loss_cap=target_loss_cap, options={ + "gate_initialization_supplied": gate_initialization is not None, "method": method, "epochs": epochs, "learning_rate": learning_rate, @@ -1954,6 +1989,7 @@ def refit_l0_selection( epochs: int = 256, learning_rate: float = 0.02, mass: str = FREE_MASS, + mass_reason: str | None = None, max_weight_ratio: float | None = None, l2_lambda: float = 0.0, l2_anchor: str = "initial", @@ -1977,6 +2013,8 @@ def refit_l0_selection( gates and L0 penalty are removed and :func:`calibrate` runs again with ``l0_lambda=0`` on only the selected records. + ``mass_reason`` carries a caller's calibration provenance into the refit. + The explicit exact-k path subsets the original ``frame`` rather than ``selection.frame``. A record may have positive open probability while its deterministic L0 gate is closed; starting from the original frame keeps @@ -2126,6 +2164,7 @@ def refit_l0_selection( epochs=epochs, learning_rate=learning_rate, mass=mass, + mass_reason=mass_reason, max_weight_ratio=max_weight_ratio, target_records=None, l0_lambda=0.0, diff --git a/packages/microcosm-calibrate/tests/test_informed_gates.py b/packages/microcosm-calibrate/tests/test_informed_gates.py new file mode 100644 index 000000000..b4a779f0c --- /dev/null +++ b/packages/microcosm-calibrate/tests/test_informed_gates.py @@ -0,0 +1,42 @@ +"""Informed L0 must preserve rare carriers without replacing the search.""" + +import numpy as np +import pytest +import torch +from scipy import sparse + +from microcosm.calibrate.gates import HardConcrete +from microcosm.calibrate.initialization import contribution_initialization + + +def test_small_weight_large_measure_is_protected(): + init = contribution_initialization( + sparse.csr_array([[1000.0, 0, 0], [0, 1, 1]]), + np.array([0.01, 100.0, 100.0]), + np.array([10.0, 200.0]), + ) + assert init.protected[0] + assert init.probabilities[0] > init.probabilities[1] + + +def test_protected_gates_stay_open_during_training_and_evaluation(): + gates = HardConcrete( + 3, + initial_probabilities=np.array([0.2, 0.4, 0.8]), + protected_mask=np.array([True, False, False]), + ) + assert np.allclose(gates.get_active_prob().detach().numpy(), [1, 0.4, 0.8]) + with torch.no_grad(): + gates.qz_logits.fill_(-100) + for training in (True, False): + gates.train(training) + assert gates()[0].item() == 1 + assert gates.get_active_prob()[0].item() == 1 + + +@pytest.mark.parametrize( + "probabilities", [[0, 0.5], [0.5, 1], [float("nan"), 0.5], [0.5]] +) +def test_invalid_initial_probabilities_refuse(probabilities): + with pytest.raises(ValueError): + HardConcrete(2, initial_probabilities=np.array(probabilities)) diff --git a/tools/build_uk_rowwise_candidate.py b/tools/build_uk_rowwise_candidate.py index b4b0273f4..60a0ff76a 100644 --- a/tools/build_uk_rowwise_candidate.py +++ b/tools/build_uk_rowwise_candidate.py @@ -591,6 +591,11 @@ def _parse_args(argv: list[str] | None = None) -> argparse.Namespace: required=True, help="Output directory for the candidate H5 and evidence sidecars.", ) + parser.add_argument( + "--dataset-households", + type=int, + help="Exact output household count after informed L0 and refit; pool clone K is unchanged. Candidate-only until size certification.", + ) parser.add_argument("--n-clones", type=int, default=UK_LOCAL_CLONE_COUNT) parser.add_argument( "--candidate-clone-counts", @@ -841,6 +846,13 @@ def _run_candidate( source_lineage_modulus=args.source_lineage_modulus, ) clone = assignment.result + if ( + args.dataset_households is not None + and args.dataset_households > clone.frame.n("household") + ): + raise ValueError( + "--dataset-households exceeds the cloned pool; selection never clamps the request." + ) if state is not None: append_phase(state, "cloned") @@ -977,6 +989,7 @@ def _run_candidate( learning_rate=args.learning_rate, conserve_mass=_CONSERVE_MASS, target_records=_TARGET_RECORDS, + dataset_households=args.dataset_households, l0_lambda=_L0_LAMBDA, budget_iters=_BUDGET_ITERS, seed=args.seed, @@ -1083,6 +1096,7 @@ def _run_candidate( learning_rate=args.learning_rate, conserve_mass=_CONSERVE_MASS, target_records=_TARGET_RECORDS, + dataset_households=args.dataset_households, l0_lambda=_L0_LAMBDA, budget_iters=_BUDGET_ITERS, solve_seed=args.seed, @@ -1587,6 +1601,7 @@ def _joint_dry_run_plan( }, "candidate_clone_counts": list(args.candidate_clone_counts or (args.n_clones,)), "candidate_clone_support": clone_support, + "parameters": _parameters(args, source_year=source_year), "releasable": False, "engine": "not_run", "ladder_target_provenance": dict(target_provenance), @@ -1995,7 +2010,9 @@ def _dry_run_plan( "fraction": args.sample_fraction, "unreachable_check": "completed", }, - "releasable": args.sample_fraction == 1.0 and args.engine_blocks == 1, + "releasable": args.sample_fraction == 1.0 + and args.engine_blocks == 1 + and args.dataset_households is None, "parameters": _parameters(args, source_year=source_year), "shapes": { "person": list(clone.frame.table("person").shape), @@ -2288,11 +2305,14 @@ def _manifest( }, "abs_delta": abs(new_total - old_total), "declared_stretch_bound": float(UK_LOCAL_MAX_WEIGHT_RATIO), + "stretch_reference": "pool_design" + if solve.size_receipt is None + else "normalized_horvitz_thompson_w_over_q", "realized_max_weight_ratio_vs_design": float( np.max( np.divide( np.asarray(solve.weights, dtype=np.float64), - np.asarray(clone.frame.weights_for("household").values), + np.asarray(solve.initial_weights), ) ) ), @@ -2304,7 +2324,11 @@ def _manifest( "ladder": ladder_rows, "national": int(len(solve.national_diagnostics)), }, - "n_households": int(problem.n_households), + "n_households": int(solve.frame.n("household")), + "pool_households": int(problem.n_households), + "dataset_size": None + if solve.size_receipt is None + else dict(solve.size_receipt), "initial_loss": float(solve.initial_loss), "final_loss": float(solve.final_loss), "max_abs_relative_error": float(abs_errors.max()), @@ -2389,8 +2413,15 @@ def _manifest( for gate_id, payload in gate_rows.items() if not isinstance(payload, Mapping) or payload.get("status") != "passed" ), - "releasable": releasable, - "release_posture": release_posture, + "releasable": releasable and args.dataset_households is None, + "release_posture": { + **release_posture, + **( + {} + if args.dataset_households is None + else {"size_certification_present": False} + ), + }, "ladder_household_uprating": dict( cross_grain.get("ladder_household_uprating") or {"applied": False, "reason": "no cross-grain receipt"} @@ -2420,6 +2451,7 @@ def _manifest( def _parameters(args: argparse.Namespace, *, source_year: int) -> dict[str, Any]: return { "n_clones": int(args.n_clones), + "dataset_households": args.dataset_households, "seed": int(args.seed), "source_year": source_year, "source_lineage_modulus": args.source_lineage_modulus, @@ -2522,7 +2554,12 @@ def _validate_solve_result( raise RuntimeError( "doctrine solve returned no past-cap census; refusing candidate." ) - if len(solve.weights) != problem.n_households: + expected_count = ( + problem.n_households + if solve.selected_support is None + else len(solve.selected_support) + ) + if len(solve.weights) != expected_count: raise RuntimeError( "doctrine solve returned a weight vector with the wrong length." ) @@ -2584,6 +2621,13 @@ def _validate_cli_args(args: argparse.Namespace) -> None: raise ValueError( "the joint registry path requires --input-sha256 and --ladder-sha256." ) + if args.dataset_households is not None: + if args.dataset_households <= 0: + raise ValueError("--dataset-households must be positive.") + if args.release_candidate: + raise ValueError( + "--dataset-households is candidate-only: size-specific matched comparison and promotion scorecard are required before release." + ) if args.release_candidate: required_release = { "--input-sha256": args.input_sha256,