From a30c377409da44f4ee087f7db4e9814412e56d44 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 02:38:39 -0400 Subject: [PATCH 01/10] Add feed-derived NZ reference ageing factors G8-r2a. Adds the projected_period_average_ratio@1 factor operation (reference_factors.py) and wires its selected factors into the shared reference-profile resolver, composition preflight and target compilation. - Operands are the authenticated Ledger JSON tokens (LexicalFloat keeps the token on a slotted float subclass; integers stay int). Factors are exact rationals with a certified root enclosure, rounded once (half-even) to six decimals and carried as p/10**6. - reference_aging.json declares the six operational factors (IRD TY2024 low/central/high 1.115056/1.117109/1.119158; P1 1.026690/1.028580/1.030467) and the 1.086069 diagnostic, each with a receipt bound to the seven-field Chronicle feed identity. Factors need re-declaration after the September QES observation (validity ends 2026-11-03). - The resolver takes factor_context; selected factors enter a version-2 selection identity, money companions take one common linear_combination weight, counts are unchanged, and non-empty interval rosters refuse until r2b. - Composition checks selected factors against the declared feed pin; compilation replays every selected factor against the loaded artifact and refuses a self-consistent forged factor or an unauthenticated source commit. reference_factors joins _COMPILE_MODULES. - S0-S5 and V3 use the central factor, V1 low, V2 high, V4 central plus the small-household residual. All 474 IRD rows stay parked on B4 measurement. Tests: 24 engine-free files, 2,832 passed and 5 skipped (UK feed not configured), one file per run. Eleven mutants killed, each by a named test. Co-Authored-By: GPT-6.1 Sol Co-Authored-By: Claude Opus 5.5 --- .../nz-reference-ageing-factors.added.md | 9 + .../src/microcosm/build/ledger_artifact.py | 48 +- .../microcosm/build/nz/country_package.json | 5 + .../microcosm/build/nz/reference_aging.json | 8386 +++++++++++++++++ .../build/nz/reference_inventory.json | 4 +- .../build/nz/reference_profiles.json | 1469 ++- .../microcosm/build/nz/target_references.json | 4743 +++++++--- .../src/microcosm/build/reference_factors.py | 711 ++ .../src/microcosm/build/reference_profiles.py | 364 +- .../src/microcosm/build/transport/compose.py | 31 +- .../build/transport/target_kernels.py | 32 +- .../shared/test_calibration_columns.py | 6 +- .../shared/test_ledger_artifact.py | 62 + .../shared/test_nz_reference_aging.py | 256 + .../shared/test_nz_spec_package.py | 72 +- .../shared/test_nz_target_references.py | 93 +- .../shared/test_reference_factors.py | 535 ++ .../shared/test_reference_profiles.py | 317 + .../test_spec_engine_country_bundles.py | 1 + .../shared/test_transport_composed_graph.py | 140 + .../shared/test_transport_target_kernels.py | 150 + .../tests/golden/nz_country_spec.json | 12 +- .../reference_factor_transport.py | 169 + .../microcosm_build/reference_factors.py | 185 + tools/generate_nz_reference_aging.py | 241 + tools/generate_nz_target_references.py | 54 +- 26 files changed, 16616 insertions(+), 1479 deletions(-) create mode 100644 changelog.d/nz-reference-ageing-factors.added.md create mode 100644 packages/microcosm-build/src/microcosm/build/nz/reference_aging.json create mode 100644 packages/microcosm-build/src/microcosm/build/reference_factors.py create mode 100644 packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py create mode 100644 packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py create mode 100644 test_support/microcosm_build/reference_factor_transport.py create mode 100644 test_support/microcosm_build/reference_factors.py create mode 100644 tools/generate_nz_reference_aging.py diff --git a/changelog.d/nz-reference-ageing-factors.added.md b/changelog.d/nz-reference-ageing-factors.added.md new file mode 100644 index 0000000000..d625f48eb6 --- /dev/null +++ b/changelog.d/nz-reference-ageing-factors.added.md @@ -0,0 +1,9 @@ +Add declaration-driven, exact feed-derived reference ageing factors with certified +root bounds, once-only rounding, selected evidence identities and authenticated +compiler replay. Declare the reviewed NZ ageing profiles and their explicit money +and count companions while keeping the income references parked for measurement +closure. + +Keep authenticated decimal tokens in compact slotted floats that survive copying +and pickling. Bind factor evidence to reviewed feed identities while allowing +prose-only pin edits; refuse replay when the source commit cannot be authenticated. diff --git a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py index da0eb1968b..8d35f4b2ff 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -64,7 +64,9 @@ "CHRONICLE_FEED_RESOURCE", "ChronicleFeedPinMismatchError", "LedgerConsumerArtifact", + "LexicalFloat", "add_ledger_artifact_args", + "chronicle_feed_identity", "load_ledger_consumer_artifact", "resolve_ledger_artifact", "validate_chronicle_feed_pin", @@ -78,6 +80,50 @@ ALLOWED_LEDGER_ASSERTIONS = frozenset(("observation", "source_projection")) DEFAULT_LEDGER_ASSERTION = "observation" CHRONICLE_FEED_RESOURCE = "chronicle_feed.json" +_FEED_IDENTITY_FIELDS = ( + "source_commit", + "facts_sha256", + "manifest_sha256", + "artifact_schema_version", + "consumer_fact_schema_versions", + "consumer_fact_schema_sha256", + "fact_row_count", +) + + +def chronicle_feed_identity(feed_pin: Mapping[str, Any]) -> dict[str, Any]: + """Select reviewed source commit and loader-verified fields, excluding prose. + + The source commit is a caller declaration unless the authenticated manifest + also carries it; the artifact loader verifies the remaining six fields. + """ + missing = sorted(set(_FEED_IDENTITY_FIELDS) - feed_pin.keys()) + if missing: + raise ValueError( + f"Chronicle factor feed identity is missing fields: {missing}." + ) + if not isinstance(feed_pin["source_commit"], str) or not feed_pin["source_commit"]: + raise ValueError("Chronicle factor feed identity requires a source commit.") + return {field: feed_pin[field] for field in _FEED_IDENTITY_FIELDS} + + +class LexicalFloat(float): + """An ordinary float retaining its authenticated JSON numeric token. + + Existing consumers and JSON serialization retain their float behavior. + Exact-arithmetic consumers can inspect ``lexical_token`` and prove that + converting the float back to decimal reproduces the published operand. + """ + + __slots__ = ("lexical_token",) + + def __new__(cls, token: str): + instance = super().__new__(cls, token) + instance.lexical_token = token + return instance + + def __reduce__(self): + return type(self), (self.lexical_token,) class ChronicleFeedPinMismatchError(ValueError): @@ -397,7 +443,7 @@ def _load_fact_rows(path: Path) -> tuple[dict[str, Any], ...]: if not stripped: continue try: - row = json.loads(stripped) + row = json.loads(stripped, parse_float=LexicalFloat) except json.JSONDecodeError as exc: raise ValueError( f"Invalid Ledger facts JSONL row {line_number}: {exc.msg}" diff --git a/packages/microcosm-build/src/microcosm/build/nz/country_package.json b/packages/microcosm-build/src/microcosm/build/nz/country_package.json index 2f1c4b8e66..7ada3b19fb 100644 --- a/packages/microcosm-build/src/microcosm/build/nz/country_package.json +++ b/packages/microcosm-build/src/microcosm/build/nz/country_package.json @@ -97,6 +97,11 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "reference_aging.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "reference_inventory.json", "kind": "legacy_json", diff --git a/packages/microcosm-build/src/microcosm/build/nz/reference_aging.json b/packages/microcosm-build/src/microcosm/build/nz/reference_aging.json new file mode 100644 index 0000000000..a82957f2a7 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/nz/reference_aging.json @@ -0,0 +1,8386 @@ +{ + "schema_version": 1, + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "factors": [ + { + "declaration": { + "schema_version": 1, + "id": "ird_ty2024_to_ty2027_low", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "unit_multiplier": "0.01", + "scenario_delta": "-0.5", + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ] + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1115056, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1115056, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "ird_ty2024_to_ty2027_low", + "declaration_sha256": "4325961ede06db69ec91791cc1addf49f889f277fd62791778754b28830bbcba", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "decimal_operand": "1502.27", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1502.27", + "recovered_decimal": "1502.27", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2023 quarter", + "start_date": "2023-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "decimal_operand": "1528.92", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1528.92", + "recovered_decimal": "1528.92", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2023 quarter", + "start_date": "2023-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "decimal_operand": "1556.16", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1556.16", + "recovered_decimal": "1556.16", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2023 quarter", + "start_date": "2023-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "decimal_operand": "1563.54", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1563.54", + "recovered_decimal": "1563.54", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2024-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2024-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2024 quarter", + "start_date": "2024-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "decimal_operand": "1700.68", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1700.68", + "recovered_decimal": "1700.68", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2026 quarter", + "start_date": "2026-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 1, + "weight": "1", + "projection_offset": 1, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 2, + "weight": "1", + "projection_offset": 2, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 3, + "weight": "1", + "projection_offset": 3, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 615089, + "denominator": 400 + }, + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "decimal_operand": "2.7", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "2.7", + "recovered_decimal": "2.7", + "decimal_values_equal": true + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "period": { + "type": "fiscal_year", + "value": 2026 + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "source_file": "prefu26-charts-data.xlsx", + "source_name": "treasury", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_size_bytes": 664670, + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts", + "url": "https://www.treasury.govt.nz/sites/default/files/2026-09/prefu26-charts-data.xlsx", + "vintage": "prefu_2026_09_29" + }, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "entity_role": "forecaster", + "period_coverage": { + "basis": "fiscal", + "end_date": "2027-06-30", + "notes": "Publisher Year ending 30 June 2027; Chronicle opening-year fiscal_year:2026. Publisher column status is Forecast. Footnote 3 (Table 4.1!C21:D21): Ordinary time. Footnote 4 (C22:D22): Measures are actuals except for real GDP and nominal GDP. 2026 earnings are therefore actuals despite the Forecast4 column heading; only 2027–2031 earnings are forecasts. The published annual percentage change is retained unchanged; no annual average, level, factor or period alignment is calculated.", + "source_period_label": "Year ending 30 June 2027", + "start_date": "2026-07-01" + }, + "unit_multiplier": "0.01", + "scenario_delta": "-0.5", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + "effective_growth": { + "numerator": 11, + "denominator": 500 + } + }, + "root_bounds": { + "lower": { + "numerator": 50272759932393, + "denominator": 50000000000000 + }, + "upper": { + "numerator": 100545519864787, + "denominator": 100000000000000 + }, + "exact": false, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 511, + "denominator": 500 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 21433087509261019469100089110351817978329164269, + "denominator": 12500000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 171464700074090725365853333139754513013059781351, + "denominator": 100000000000000000000000000000000000000000000 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 21433087509261019469100089110351817978329164269, + "denominator": 19221531250000000000000000000000000000000000000 + }, + "upper": { + "numerator": 171464700074090725365853333139754513013059781351, + "denominator": 153772250000000000000000000000000000000000000000 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1115056, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "beb087aeff370b0de497abb10ea2558533ca9a9995b556dc1d63d70327ad3885" + } + }, + { + "declaration": { + "schema_version": 1, + "id": "ird_ty2024_to_ty2027_central", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0", + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ] + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1117109, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1117109, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "ird_ty2024_to_ty2027_central", + "declaration_sha256": "4178ab3ea62899cad556170195b74dbb41faf7ff7cde57e298d1e62447b1b004", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "decimal_operand": "1502.27", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1502.27", + "recovered_decimal": "1502.27", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2023 quarter", + "start_date": "2023-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "decimal_operand": "1528.92", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1528.92", + "recovered_decimal": "1528.92", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2023 quarter", + "start_date": "2023-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "decimal_operand": "1556.16", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1556.16", + "recovered_decimal": "1556.16", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2023 quarter", + "start_date": "2023-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "decimal_operand": "1563.54", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1563.54", + "recovered_decimal": "1563.54", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2024-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2024-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2024 quarter", + "start_date": "2024-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "decimal_operand": "1700.68", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1700.68", + "recovered_decimal": "1700.68", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2026 quarter", + "start_date": "2026-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 1, + "weight": "1", + "projection_offset": 1, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 2, + "weight": "1", + "projection_offset": 2, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 3, + "weight": "1", + "projection_offset": 3, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 615089, + "denominator": 400 + }, + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "decimal_operand": "2.7", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "2.7", + "recovered_decimal": "2.7", + "decimal_values_equal": true + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "period": { + "type": "fiscal_year", + "value": 2026 + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "source_file": "prefu26-charts-data.xlsx", + "source_name": "treasury", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_size_bytes": 664670, + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts", + "url": "https://www.treasury.govt.nz/sites/default/files/2026-09/prefu26-charts-data.xlsx", + "vintage": "prefu_2026_09_29" + }, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "entity_role": "forecaster", + "period_coverage": { + "basis": "fiscal", + "end_date": "2027-06-30", + "notes": "Publisher Year ending 30 June 2027; Chronicle opening-year fiscal_year:2026. Publisher column status is Forecast. Footnote 3 (Table 4.1!C21:D21): Ordinary time. Footnote 4 (C22:D22): Measures are actuals except for real GDP and nominal GDP. 2026 earnings are therefore actuals despite the Forecast4 column heading; only 2027–2031 earnings are forecasts. The published annual percentage change is retained unchanged; no annual average, level, factor or period alignment is calculated.", + "source_period_label": "Year ending 30 June 2027", + "start_date": "2026-07-01" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + "effective_growth": { + "numerator": 27, + "denominator": 1000 + } + }, + "root_bounds": { + "lower": { + "numerator": 100668271307927, + "denominator": 100000000000000 + }, + "upper": { + "numerator": 12583533913491, + "denominator": 12500000000000 + }, + "exact": false, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 1027, + "denominator": 1000 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 171780381168748188591006079321988113950935096211, + "denominator": 100000000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 335508556970216332809143747140199880884173607, + "denominator": 195312500000000000000000000000000000000000 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 171780381168748188591006079321988113950935096211, + "denominator": 153772250000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 335508556970216332809143747140199880884173607, + "denominator": 300336425781250000000000000000000000000000000 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1117109, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "6234283ef363388578f13d7833faf0c6eb0ea1743ecc66333d017e59c554a798" + } + }, + { + "declaration": { + "schema_version": 1, + "id": "ird_ty2024_to_ty2027_high", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0.5", + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ] + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1119158, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1119158, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "ird_ty2024_to_ty2027_high", + "declaration_sha256": "29b91c04a391e207e627f99de7e7bdeb90fc0c5d0c1558bccc4a76c3731e801d", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "decimal_operand": "1502.27", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1502.27", + "recovered_decimal": "1502.27", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2023 quarter", + "start_date": "2023-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "decimal_operand": "1528.92", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1528.92", + "recovered_decimal": "1528.92", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2023 quarter", + "start_date": "2023-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "decimal_operand": "1556.16", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1556.16", + "recovered_decimal": "1556.16", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2023 quarter", + "start_date": "2023-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "decimal_operand": "1563.54", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1563.54", + "recovered_decimal": "1563.54", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2024-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2024-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2024 quarter", + "start_date": "2024-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "decimal_operand": "1700.68", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1700.68", + "recovered_decimal": "1700.68", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2026 quarter", + "start_date": "2026-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 1, + "weight": "1", + "projection_offset": 1, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 2, + "weight": "1", + "projection_offset": 2, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 3, + "weight": "1", + "projection_offset": 3, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 615089, + "denominator": 400 + }, + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "decimal_operand": "2.7", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "2.7", + "recovered_decimal": "2.7", + "decimal_values_equal": true + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "period": { + "type": "fiscal_year", + "value": 2026 + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "source_file": "prefu26-charts-data.xlsx", + "source_name": "treasury", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_size_bytes": 664670, + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts", + "url": "https://www.treasury.govt.nz/sites/default/files/2026-09/prefu26-charts-data.xlsx", + "vintage": "prefu_2026_09_29" + }, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "entity_role": "forecaster", + "period_coverage": { + "basis": "fiscal", + "end_date": "2027-06-30", + "notes": "Publisher Year ending 30 June 2027; Chronicle opening-year fiscal_year:2026. Publisher column status is Forecast. Footnote 3 (Table 4.1!C21:D21): Ordinary time. Footnote 4 (C22:D22): Measures are actuals except for real GDP and nominal GDP. 2026 earnings are therefore actuals despite the Forecast4 column heading; only 2027–2031 earnings are forecasts. The published annual percentage change is retained unchanged; no annual average, level, factor or period alignment is calculated.", + "source_period_label": "Year ending 30 June 2027", + "start_date": "2026-07-01" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0.5", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + "effective_growth": { + "numerator": 4, + "denominator": 125 + } + }, + "root_bounds": { + "lower": { + "numerator": 100790575349881, + "denominator": 100000000000000 + }, + "upper": { + "numerator": 50395287674941, + "denominator": 50000000000000 + }, + "exact": false, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 129, + "denominator": 125 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 172095423947015521933465483088234150187075944797, + "denominator": 100000000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 21511927993377262490437471966978882670435826057, + "denominator": 12500000000000000000000000000000000000000000 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 172095423947015521933465483088234150187075944797, + "denominator": 153772250000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 21511927993377262490437471966978882670435826057, + "denominator": 19221531250000000000000000000000000000000000000 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1119158, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "cc047908112d30352a300efd495c5ace4a697e93d7f21dcd4f53a7cdb175db3f" + } + }, + { + "declaration": { + "schema_version": 1, + "id": "p1_ty2026_to_ty2027_low", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2026, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "unit_multiplier": "0.01", + "scenario_delta": "-0.5", + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ] + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1026690, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1026690, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "p1_ty2026_to_ty2027_low", + "declaration_sha256": "53b22d7900851e896cf6ac17c9ca9f9bb92d436637459b8b59c513397833813e", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2026, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "decimal_operand": "1652.72", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1652.72", + "recovered_decimal": "1652.72", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2025 quarter", + "start_date": "2025-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "decimal_operand": "1661.12", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1661.12", + "recovered_decimal": "1661.12", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2025 quarter", + "start_date": "2025-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "decimal_operand": "1681.06", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1681.06", + "recovered_decimal": "1681.06", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2025 quarter", + "start_date": "2025-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "decimal_operand": "1685.39", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1685.39", + "recovered_decimal": "1685.39", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2026 quarter", + "start_date": "2026-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "decimal_operand": "1700.68", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1700.68", + "recovered_decimal": "1700.68", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2026 quarter", + "start_date": "2026-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 1, + "weight": "1", + "projection_offset": 1, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 2, + "weight": "1", + "projection_offset": 2, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 3, + "weight": "1", + "projection_offset": 3, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 668029, + "denominator": 400 + }, + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "decimal_operand": "2.7", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "2.7", + "recovered_decimal": "2.7", + "decimal_values_equal": true + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "period": { + "type": "fiscal_year", + "value": 2026 + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "source_file": "prefu26-charts-data.xlsx", + "source_name": "treasury", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_size_bytes": 664670, + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts", + "url": "https://www.treasury.govt.nz/sites/default/files/2026-09/prefu26-charts-data.xlsx", + "vintage": "prefu_2026_09_29" + }, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "entity_role": "forecaster", + "period_coverage": { + "basis": "fiscal", + "end_date": "2027-06-30", + "notes": "Publisher Year ending 30 June 2027; Chronicle opening-year fiscal_year:2026. Publisher column status is Forecast. Footnote 3 (Table 4.1!C21:D21): Ordinary time. Footnote 4 (C22:D22): Measures are actuals except for real GDP and nominal GDP. 2026 earnings are therefore actuals despite the Forecast4 column heading; only 2027–2031 earnings are forecasts. The published annual percentage change is retained unchanged; no annual average, level, factor or period alignment is calculated.", + "source_period_label": "Year ending 30 June 2027", + "start_date": "2026-07-01" + }, + "unit_multiplier": "0.01", + "scenario_delta": "-0.5", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + "effective_growth": { + "numerator": 11, + "denominator": 500 + } + }, + "root_bounds": { + "lower": { + "numerator": 50272759932393, + "denominator": 50000000000000 + }, + "upper": { + "numerator": 100545519864787, + "denominator": 100000000000000 + }, + "exact": false, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 511, + "denominator": 500 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 21433087509261019469100089110351817978329164269, + "denominator": 12500000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 171464700074090725365853333139754513013059781351, + "denominator": 100000000000000000000000000000000000000000000 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 21433087509261019469100089110351817978329164269, + "denominator": 20875906250000000000000000000000000000000000000 + }, + "upper": { + "numerator": 171464700074090725365853333139754513013059781351, + "denominator": 167007250000000000000000000000000000000000000000 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1026690, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "28006b689061f41a7cfd9abf055aa3ee1ee5a5414d83fa255d36d5ee7fe326bc" + } + }, + { + "declaration": { + "schema_version": 1, + "id": "p1_ty2026_to_ty2027_central", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2026, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0", + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ] + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1028580, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1028580, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "p1_ty2026_to_ty2027_central", + "declaration_sha256": "8507fe3d665c6a0727319765827120afda4ee36e8d970a70b61a747d8cb9210b", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2026, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "decimal_operand": "1652.72", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1652.72", + "recovered_decimal": "1652.72", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2025 quarter", + "start_date": "2025-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "decimal_operand": "1661.12", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1661.12", + "recovered_decimal": "1661.12", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2025 quarter", + "start_date": "2025-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "decimal_operand": "1681.06", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1681.06", + "recovered_decimal": "1681.06", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2025 quarter", + "start_date": "2025-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "decimal_operand": "1685.39", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1685.39", + "recovered_decimal": "1685.39", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2026 quarter", + "start_date": "2026-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "decimal_operand": "1700.68", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1700.68", + "recovered_decimal": "1700.68", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2026 quarter", + "start_date": "2026-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 1, + "weight": "1", + "projection_offset": 1, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 2, + "weight": "1", + "projection_offset": 2, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 3, + "weight": "1", + "projection_offset": 3, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 668029, + "denominator": 400 + }, + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "decimal_operand": "2.7", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "2.7", + "recovered_decimal": "2.7", + "decimal_values_equal": true + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "period": { + "type": "fiscal_year", + "value": 2026 + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "source_file": "prefu26-charts-data.xlsx", + "source_name": "treasury", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_size_bytes": 664670, + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts", + "url": "https://www.treasury.govt.nz/sites/default/files/2026-09/prefu26-charts-data.xlsx", + "vintage": "prefu_2026_09_29" + }, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "entity_role": "forecaster", + "period_coverage": { + "basis": "fiscal", + "end_date": "2027-06-30", + "notes": "Publisher Year ending 30 June 2027; Chronicle opening-year fiscal_year:2026. Publisher column status is Forecast. Footnote 3 (Table 4.1!C21:D21): Ordinary time. Footnote 4 (C22:D22): Measures are actuals except for real GDP and nominal GDP. 2026 earnings are therefore actuals despite the Forecast4 column heading; only 2027–2031 earnings are forecasts. The published annual percentage change is retained unchanged; no annual average, level, factor or period alignment is calculated.", + "source_period_label": "Year ending 30 June 2027", + "start_date": "2026-07-01" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + "effective_growth": { + "numerator": 27, + "denominator": 1000 + } + }, + "root_bounds": { + "lower": { + "numerator": 100668271307927, + "denominator": 100000000000000 + }, + "upper": { + "numerator": 12583533913491, + "denominator": 12500000000000 + }, + "exact": false, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 1027, + "denominator": 1000 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 171780381168748188591006079321988113950935096211, + "denominator": 100000000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 335508556970216332809143747140199880884173607, + "denominator": 195312500000000000000000000000000000000000 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 171780381168748188591006079321988113950935096211, + "denominator": 167007250000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 335508556970216332809143747140199880884173607, + "denominator": 326186035156250000000000000000000000000000000 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1028580, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "43e1914b11969709ea4f0df7fc9a8280f82f15bf186b4e107f986da0a7871c53" + } + }, + { + "declaration": { + "schema_version": 1, + "id": "p1_ty2026_to_ty2027_high", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2026, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0.5", + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ] + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1030467, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1030467, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "p1_ty2026_to_ty2027_high", + "declaration_sha256": "b2c2c0b631861fa6c3975dfb6d326b49ca60b81057abc5bb8581dd0c0bca1ce9", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2026, + "target_period": 2027, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "decimal_operand": "1652.72", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1652.72", + "recovered_decimal": "1652.72", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2025 quarter", + "start_date": "2025-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "decimal_operand": "1661.12", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1661.12", + "recovered_decimal": "1661.12", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2025 quarter", + "start_date": "2025-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "decimal_operand": "1681.06", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1681.06", + "recovered_decimal": "1681.06", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2025 quarter", + "start_date": "2025-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "decimal_operand": "1685.39", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1685.39", + "recovered_decimal": "1685.39", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2026 quarter", + "start_date": "2026-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2", + "decimal_operand": "1700.68", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1700.68", + "recovered_decimal": "1700.68", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-04-01", + "end_date": "2026-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2026 quarter", + "start_date": "2026-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2026-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 1, + "weight": "1", + "projection_offset": 1, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-10-01", + "end_date": "2026-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 2, + "weight": "1", + "projection_offset": 2, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2027-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2027q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2027-01-01", + "end_date": "2027-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "status": "projected", + "sequence": 3, + "weight": "1", + "projection_offset": 3, + "projection_anchor": { + "aggregate_fact_key": "ledger.aggregate_fact.v2:91583e3f39d11b8b4b2923d2" + } + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 668029, + "denominator": 400 + }, + "growth": { + "selector": { + "source_name": "treasury", + "source_measure_id": "average_weekly_earnings_annual_percentage_change", + "source_concept": "treasury.prefu26.average_weekly_earnings_annual_percentage_change", + "entity_name": "government", + "period_type": "fiscal_year", + "period_value": 2026, + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "treasury.prefu26.average_weekly_earnings.fy2026", + "dimensions": [ + "earnings_component", + "publication_status" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "publication_status": "Forecast" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "assertion": "source_projection", + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25", + "decimal_operand": "2.7", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "2.7", + "recovered_decimal": "2.7", + "decimal_values_equal": true + }, + "validation": { + "unit": "percent", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_vintage": "prefu_2026_09_29", + "entity_role": "forecaster", + "provenance_class": "model_output", + "assertion": "source_projection", + "period_coverage": { + "start_date": "2026-07-01", + "end_date": "2027-06-30" + }, + "source_column_id": "year_ending_30_june_2027" + }, + "period": { + "type": "fiscal_year", + "value": 2026 + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/treasury/treasury-prefu26-economic-assumptions/2026/e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9/prefu26-charts-data.xlsx", + "source_file": "prefu26-charts-data.xlsx", + "source_name": "treasury", + "source_sha256": "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9", + "source_size_bytes": 664670, + "source_table": "PREFU 2026 Table 4.1 - Key economic assumptions for fiscal forecasts", + "url": "https://www.treasury.govt.nz/sites/default/files/2026-09/prefu26-charts-data.xlsx", + "vintage": "prefu_2026_09_29" + }, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "entity_role": "forecaster", + "period_coverage": { + "basis": "fiscal", + "end_date": "2027-06-30", + "notes": "Publisher Year ending 30 June 2027; Chronicle opening-year fiscal_year:2026. Publisher column status is Forecast. Footnote 3 (Table 4.1!C21:D21): Ordinary time. Footnote 4 (C22:D22): Measures are actuals except for real GDP and nominal GDP. 2026 earnings are therefore actuals despite the Forecast4 column heading; only 2027–2031 earnings are forecasts. The published annual percentage change is retained unchanged; no annual average, level, factor or period alignment is calculated.", + "source_period_label": "Year ending 30 June 2027", + "start_date": "2026-07-01" + }, + "unit_multiplier": "0.01", + "scenario_delta": "0.5", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + "effective_growth": { + "numerator": 4, + "denominator": 125 + } + }, + "root_bounds": { + "lower": { + "numerator": 100790575349881, + "denominator": 100000000000000 + }, + "upper": { + "numerator": 50395287674941, + "denominator": 50000000000000 + }, + "exact": false, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 129, + "denominator": 125 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 172095423947015521933465483088234150187075944797, + "denominator": 100000000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 21511927993377262490437471966978882670435826057, + "denominator": 12500000000000000000000000000000000000000000 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 172095423947015521933465483088234150187075944797, + "denominator": 167007250000000000000000000000000000000000000000 + }, + "upper": { + "numerator": 21511927993377262490437471966978882670435826057, + "denominator": 20875906250000000000000000000000000000000000000 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1030467, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "5d1b1006938c2628d7f2d4344643270c2477f01cd0d313bfa323834ff8e54cb2" + } + }, + { + "declaration": { + "schema_version": 1, + "id": "observed_ty2026_over_ty2024", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "diagnostic", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2026, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 0, + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 1, + "projection_offset": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 2, + "projection_offset": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "weight": "1", + "sequence": 3, + "projection_offset": 3 + } + ], + "growth": null, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "expected_operational_factor": { + "numerator": 1086069, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ] + }, + "operational_factor": { + "numerator": 1086069, + "denominator": 1000000 + }, + "receipt": { + "schema_version": 1, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "factor_id": "observed_ty2026_over_ty2024", + "declaration_sha256": "dae0d44f673fb8e437c4787b3c0d6d6c142412c2fbb29e03f1702a6940a56316", + "feed_identity": { + "source_commit": "8f4cfd573c0d6f580d9c51cd67e8f449a42ed174", + "facts_sha256": "03f5ea0fe60e6dc93a135ab32cd5cd6ffb56388e702a4734cdb515a956e36b18", + "manifest_sha256": "1ea2d1eeb122275a9ce7f861ca3e20e21dd695772c04ce9d71114168e92fe053", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "consumer_fact_schema_versions": [ + "chronicle.consumer_fact.v4" + ], + "consumer_fact_schema_sha256": "d953306d6f01fbc64db4372d0262d3012ee590269f8a25b276b18dca0626c6a0", + "fact_row_count": 12368 + }, + "source_period": 2024, + "target_period": 2026, + "source_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:cfbce1343aa646fce0411631", + "decimal_operand": "1502.27", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1502.27", + "recovered_decimal": "1502.27", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-04-01", + "end_date": "2023-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2023 quarter", + "start_date": "2023-04-01" + }, + "weight": "1", + "sequence": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:f9f4f127d080fe2f06617947", + "decimal_operand": "1528.92", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1528.92", + "recovered_decimal": "1528.92", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-07-01", + "end_date": "2023-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2023 quarter", + "start_date": "2023-07-01" + }, + "weight": "1", + "sequence": 1 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2023-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2023q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:fb5938810b7b37ae8534e5f7", + "decimal_operand": "1556.16", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1556.16", + "recovered_decimal": "1556.16", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2023-10-01", + "end_date": "2023-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2023-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2023-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2023 quarter", + "start_date": "2023-10-01" + }, + "weight": "1", + "sequence": 2 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2024-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2024q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:854e91ec1dd95e396659ad8e", + "decimal_operand": "1563.54", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1563.54", + "recovered_decimal": "1563.54", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_vintage": "stats_nz_qes_june_2025", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2024-01-01", + "end_date": "2024-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2024-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2025/2025/25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30/quarterly-employment-survey-june-2025-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2025-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30", + "source_size_bytes": 135784, + "source_table": "Quarterly Employment Survey June 2025 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2025-quarter/Download-data/quarterly-employment-survey-june-2025-quarter.xlsx", + "vintage": "stats_nz_qes_june_2025" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2024-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2024 quarter", + "start_date": "2024-01-01" + }, + "weight": "1", + "sequence": 3 + } + ], + "target_schedule": [ + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q2", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q2", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:86ce22ba42a6e2a36b889f9b", + "decimal_operand": "1652.72", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1652.72", + "recovered_decimal": "1652.72", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-04-01", + "end_date": "2025-06-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q2" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-06-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Jun 2025 quarter", + "start_date": "2025-04-01" + }, + "status": "observed", + "sequence": 0, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q3", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q3", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:434e7b2736b4b16589034c72", + "decimal_operand": "1661.12", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1661.12", + "recovered_decimal": "1661.12", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-07-01", + "end_date": "2025-09-30" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q3" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-09-30", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Sep 2025 quarter", + "start_date": "2025-07-01" + }, + "status": "observed", + "sequence": 1, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2025-Q4", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2025q4", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:bc87e53157eaf53c846879dc", + "decimal_operand": "1681.06", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1681.06", + "recovered_decimal": "1681.06", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2025-10-01", + "end_date": "2025-12-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2025-Q4" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2025-12-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Dec 2025 quarter", + "start_date": "2025-10-01" + }, + "status": "observed", + "sequence": 2, + "weight": "1", + "projection_offset": 0 + }, + { + "selector": { + "source_name": "stats_nz", + "source_measure_id": "SBSZ9A", + "source_concept": "stats_nz.qes.average_weekly_earnings.ordinary_time", + "entity_name": "person", + "period_type": "quarter", + "period_value": "2026-Q1", + "geography_level": "country", + "geography_id": "NZ", + "geography_vintage": "current", + "record_set_id": "stats_nz.qes.awe.2026q1", + "dimensions": [ + "earnings_component", + "earnings_denominator", + "earnings_sector", + "earnings_series_reference", + "seasonal_adjustment" + ], + "dimension_values": { + "earnings_component": "ordinary_time", + "earnings_denominator": "fte", + "earnings_sector": "all_sectors", + "earnings_series_reference": "QEMQ.SBSZ9A", + "seasonal_adjustment": "actual" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "assertion": "observation" + }, + "aggregate_fact_key": "ledger.aggregate_fact.v2:78e735569814069f8066ba9f", + "decimal_operand": "1685.39", + "numeric_token_proof": { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "1685.39", + "recovered_decimal": "1685.39", + "decimal_values_equal": true + }, + "validation": { + "unit": "nzd_per_week", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_vintage": "stats_nz_qes_june_2026", + "entity_role": "full_time_equivalent_employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + "period_coverage": { + "start_date": "2026-01-01", + "end_date": "2026-03-31" + }, + "source_column_id": "SBSZ9A" + }, + "period": { + "type": "quarter", + "value": "2026-Q1" + }, + "source": { + "extracted_at": "2026-10-22", + "extraction_method": "CellSelectorSpec and SourceRecordSpec resolved from cells", + "method_notes": "Each fact carries source_record_id, source_cell_keys, and source_row_keys when available.", + "raw_r2_bucket": "ledger-raw", + "raw_r2_key": "raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "raw_r2_uri": "r2://ledger-raw/raw/nz/stats_nz/qes_average_weekly_earnings_june_2026/2026/1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97/quarterly-employment-survey-june-2026-quarter.xlsx", + "source_file": "quarterly-employment-survey-june-2026-quarter.xlsx", + "source_name": "stats_nz", + "source_sha256": "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97", + "source_size_bytes": 124556, + "source_table": "Quarterly Employment Survey June 2026 quarter, Table 7: Average weekly earnings for FTEs, by sector", + "url": "https://www.stats.govt.nz/assets/Uploads/Labour-market-statistics/Labour-market-statistics-June-2026-quarter/Download-data/quarterly-employment-survey-june-2026-quarter.xlsx", + "vintage": "stats_nz_qes_june_2026" + }, + "unit": "nzd_per_week", + "assertion": "observation", + "provenance_class": "survey_aggregate", + "entity_role": "full_time_equivalent_employee", + "period_coverage": { + "basis": "calendar", + "end_date": "2026-03-31", + "notes": "QES reference period is the pay week ending on or before the 20th of the quarter’s middle month (hub-supplied source-period definition); the fact period is the published quarter, not the pay week. Actual, not seasonally adjusted. No annual averaging or period alignment.", + "source_period_label": "Mar 2026 quarter", + "start_date": "2026-01-01" + }, + "status": "observed", + "sequence": 3, + "weight": "1", + "projection_offset": 0 + } + ], + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "denominator_mean": { + "numerator": 615089, + "denominator": 400 + }, + "growth": null, + "root_bounds": { + "lower": { + "numerator": 1, + "denominator": 1 + }, + "upper": { + "numerator": 1, + "denominator": 1 + }, + "exact": true, + "decimal_places": 14, + "degree": 4, + "radicand": { + "numerator": 1, + "denominator": 1 + } + }, + "numerator_mean_bounds": { + "lower": { + "numerator": 668029, + "denominator": 400 + }, + "upper": { + "numerator": 668029, + "denominator": 400 + } + }, + "unrounded_factor_bounds": { + "lower": { + "numerator": 668029, + "denominator": 615089 + }, + "upper": { + "numerator": 668029, + "denominator": 615089 + } + }, + "rounding": { + "digits": 6, + "mode": "nearest_half_even" + }, + "operational_factor": { + "numerator": 1086069, + "denominator": 1000000 + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23" + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026" + ], + "decision_references": [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2" + ], + "receipt_sha256": "6487bd1664ce1e691faaa0771e9835da5437243b06a5c7d749888380a76cd995" + } + } + ] +} diff --git a/packages/microcosm-build/src/microcosm/build/nz/reference_inventory.json b/packages/microcosm-build/src/microcosm/build/nz/reference_inventory.json index bc33e7a400..cb5c0e7635 100644 --- a/packages/microcosm-build/src/microcosm/build/nz/reference_inventory.json +++ b/packages/microcosm-build/src/microcosm/build/nz/reference_inventory.json @@ -36,7 +36,7 @@ "active": 64, "requires_reference_profile_resolution": 170, "requires_census_family_nucleus_standard": 51, - "requires_g8r2_taxable_income_contract_intervals_and_ageing": 474, + "requires_prerequisites": 474, "requires_stratified_receipt_assignment": 12, "requires_receipt_binding": 1, "requires_unsupported_veterans_pension": 1 @@ -14290,7 +14290,7 @@ }, { "id": "qes_prefu_and_b5_ageing", - "reason": "G8-r2; QES/PREFU rows are present in the pinned artifact but unused by this residual-allocation task." + "reason": "QES/PREFU feed rows support the declared factor calculations in reference_aging.json; they never become direct calibration references or carried target values." }, { "id": "wff_tripwires", diff --git a/packages/microcosm-build/src/microcosm/build/nz/reference_profiles.json b/packages/microcosm-build/src/microcosm/build/nz/reference_profiles.json index 4fe3ebf5f4..4c891ca5a7 100644 --- a/packages/microcosm-build/src/microcosm/build/nz/reference_profiles.json +++ b/packages/microcosm-build/src/microcosm/build/nz/reference_profiles.json @@ -1,5 +1,6 @@ { "schema_version": 1, + "factor_context_resource": "reference_aging.json", "dimensions": { "census_residual_allocation": { "default": "mar", @@ -70601,17 +70602,1469 @@ "aging_index": { "default": "central", "profiles": { - "central": { - "transformations": [], - "deferred": true - }, "low": { - "available": false, - "transformations": [] + "transformations": [ + { + "operation": "scale_money_and_intervals", + "factor_id": "ird_ty2024_to_ty2027_low", + "reference_names": [ + "ird_taxable_income_total_by_band__row_8", + "ird_taxable_income_total_by_band__row_9", + "ird_taxable_income_total_by_band__row_10", + "ird_taxable_income_total_by_band__row_11", + "ird_taxable_income_total_by_band__row_12", + "ird_taxable_income_total_by_band__row_13", + "ird_taxable_income_total_by_band__row_14", + "ird_taxable_income_total_by_band__row_15", + "ird_taxable_income_total_by_band__row_16", + "ird_taxable_income_total_by_band__row_17", + "ird_taxable_income_total_by_band__row_18", + "ird_taxable_income_total_by_band__row_19", + "ird_taxable_income_total_by_band__row_20", + "ird_taxable_income_total_by_band__row_21", + "ird_taxable_income_total_by_band__row_22", + "ird_taxable_income_total_by_band__row_23", + "ird_taxable_income_total_by_band__row_24", + "ird_taxable_income_total_by_band__row_25", + "ird_taxable_income_total_by_band__row_26", + "ird_taxable_income_total_by_band__row_27", + "ird_taxable_income_total_by_band__row_28", + "ird_taxable_income_total_by_band__row_29", + "ird_taxable_income_total_by_band__row_30", + "ird_taxable_income_total_by_band__row_31", + "ird_taxable_income_total_by_band__row_32", + "ird_taxable_income_total_by_band__row_33", + "ird_taxable_income_total_by_band__row_34", + "ird_taxable_income_total_by_band__row_35", + "ird_taxable_income_total_by_band__row_36", + "ird_taxable_income_total_by_band__row_37", + "ird_taxable_income_total_by_band__row_38", + "ird_taxable_income_total_by_band__row_39", + "ird_taxable_income_total_by_band__row_40", + "ird_taxable_income_total_by_band__row_41", + "ird_taxable_income_total_by_band__row_42", + "ird_taxable_income_total_by_band__row_43", + "ird_taxable_income_total_by_band__row_44", + "ird_taxable_income_total_by_band__row_45", + "ird_taxable_income_total_by_band__row_46", + "ird_taxable_income_total_by_band__row_47", + "ird_taxable_income_total_by_band__row_48", + "ird_taxable_income_total_by_band__row_49", + "ird_taxable_income_total_by_band__row_50", + "ird_taxable_income_total_by_band__row_51", + "ird_taxable_income_total_by_band__row_52", + "ird_taxable_income_total_by_band__row_53", + "ird_taxable_income_total_by_band__row_54", + "ird_taxable_income_total_by_band__row_55", + "ird_taxable_income_total_by_band__row_56", + "ird_taxable_income_total_by_band__row_57", + "ird_taxable_income_total_by_band__row_58", + "ird_taxable_income_total_by_band__row_59", + "ird_taxable_income_total_by_band__row_60", + "ird_taxable_income_total_by_band__row_61", + "ird_taxable_income_total_by_band__row_62", + "ird_taxable_income_total_by_band__row_63", + "ird_taxable_income_total_by_band__row_64", + "ird_taxable_income_total_by_band__row_65", + "ird_taxable_income_total_by_band__row_66", + "ird_taxable_income_total_by_band__row_67", + "ird_taxable_income_total_by_band__row_68", + "ird_taxable_income_total_by_band__row_69", + "ird_taxable_income_total_by_band__row_70", + "ird_taxable_income_total_by_band__row_71", + "ird_taxable_income_total_by_band__row_72", + "ird_taxable_income_total_by_band__row_73", + "ird_taxable_income_total_by_band__row_74", + "ird_taxable_income_total_by_band__row_75", + "ird_taxable_income_total_by_band__row_76", + "ird_taxable_income_total_by_band__row_77", + "ird_taxable_income_total_by_band__row_78", + "ird_taxable_income_total_by_band__row_79", + "ird_taxable_income_total_by_band__row_80", + "ird_taxable_income_total_by_band__row_81", + "ird_taxable_income_total_by_band__row_82", + "ird_taxable_income_total_by_band__row_83", + "ird_taxable_income_total_by_band__row_84", + "ird_taxable_income_total_by_band__row_85", + "ird_taxable_income_total_by_band__row_86", + "ird_taxable_income_total_by_band__row_87", + "ird_taxable_income_total_by_band__row_88", + "ird_taxable_income_total_by_band__row_89", + "ird_taxable_income_total_by_band__row_90", + "ird_taxable_income_total_by_band__row_91", + "ird_taxable_income_total_by_band__row_92", + "ird_taxable_income_total_by_band__row_93", + "ird_taxable_income_total_by_band__row_94", + "ird_taxable_income_total_by_band__row_95", + "ird_taxable_income_total_by_band__row_96", + "ird_taxable_income_total_by_band__row_97", + "ird_taxable_income_total_by_band__row_98", + "ird_taxable_income_total_by_band__row_99", + "ird_taxable_income_total_by_band__row_100", + "ird_taxable_income_total_by_band__row_101", + "ird_taxable_income_total_by_band__row_102", + "ird_taxable_income_total_by_band__row_103", + "ird_taxable_income_total_by_band__row_104", + "ird_taxable_income_total_by_band__row_105", + "ird_taxable_income_total_by_band__row_106", + "ird_taxable_income_total_by_band__row_107", + "ird_taxable_income_total_by_band__row_108", + "ird_taxable_income_total_by_band__row_109", + "ird_taxable_income_total_by_band__row_110", + "ird_taxable_income_total_by_band__row_111", + "ird_taxable_income_total_by_band__row_112", + "ird_taxable_income_total_by_band__row_113", + "ird_taxable_income_total_by_band__row_114", + "ird_taxable_income_total_by_band__row_115", + "ird_taxable_income_total_by_band__row_116", + "ird_taxable_income_total_by_band__row_117", + "ird_taxable_income_total_by_band__row_118", + "ird_taxable_income_total_by_band__row_119", + "ird_taxable_income_total_by_band__row_120", + "ird_taxable_income_total_by_band__row_121", + "ird_taxable_income_total_by_band__row_122", + "ird_taxable_income_total_by_band__row_123", + "ird_taxable_income_total_by_band__row_124", + "ird_taxable_income_total_by_band__row_125", + "ird_taxable_income_total_by_band__row_126", + "ird_taxable_income_total_by_band__row_127", + "ird_taxable_income_total_by_band__row_128", + "ird_taxable_income_total_by_band__row_129", + "ird_taxable_income_total_by_band__row_130", + "ird_taxable_income_total_by_band__row_131", + "ird_taxable_income_total_by_band__row_132", + "ird_taxable_income_total_by_band__row_133", + "ird_taxable_income_total_by_band__row_134", + "ird_taxable_income_total_by_band__row_135", + "ird_taxable_income_total_by_band__row_136", + "ird_taxable_income_total_by_band__row_137", + "ird_taxable_income_total_by_band__row_138", + "ird_taxable_income_total_by_band__row_139", + "ird_taxable_income_total_by_band__row_140", + "ird_taxable_income_total_by_band__row_141", + "ird_taxable_income_total_by_band__row_142", + "ird_taxable_income_total_by_band__row_143", + "ird_taxable_income_total_by_band__row_144", + "ird_taxable_income_total_by_band__row_145", + "ird_taxable_income_total_by_band__row_146", + "ird_taxable_income_total_by_band__row_147", + "ird_taxable_income_total_by_band__row_148", + "ird_taxable_income_total_by_band__row_149", + "ird_taxable_income_total_by_band__row_150", + "ird_taxable_income_total_by_band__row_151", + "ird_taxable_income_total_by_band__row_152", + "ird_taxable_income_total_by_band__row_153", + "ird_taxable_income_total_by_band__row_154", + "ird_taxable_income_total_by_band__row_155", + "ird_taxable_income_total_by_band__row_156", + "ird_taxable_income_total_by_band__row_157", + "ird_taxable_income_total_by_band__row_158", + "ird_taxable_income_total_by_band__row_159", + "ird_taxable_income_total_by_band__row_160", + "ird_taxable_income_total_by_band__row_161", + "ird_taxable_income_total_by_band__row_162", + "ird_taxable_income_total_by_band__row_163", + "ird_taxable_income_total_by_band__row_164", + "ird_taxable_income_total_by_band__row_165", + "ird_taxable_income_total_by_band__row_166", + "ird_taxable_income_total_by_band__row_167", + "ird_taxable_income_total_by_band__row_168", + "ird_taxable_income_total_by_band__row_169", + "ird_taxable_income_total_by_band__row_170", + "ird_taxable_income_total_by_band__row_171", + "ird_taxable_income_total_by_band__row_172", + "ird_taxable_income_total_by_band__row_173", + "ird_taxable_income_total_by_band__row_174", + "ird_taxable_income_total_by_band__row_175", + "ird_taxable_income_total_by_band__row_176", + "ird_taxable_income_total_by_band__row_177", + "ird_taxable_income_total_by_band__row_178", + "ird_taxable_income_total_by_band__row_179", + "ird_taxable_income_total_by_band__row_180", + "ird_taxable_income_total_by_band__row_181", + "ird_taxable_income_total_by_band__row_182", + "ird_taxable_income_total_by_band__row_183", + "ird_taxable_income_total_by_band__row_184", + "ird_taxable_income_total_by_band__row_185", + "ird_taxable_income_total_by_band__row_186", + "ird_taxable_income_total_by_band__row_187", + "ird_taxable_income_total_by_band__row_188", + "ird_taxable_income_total_by_band__row_189", + "ird_taxable_income_total_by_band__row_190", + "ird_taxable_income_total_by_band__row_191", + "ird_taxable_income_total_by_band__row_192", + "ird_taxable_income_total_by_band__row_193", + "ird_taxable_income_total_by_band__row_194", + "ird_taxable_income_total_by_band__row_195", + "ird_taxable_income_total_by_band__row_196", + "ird_taxable_income_total_by_band__row_197", + "ird_taxable_income_total_by_band__row_198", + "ird_taxable_income_total_by_band__row_199", + "ird_taxable_income_total_by_band__row_200", + "ird_taxable_income_total_by_band__row_201", + "ird_taxable_income_total_by_band__row_202", + "ird_taxable_income_total_by_band__row_203", + "ird_taxable_income_total_by_band__row_204", + "ird_taxable_income_total_by_band__row_205", + "ird_taxable_income_total_by_band__row_206", + "ird_taxable_income_total_by_band__row_207", + "ird_taxable_income_total_by_band__row_208", + "ird_taxable_income_total_by_band__row_209", + "ird_taxable_income_total_by_band__row_210", + "ird_taxable_income_total_by_band__row_211", + "ird_taxable_income_total_by_band__row_212", + "ird_taxable_income_total_by_band__row_213", + "ird_taxable_income_total_by_band__row_214", + "ird_taxable_income_total_by_band__row_215", + "ird_taxable_income_total_by_band__row_216", + "ird_taxable_income_total_by_band__row_217", + "ird_taxable_income_total_by_band__row_218", + "ird_taxable_income_total_by_band__row_219", + "ird_taxable_income_total_by_band__row_220", + "ird_taxable_income_total_by_band__row_221", + "ird_taxable_income_total_by_band__row_222", + "ird_taxable_income_total_by_band__row_223", + "ird_taxable_income_total_by_band__row_224", + "ird_taxable_income_total_by_band__row_225", + "ird_taxable_income_total_by_band__row_226", + "ird_taxable_income_total_by_band__row_227", + "ird_taxable_income_total_by_band__row_228", + "ird_taxable_income_total_by_band__row_229", + "ird_taxable_income_total_by_band__row_230", + "ird_taxable_income_total_by_band__row_231", + "ird_taxable_income_total_by_band__row_232", + "ird_taxable_income_total_by_band__row_233", + "ird_taxable_income_total_by_band__row_234", + "ird_taxable_income_total_by_band__row_235", + "ird_taxable_income_total_by_band__row_236", + "ird_taxable_income_total_by_band__row_237", + "ird_taxable_income_total_by_band__row_238", + "ird_taxable_income_total_by_band__row_239", + "ird_taxable_income_total_by_band__row_240", + "ird_taxable_income_total_by_band__row_241", + "ird_taxable_income_total_by_band__row_242", + "ird_taxable_income_total_by_band__row_243", + "ird_taxable_income_total_by_band__row_244" + ], + "count_reference_names": [ + "ird_taxable_income_people_by_band__row_8", + "ird_taxable_income_people_by_band__row_9", + "ird_taxable_income_people_by_band__row_10", + "ird_taxable_income_people_by_band__row_11", + "ird_taxable_income_people_by_band__row_12", + "ird_taxable_income_people_by_band__row_13", + "ird_taxable_income_people_by_band__row_14", + "ird_taxable_income_people_by_band__row_15", + "ird_taxable_income_people_by_band__row_16", + "ird_taxable_income_people_by_band__row_17", + "ird_taxable_income_people_by_band__row_18", + "ird_taxable_income_people_by_band__row_19", + "ird_taxable_income_people_by_band__row_20", + "ird_taxable_income_people_by_band__row_21", + "ird_taxable_income_people_by_band__row_22", + "ird_taxable_income_people_by_band__row_23", + "ird_taxable_income_people_by_band__row_24", + "ird_taxable_income_people_by_band__row_25", + "ird_taxable_income_people_by_band__row_26", + "ird_taxable_income_people_by_band__row_27", + "ird_taxable_income_people_by_band__row_28", + "ird_taxable_income_people_by_band__row_29", + "ird_taxable_income_people_by_band__row_30", + "ird_taxable_income_people_by_band__row_31", + "ird_taxable_income_people_by_band__row_32", + "ird_taxable_income_people_by_band__row_33", + "ird_taxable_income_people_by_band__row_34", + "ird_taxable_income_people_by_band__row_35", + "ird_taxable_income_people_by_band__row_36", + "ird_taxable_income_people_by_band__row_37", + "ird_taxable_income_people_by_band__row_38", + "ird_taxable_income_people_by_band__row_39", + "ird_taxable_income_people_by_band__row_40", + "ird_taxable_income_people_by_band__row_41", + "ird_taxable_income_people_by_band__row_42", + "ird_taxable_income_people_by_band__row_43", + "ird_taxable_income_people_by_band__row_44", + "ird_taxable_income_people_by_band__row_45", + "ird_taxable_income_people_by_band__row_46", + "ird_taxable_income_people_by_band__row_47", + "ird_taxable_income_people_by_band__row_48", + "ird_taxable_income_people_by_band__row_49", + "ird_taxable_income_people_by_band__row_50", + "ird_taxable_income_people_by_band__row_51", + "ird_taxable_income_people_by_band__row_52", + "ird_taxable_income_people_by_band__row_53", + "ird_taxable_income_people_by_band__row_54", + "ird_taxable_income_people_by_band__row_55", + "ird_taxable_income_people_by_band__row_56", + "ird_taxable_income_people_by_band__row_57", + "ird_taxable_income_people_by_band__row_58", + "ird_taxable_income_people_by_band__row_59", + "ird_taxable_income_people_by_band__row_60", + "ird_taxable_income_people_by_band__row_61", + "ird_taxable_income_people_by_band__row_62", + "ird_taxable_income_people_by_band__row_63", + "ird_taxable_income_people_by_band__row_64", + "ird_taxable_income_people_by_band__row_65", + "ird_taxable_income_people_by_band__row_66", + "ird_taxable_income_people_by_band__row_67", + "ird_taxable_income_people_by_band__row_68", + "ird_taxable_income_people_by_band__row_69", + "ird_taxable_income_people_by_band__row_70", + "ird_taxable_income_people_by_band__row_71", + "ird_taxable_income_people_by_band__row_72", + "ird_taxable_income_people_by_band__row_73", + "ird_taxable_income_people_by_band__row_74", + "ird_taxable_income_people_by_band__row_75", + "ird_taxable_income_people_by_band__row_76", + "ird_taxable_income_people_by_band__row_77", + "ird_taxable_income_people_by_band__row_78", + "ird_taxable_income_people_by_band__row_79", + "ird_taxable_income_people_by_band__row_80", + "ird_taxable_income_people_by_band__row_81", + "ird_taxable_income_people_by_band__row_82", + "ird_taxable_income_people_by_band__row_83", + "ird_taxable_income_people_by_band__row_84", + "ird_taxable_income_people_by_band__row_85", + "ird_taxable_income_people_by_band__row_86", + "ird_taxable_income_people_by_band__row_87", + "ird_taxable_income_people_by_band__row_88", + "ird_taxable_income_people_by_band__row_89", + "ird_taxable_income_people_by_band__row_90", + "ird_taxable_income_people_by_band__row_91", + "ird_taxable_income_people_by_band__row_92", + "ird_taxable_income_people_by_band__row_93", + "ird_taxable_income_people_by_band__row_94", + "ird_taxable_income_people_by_band__row_95", + "ird_taxable_income_people_by_band__row_96", + "ird_taxable_income_people_by_band__row_97", + "ird_taxable_income_people_by_band__row_98", + "ird_taxable_income_people_by_band__row_99", + "ird_taxable_income_people_by_band__row_100", + "ird_taxable_income_people_by_band__row_101", + "ird_taxable_income_people_by_band__row_102", + "ird_taxable_income_people_by_band__row_103", + "ird_taxable_income_people_by_band__row_104", + "ird_taxable_income_people_by_band__row_105", + "ird_taxable_income_people_by_band__row_106", + "ird_taxable_income_people_by_band__row_107", + "ird_taxable_income_people_by_band__row_108", + "ird_taxable_income_people_by_band__row_109", + "ird_taxable_income_people_by_band__row_110", + "ird_taxable_income_people_by_band__row_111", + "ird_taxable_income_people_by_band__row_112", + "ird_taxable_income_people_by_band__row_113", + "ird_taxable_income_people_by_band__row_114", + "ird_taxable_income_people_by_band__row_115", + "ird_taxable_income_people_by_band__row_116", + "ird_taxable_income_people_by_band__row_117", + "ird_taxable_income_people_by_band__row_118", + "ird_taxable_income_people_by_band__row_119", + "ird_taxable_income_people_by_band__row_120", + "ird_taxable_income_people_by_band__row_121", + "ird_taxable_income_people_by_band__row_122", + "ird_taxable_income_people_by_band__row_123", + "ird_taxable_income_people_by_band__row_124", + "ird_taxable_income_people_by_band__row_125", + "ird_taxable_income_people_by_band__row_126", + "ird_taxable_income_people_by_band__row_127", + "ird_taxable_income_people_by_band__row_128", + "ird_taxable_income_people_by_band__row_129", + "ird_taxable_income_people_by_band__row_130", + "ird_taxable_income_people_by_band__row_131", + "ird_taxable_income_people_by_band__row_132", + "ird_taxable_income_people_by_band__row_133", + "ird_taxable_income_people_by_band__row_134", + "ird_taxable_income_people_by_band__row_135", + "ird_taxable_income_people_by_band__row_136", + "ird_taxable_income_people_by_band__row_137", + "ird_taxable_income_people_by_band__row_138", + "ird_taxable_income_people_by_band__row_139", + "ird_taxable_income_people_by_band__row_140", + "ird_taxable_income_people_by_band__row_141", + "ird_taxable_income_people_by_band__row_142", + "ird_taxable_income_people_by_band__row_143", + "ird_taxable_income_people_by_band__row_144", + "ird_taxable_income_people_by_band__row_145", + "ird_taxable_income_people_by_band__row_146", + "ird_taxable_income_people_by_band__row_147", + "ird_taxable_income_people_by_band__row_148", + "ird_taxable_income_people_by_band__row_149", + "ird_taxable_income_people_by_band__row_150", + "ird_taxable_income_people_by_band__row_151", + "ird_taxable_income_people_by_band__row_152", + "ird_taxable_income_people_by_band__row_153", + "ird_taxable_income_people_by_band__row_154", + "ird_taxable_income_people_by_band__row_155", + "ird_taxable_income_people_by_band__row_156", + "ird_taxable_income_people_by_band__row_157", + "ird_taxable_income_people_by_band__row_158", + "ird_taxable_income_people_by_band__row_159", + "ird_taxable_income_people_by_band__row_160", + "ird_taxable_income_people_by_band__row_161", + "ird_taxable_income_people_by_band__row_162", + "ird_taxable_income_people_by_band__row_163", + "ird_taxable_income_people_by_band__row_164", + "ird_taxable_income_people_by_band__row_165", + "ird_taxable_income_people_by_band__row_166", + "ird_taxable_income_people_by_band__row_167", + "ird_taxable_income_people_by_band__row_168", + "ird_taxable_income_people_by_band__row_169", + "ird_taxable_income_people_by_band__row_170", + "ird_taxable_income_people_by_band__row_171", + "ird_taxable_income_people_by_band__row_172", + "ird_taxable_income_people_by_band__row_173", + "ird_taxable_income_people_by_band__row_174", + "ird_taxable_income_people_by_band__row_175", + "ird_taxable_income_people_by_band__row_176", + "ird_taxable_income_people_by_band__row_177", + "ird_taxable_income_people_by_band__row_178", + "ird_taxable_income_people_by_band__row_179", + "ird_taxable_income_people_by_band__row_180", + "ird_taxable_income_people_by_band__row_181", + "ird_taxable_income_people_by_band__row_182", + "ird_taxable_income_people_by_band__row_183", + "ird_taxable_income_people_by_band__row_184", + "ird_taxable_income_people_by_band__row_185", + "ird_taxable_income_people_by_band__row_186", + "ird_taxable_income_people_by_band__row_187", + "ird_taxable_income_people_by_band__row_188", + "ird_taxable_income_people_by_band__row_189", + "ird_taxable_income_people_by_band__row_190", + "ird_taxable_income_people_by_band__row_191", + "ird_taxable_income_people_by_band__row_192", + "ird_taxable_income_people_by_band__row_193", + "ird_taxable_income_people_by_band__row_194", + "ird_taxable_income_people_by_band__row_195", + "ird_taxable_income_people_by_band__row_196", + "ird_taxable_income_people_by_band__row_197", + "ird_taxable_income_people_by_band__row_198", + "ird_taxable_income_people_by_band__row_199", + "ird_taxable_income_people_by_band__row_200", + "ird_taxable_income_people_by_band__row_201", + "ird_taxable_income_people_by_band__row_202", + "ird_taxable_income_people_by_band__row_203", + "ird_taxable_income_people_by_band__row_204", + "ird_taxable_income_people_by_band__row_205", + "ird_taxable_income_people_by_band__row_206", + "ird_taxable_income_people_by_band__row_207", + "ird_taxable_income_people_by_band__row_208", + "ird_taxable_income_people_by_band__row_209", + "ird_taxable_income_people_by_band__row_210", + "ird_taxable_income_people_by_band__row_211", + "ird_taxable_income_people_by_band__row_212", + "ird_taxable_income_people_by_band__row_213", + "ird_taxable_income_people_by_band__row_214", + "ird_taxable_income_people_by_band__row_215", + "ird_taxable_income_people_by_band__row_216", + "ird_taxable_income_people_by_band__row_217", + "ird_taxable_income_people_by_band__row_218", + "ird_taxable_income_people_by_band__row_219", + "ird_taxable_income_people_by_band__row_220", + "ird_taxable_income_people_by_band__row_221", + "ird_taxable_income_people_by_band__row_222", + "ird_taxable_income_people_by_band__row_223", + "ird_taxable_income_people_by_band__row_224", + "ird_taxable_income_people_by_band__row_225", + "ird_taxable_income_people_by_band__row_226", + "ird_taxable_income_people_by_band__row_227", + "ird_taxable_income_people_by_band__row_228", + "ird_taxable_income_people_by_band__row_229", + "ird_taxable_income_people_by_band__row_230", + "ird_taxable_income_people_by_band__row_231", + "ird_taxable_income_people_by_band__row_232", + "ird_taxable_income_people_by_band__row_233", + "ird_taxable_income_people_by_band__row_234", + "ird_taxable_income_people_by_band__row_235", + "ird_taxable_income_people_by_band__row_236", + "ird_taxable_income_people_by_band__row_237", + "ird_taxable_income_people_by_band__row_238", + "ird_taxable_income_people_by_band__row_239", + "ird_taxable_income_people_by_band__row_240", + "ird_taxable_income_people_by_band__row_241", + "ird_taxable_income_people_by_band__row_242", + "ird_taxable_income_people_by_band__row_243", + "ird_taxable_income_people_by_band__row_244" + ], + "interval_table_ids": [], + "required_measurement_binding": "ird_taxable_income_ty2027_v1" + } + ] + }, + "central": { + "transformations": [ + { + "operation": "scale_money_and_intervals", + "factor_id": "ird_ty2024_to_ty2027_central", + "reference_names": [ + "ird_taxable_income_total_by_band__row_8", + "ird_taxable_income_total_by_band__row_9", + "ird_taxable_income_total_by_band__row_10", + "ird_taxable_income_total_by_band__row_11", + "ird_taxable_income_total_by_band__row_12", + "ird_taxable_income_total_by_band__row_13", + "ird_taxable_income_total_by_band__row_14", + "ird_taxable_income_total_by_band__row_15", + "ird_taxable_income_total_by_band__row_16", + "ird_taxable_income_total_by_band__row_17", + "ird_taxable_income_total_by_band__row_18", + "ird_taxable_income_total_by_band__row_19", + "ird_taxable_income_total_by_band__row_20", + "ird_taxable_income_total_by_band__row_21", + "ird_taxable_income_total_by_band__row_22", + "ird_taxable_income_total_by_band__row_23", + "ird_taxable_income_total_by_band__row_24", + "ird_taxable_income_total_by_band__row_25", + "ird_taxable_income_total_by_band__row_26", + "ird_taxable_income_total_by_band__row_27", + "ird_taxable_income_total_by_band__row_28", + "ird_taxable_income_total_by_band__row_29", + "ird_taxable_income_total_by_band__row_30", + "ird_taxable_income_total_by_band__row_31", + "ird_taxable_income_total_by_band__row_32", + "ird_taxable_income_total_by_band__row_33", + "ird_taxable_income_total_by_band__row_34", + "ird_taxable_income_total_by_band__row_35", + "ird_taxable_income_total_by_band__row_36", + "ird_taxable_income_total_by_band__row_37", + "ird_taxable_income_total_by_band__row_38", + "ird_taxable_income_total_by_band__row_39", + "ird_taxable_income_total_by_band__row_40", + "ird_taxable_income_total_by_band__row_41", + "ird_taxable_income_total_by_band__row_42", + "ird_taxable_income_total_by_band__row_43", + "ird_taxable_income_total_by_band__row_44", + "ird_taxable_income_total_by_band__row_45", + "ird_taxable_income_total_by_band__row_46", + "ird_taxable_income_total_by_band__row_47", + "ird_taxable_income_total_by_band__row_48", + "ird_taxable_income_total_by_band__row_49", + "ird_taxable_income_total_by_band__row_50", + "ird_taxable_income_total_by_band__row_51", + "ird_taxable_income_total_by_band__row_52", + "ird_taxable_income_total_by_band__row_53", + "ird_taxable_income_total_by_band__row_54", + "ird_taxable_income_total_by_band__row_55", + "ird_taxable_income_total_by_band__row_56", + "ird_taxable_income_total_by_band__row_57", + "ird_taxable_income_total_by_band__row_58", + "ird_taxable_income_total_by_band__row_59", + "ird_taxable_income_total_by_band__row_60", + "ird_taxable_income_total_by_band__row_61", + "ird_taxable_income_total_by_band__row_62", + "ird_taxable_income_total_by_band__row_63", + "ird_taxable_income_total_by_band__row_64", + "ird_taxable_income_total_by_band__row_65", + "ird_taxable_income_total_by_band__row_66", + "ird_taxable_income_total_by_band__row_67", + "ird_taxable_income_total_by_band__row_68", + "ird_taxable_income_total_by_band__row_69", + "ird_taxable_income_total_by_band__row_70", + "ird_taxable_income_total_by_band__row_71", + "ird_taxable_income_total_by_band__row_72", + "ird_taxable_income_total_by_band__row_73", + "ird_taxable_income_total_by_band__row_74", + "ird_taxable_income_total_by_band__row_75", + "ird_taxable_income_total_by_band__row_76", + "ird_taxable_income_total_by_band__row_77", + "ird_taxable_income_total_by_band__row_78", + "ird_taxable_income_total_by_band__row_79", + "ird_taxable_income_total_by_band__row_80", + "ird_taxable_income_total_by_band__row_81", + "ird_taxable_income_total_by_band__row_82", + "ird_taxable_income_total_by_band__row_83", + "ird_taxable_income_total_by_band__row_84", + "ird_taxable_income_total_by_band__row_85", + "ird_taxable_income_total_by_band__row_86", + "ird_taxable_income_total_by_band__row_87", + "ird_taxable_income_total_by_band__row_88", + "ird_taxable_income_total_by_band__row_89", + "ird_taxable_income_total_by_band__row_90", + "ird_taxable_income_total_by_band__row_91", + "ird_taxable_income_total_by_band__row_92", + "ird_taxable_income_total_by_band__row_93", + "ird_taxable_income_total_by_band__row_94", + "ird_taxable_income_total_by_band__row_95", + "ird_taxable_income_total_by_band__row_96", + "ird_taxable_income_total_by_band__row_97", + "ird_taxable_income_total_by_band__row_98", + "ird_taxable_income_total_by_band__row_99", + "ird_taxable_income_total_by_band__row_100", + "ird_taxable_income_total_by_band__row_101", + "ird_taxable_income_total_by_band__row_102", + "ird_taxable_income_total_by_band__row_103", + "ird_taxable_income_total_by_band__row_104", + "ird_taxable_income_total_by_band__row_105", + "ird_taxable_income_total_by_band__row_106", + "ird_taxable_income_total_by_band__row_107", + "ird_taxable_income_total_by_band__row_108", + "ird_taxable_income_total_by_band__row_109", + "ird_taxable_income_total_by_band__row_110", + "ird_taxable_income_total_by_band__row_111", + "ird_taxable_income_total_by_band__row_112", + "ird_taxable_income_total_by_band__row_113", + "ird_taxable_income_total_by_band__row_114", + "ird_taxable_income_total_by_band__row_115", + "ird_taxable_income_total_by_band__row_116", + "ird_taxable_income_total_by_band__row_117", + "ird_taxable_income_total_by_band__row_118", + "ird_taxable_income_total_by_band__row_119", + "ird_taxable_income_total_by_band__row_120", + "ird_taxable_income_total_by_band__row_121", + "ird_taxable_income_total_by_band__row_122", + "ird_taxable_income_total_by_band__row_123", + "ird_taxable_income_total_by_band__row_124", + "ird_taxable_income_total_by_band__row_125", + "ird_taxable_income_total_by_band__row_126", + "ird_taxable_income_total_by_band__row_127", + "ird_taxable_income_total_by_band__row_128", + "ird_taxable_income_total_by_band__row_129", + "ird_taxable_income_total_by_band__row_130", + "ird_taxable_income_total_by_band__row_131", + "ird_taxable_income_total_by_band__row_132", + "ird_taxable_income_total_by_band__row_133", + "ird_taxable_income_total_by_band__row_134", + "ird_taxable_income_total_by_band__row_135", + "ird_taxable_income_total_by_band__row_136", + "ird_taxable_income_total_by_band__row_137", + "ird_taxable_income_total_by_band__row_138", + "ird_taxable_income_total_by_band__row_139", + "ird_taxable_income_total_by_band__row_140", + "ird_taxable_income_total_by_band__row_141", + "ird_taxable_income_total_by_band__row_142", + "ird_taxable_income_total_by_band__row_143", + "ird_taxable_income_total_by_band__row_144", + "ird_taxable_income_total_by_band__row_145", + "ird_taxable_income_total_by_band__row_146", + "ird_taxable_income_total_by_band__row_147", + "ird_taxable_income_total_by_band__row_148", + "ird_taxable_income_total_by_band__row_149", + "ird_taxable_income_total_by_band__row_150", + "ird_taxable_income_total_by_band__row_151", + "ird_taxable_income_total_by_band__row_152", + "ird_taxable_income_total_by_band__row_153", + "ird_taxable_income_total_by_band__row_154", + "ird_taxable_income_total_by_band__row_155", + "ird_taxable_income_total_by_band__row_156", + "ird_taxable_income_total_by_band__row_157", + "ird_taxable_income_total_by_band__row_158", + "ird_taxable_income_total_by_band__row_159", + "ird_taxable_income_total_by_band__row_160", + "ird_taxable_income_total_by_band__row_161", + "ird_taxable_income_total_by_band__row_162", + "ird_taxable_income_total_by_band__row_163", + "ird_taxable_income_total_by_band__row_164", + "ird_taxable_income_total_by_band__row_165", + "ird_taxable_income_total_by_band__row_166", + "ird_taxable_income_total_by_band__row_167", + "ird_taxable_income_total_by_band__row_168", + "ird_taxable_income_total_by_band__row_169", + "ird_taxable_income_total_by_band__row_170", + "ird_taxable_income_total_by_band__row_171", + "ird_taxable_income_total_by_band__row_172", + "ird_taxable_income_total_by_band__row_173", + "ird_taxable_income_total_by_band__row_174", + "ird_taxable_income_total_by_band__row_175", + "ird_taxable_income_total_by_band__row_176", + "ird_taxable_income_total_by_band__row_177", + "ird_taxable_income_total_by_band__row_178", + "ird_taxable_income_total_by_band__row_179", + "ird_taxable_income_total_by_band__row_180", + "ird_taxable_income_total_by_band__row_181", + "ird_taxable_income_total_by_band__row_182", + "ird_taxable_income_total_by_band__row_183", + "ird_taxable_income_total_by_band__row_184", + "ird_taxable_income_total_by_band__row_185", + "ird_taxable_income_total_by_band__row_186", + "ird_taxable_income_total_by_band__row_187", + "ird_taxable_income_total_by_band__row_188", + "ird_taxable_income_total_by_band__row_189", + "ird_taxable_income_total_by_band__row_190", + "ird_taxable_income_total_by_band__row_191", + "ird_taxable_income_total_by_band__row_192", + "ird_taxable_income_total_by_band__row_193", + "ird_taxable_income_total_by_band__row_194", + "ird_taxable_income_total_by_band__row_195", + "ird_taxable_income_total_by_band__row_196", + "ird_taxable_income_total_by_band__row_197", + "ird_taxable_income_total_by_band__row_198", + "ird_taxable_income_total_by_band__row_199", + "ird_taxable_income_total_by_band__row_200", + "ird_taxable_income_total_by_band__row_201", + "ird_taxable_income_total_by_band__row_202", + "ird_taxable_income_total_by_band__row_203", + "ird_taxable_income_total_by_band__row_204", + "ird_taxable_income_total_by_band__row_205", + "ird_taxable_income_total_by_band__row_206", + "ird_taxable_income_total_by_band__row_207", + "ird_taxable_income_total_by_band__row_208", + "ird_taxable_income_total_by_band__row_209", + "ird_taxable_income_total_by_band__row_210", + "ird_taxable_income_total_by_band__row_211", + "ird_taxable_income_total_by_band__row_212", + "ird_taxable_income_total_by_band__row_213", + "ird_taxable_income_total_by_band__row_214", + "ird_taxable_income_total_by_band__row_215", + "ird_taxable_income_total_by_band__row_216", + "ird_taxable_income_total_by_band__row_217", + "ird_taxable_income_total_by_band__row_218", + "ird_taxable_income_total_by_band__row_219", + "ird_taxable_income_total_by_band__row_220", + "ird_taxable_income_total_by_band__row_221", + "ird_taxable_income_total_by_band__row_222", + "ird_taxable_income_total_by_band__row_223", + "ird_taxable_income_total_by_band__row_224", + "ird_taxable_income_total_by_band__row_225", + "ird_taxable_income_total_by_band__row_226", + "ird_taxable_income_total_by_band__row_227", + "ird_taxable_income_total_by_band__row_228", + "ird_taxable_income_total_by_band__row_229", + "ird_taxable_income_total_by_band__row_230", + "ird_taxable_income_total_by_band__row_231", + "ird_taxable_income_total_by_band__row_232", + "ird_taxable_income_total_by_band__row_233", + "ird_taxable_income_total_by_band__row_234", + "ird_taxable_income_total_by_band__row_235", + "ird_taxable_income_total_by_band__row_236", + "ird_taxable_income_total_by_band__row_237", + "ird_taxable_income_total_by_band__row_238", + "ird_taxable_income_total_by_band__row_239", + "ird_taxable_income_total_by_band__row_240", + "ird_taxable_income_total_by_band__row_241", + "ird_taxable_income_total_by_band__row_242", + "ird_taxable_income_total_by_band__row_243", + "ird_taxable_income_total_by_band__row_244" + ], + "count_reference_names": [ + "ird_taxable_income_people_by_band__row_8", + "ird_taxable_income_people_by_band__row_9", + "ird_taxable_income_people_by_band__row_10", + "ird_taxable_income_people_by_band__row_11", + "ird_taxable_income_people_by_band__row_12", + "ird_taxable_income_people_by_band__row_13", + "ird_taxable_income_people_by_band__row_14", + "ird_taxable_income_people_by_band__row_15", + "ird_taxable_income_people_by_band__row_16", + "ird_taxable_income_people_by_band__row_17", + "ird_taxable_income_people_by_band__row_18", + "ird_taxable_income_people_by_band__row_19", + "ird_taxable_income_people_by_band__row_20", + "ird_taxable_income_people_by_band__row_21", + "ird_taxable_income_people_by_band__row_22", + "ird_taxable_income_people_by_band__row_23", + "ird_taxable_income_people_by_band__row_24", + "ird_taxable_income_people_by_band__row_25", + "ird_taxable_income_people_by_band__row_26", + "ird_taxable_income_people_by_band__row_27", + "ird_taxable_income_people_by_band__row_28", + "ird_taxable_income_people_by_band__row_29", + "ird_taxable_income_people_by_band__row_30", + "ird_taxable_income_people_by_band__row_31", + "ird_taxable_income_people_by_band__row_32", + "ird_taxable_income_people_by_band__row_33", + "ird_taxable_income_people_by_band__row_34", + "ird_taxable_income_people_by_band__row_35", + "ird_taxable_income_people_by_band__row_36", + "ird_taxable_income_people_by_band__row_37", + "ird_taxable_income_people_by_band__row_38", + "ird_taxable_income_people_by_band__row_39", + "ird_taxable_income_people_by_band__row_40", + "ird_taxable_income_people_by_band__row_41", + "ird_taxable_income_people_by_band__row_42", + "ird_taxable_income_people_by_band__row_43", + "ird_taxable_income_people_by_band__row_44", + "ird_taxable_income_people_by_band__row_45", + "ird_taxable_income_people_by_band__row_46", + "ird_taxable_income_people_by_band__row_47", + "ird_taxable_income_people_by_band__row_48", + "ird_taxable_income_people_by_band__row_49", + "ird_taxable_income_people_by_band__row_50", + "ird_taxable_income_people_by_band__row_51", + "ird_taxable_income_people_by_band__row_52", + "ird_taxable_income_people_by_band__row_53", + "ird_taxable_income_people_by_band__row_54", + "ird_taxable_income_people_by_band__row_55", + "ird_taxable_income_people_by_band__row_56", + "ird_taxable_income_people_by_band__row_57", + "ird_taxable_income_people_by_band__row_58", + "ird_taxable_income_people_by_band__row_59", + "ird_taxable_income_people_by_band__row_60", + "ird_taxable_income_people_by_band__row_61", + "ird_taxable_income_people_by_band__row_62", + "ird_taxable_income_people_by_band__row_63", + "ird_taxable_income_people_by_band__row_64", + "ird_taxable_income_people_by_band__row_65", + "ird_taxable_income_people_by_band__row_66", + "ird_taxable_income_people_by_band__row_67", + "ird_taxable_income_people_by_band__row_68", + "ird_taxable_income_people_by_band__row_69", + "ird_taxable_income_people_by_band__row_70", + "ird_taxable_income_people_by_band__row_71", + "ird_taxable_income_people_by_band__row_72", + "ird_taxable_income_people_by_band__row_73", + "ird_taxable_income_people_by_band__row_74", + "ird_taxable_income_people_by_band__row_75", + "ird_taxable_income_people_by_band__row_76", + "ird_taxable_income_people_by_band__row_77", + "ird_taxable_income_people_by_band__row_78", + "ird_taxable_income_people_by_band__row_79", + "ird_taxable_income_people_by_band__row_80", + "ird_taxable_income_people_by_band__row_81", + "ird_taxable_income_people_by_band__row_82", + "ird_taxable_income_people_by_band__row_83", + "ird_taxable_income_people_by_band__row_84", + "ird_taxable_income_people_by_band__row_85", + "ird_taxable_income_people_by_band__row_86", + "ird_taxable_income_people_by_band__row_87", + "ird_taxable_income_people_by_band__row_88", + "ird_taxable_income_people_by_band__row_89", + "ird_taxable_income_people_by_band__row_90", + "ird_taxable_income_people_by_band__row_91", + "ird_taxable_income_people_by_band__row_92", + "ird_taxable_income_people_by_band__row_93", + "ird_taxable_income_people_by_band__row_94", + "ird_taxable_income_people_by_band__row_95", + "ird_taxable_income_people_by_band__row_96", + "ird_taxable_income_people_by_band__row_97", + "ird_taxable_income_people_by_band__row_98", + "ird_taxable_income_people_by_band__row_99", + "ird_taxable_income_people_by_band__row_100", + "ird_taxable_income_people_by_band__row_101", + "ird_taxable_income_people_by_band__row_102", + "ird_taxable_income_people_by_band__row_103", + "ird_taxable_income_people_by_band__row_104", + "ird_taxable_income_people_by_band__row_105", + "ird_taxable_income_people_by_band__row_106", + "ird_taxable_income_people_by_band__row_107", + "ird_taxable_income_people_by_band__row_108", + "ird_taxable_income_people_by_band__row_109", + "ird_taxable_income_people_by_band__row_110", + "ird_taxable_income_people_by_band__row_111", + "ird_taxable_income_people_by_band__row_112", + "ird_taxable_income_people_by_band__row_113", + "ird_taxable_income_people_by_band__row_114", + "ird_taxable_income_people_by_band__row_115", + "ird_taxable_income_people_by_band__row_116", + "ird_taxable_income_people_by_band__row_117", + "ird_taxable_income_people_by_band__row_118", + "ird_taxable_income_people_by_band__row_119", + "ird_taxable_income_people_by_band__row_120", + "ird_taxable_income_people_by_band__row_121", + "ird_taxable_income_people_by_band__row_122", + "ird_taxable_income_people_by_band__row_123", + "ird_taxable_income_people_by_band__row_124", + "ird_taxable_income_people_by_band__row_125", + "ird_taxable_income_people_by_band__row_126", + "ird_taxable_income_people_by_band__row_127", + "ird_taxable_income_people_by_band__row_128", + "ird_taxable_income_people_by_band__row_129", + "ird_taxable_income_people_by_band__row_130", + "ird_taxable_income_people_by_band__row_131", + "ird_taxable_income_people_by_band__row_132", + "ird_taxable_income_people_by_band__row_133", + "ird_taxable_income_people_by_band__row_134", + "ird_taxable_income_people_by_band__row_135", + "ird_taxable_income_people_by_band__row_136", + "ird_taxable_income_people_by_band__row_137", + "ird_taxable_income_people_by_band__row_138", + "ird_taxable_income_people_by_band__row_139", + "ird_taxable_income_people_by_band__row_140", + "ird_taxable_income_people_by_band__row_141", + "ird_taxable_income_people_by_band__row_142", + "ird_taxable_income_people_by_band__row_143", + "ird_taxable_income_people_by_band__row_144", + "ird_taxable_income_people_by_band__row_145", + "ird_taxable_income_people_by_band__row_146", + "ird_taxable_income_people_by_band__row_147", + "ird_taxable_income_people_by_band__row_148", + "ird_taxable_income_people_by_band__row_149", + "ird_taxable_income_people_by_band__row_150", + "ird_taxable_income_people_by_band__row_151", + "ird_taxable_income_people_by_band__row_152", + "ird_taxable_income_people_by_band__row_153", + "ird_taxable_income_people_by_band__row_154", + "ird_taxable_income_people_by_band__row_155", + "ird_taxable_income_people_by_band__row_156", + "ird_taxable_income_people_by_band__row_157", + "ird_taxable_income_people_by_band__row_158", + "ird_taxable_income_people_by_band__row_159", + "ird_taxable_income_people_by_band__row_160", + "ird_taxable_income_people_by_band__row_161", + "ird_taxable_income_people_by_band__row_162", + "ird_taxable_income_people_by_band__row_163", + "ird_taxable_income_people_by_band__row_164", + "ird_taxable_income_people_by_band__row_165", + "ird_taxable_income_people_by_band__row_166", + "ird_taxable_income_people_by_band__row_167", + "ird_taxable_income_people_by_band__row_168", + "ird_taxable_income_people_by_band__row_169", + "ird_taxable_income_people_by_band__row_170", + "ird_taxable_income_people_by_band__row_171", + "ird_taxable_income_people_by_band__row_172", + "ird_taxable_income_people_by_band__row_173", + "ird_taxable_income_people_by_band__row_174", + "ird_taxable_income_people_by_band__row_175", + "ird_taxable_income_people_by_band__row_176", + "ird_taxable_income_people_by_band__row_177", + "ird_taxable_income_people_by_band__row_178", + "ird_taxable_income_people_by_band__row_179", + "ird_taxable_income_people_by_band__row_180", + "ird_taxable_income_people_by_band__row_181", + "ird_taxable_income_people_by_band__row_182", + "ird_taxable_income_people_by_band__row_183", + "ird_taxable_income_people_by_band__row_184", + "ird_taxable_income_people_by_band__row_185", + "ird_taxable_income_people_by_band__row_186", + "ird_taxable_income_people_by_band__row_187", + "ird_taxable_income_people_by_band__row_188", + "ird_taxable_income_people_by_band__row_189", + "ird_taxable_income_people_by_band__row_190", + "ird_taxable_income_people_by_band__row_191", + "ird_taxable_income_people_by_band__row_192", + "ird_taxable_income_people_by_band__row_193", + "ird_taxable_income_people_by_band__row_194", + "ird_taxable_income_people_by_band__row_195", + "ird_taxable_income_people_by_band__row_196", + "ird_taxable_income_people_by_band__row_197", + "ird_taxable_income_people_by_band__row_198", + "ird_taxable_income_people_by_band__row_199", + "ird_taxable_income_people_by_band__row_200", + "ird_taxable_income_people_by_band__row_201", + "ird_taxable_income_people_by_band__row_202", + "ird_taxable_income_people_by_band__row_203", + "ird_taxable_income_people_by_band__row_204", + "ird_taxable_income_people_by_band__row_205", + "ird_taxable_income_people_by_band__row_206", + "ird_taxable_income_people_by_band__row_207", + "ird_taxable_income_people_by_band__row_208", + "ird_taxable_income_people_by_band__row_209", + "ird_taxable_income_people_by_band__row_210", + "ird_taxable_income_people_by_band__row_211", + "ird_taxable_income_people_by_band__row_212", + "ird_taxable_income_people_by_band__row_213", + "ird_taxable_income_people_by_band__row_214", + "ird_taxable_income_people_by_band__row_215", + "ird_taxable_income_people_by_band__row_216", + "ird_taxable_income_people_by_band__row_217", + "ird_taxable_income_people_by_band__row_218", + "ird_taxable_income_people_by_band__row_219", + "ird_taxable_income_people_by_band__row_220", + "ird_taxable_income_people_by_band__row_221", + "ird_taxable_income_people_by_band__row_222", + "ird_taxable_income_people_by_band__row_223", + "ird_taxable_income_people_by_band__row_224", + "ird_taxable_income_people_by_band__row_225", + "ird_taxable_income_people_by_band__row_226", + "ird_taxable_income_people_by_band__row_227", + "ird_taxable_income_people_by_band__row_228", + "ird_taxable_income_people_by_band__row_229", + "ird_taxable_income_people_by_band__row_230", + "ird_taxable_income_people_by_band__row_231", + "ird_taxable_income_people_by_band__row_232", + "ird_taxable_income_people_by_band__row_233", + "ird_taxable_income_people_by_band__row_234", + "ird_taxable_income_people_by_band__row_235", + "ird_taxable_income_people_by_band__row_236", + "ird_taxable_income_people_by_band__row_237", + "ird_taxable_income_people_by_band__row_238", + "ird_taxable_income_people_by_band__row_239", + "ird_taxable_income_people_by_band__row_240", + "ird_taxable_income_people_by_band__row_241", + "ird_taxable_income_people_by_band__row_242", + "ird_taxable_income_people_by_band__row_243", + "ird_taxable_income_people_by_band__row_244" + ], + "interval_table_ids": [], + "required_measurement_binding": "ird_taxable_income_ty2027_v1" + } + ] }, "high": { - "available": false, - "transformations": [] + "transformations": [ + { + "operation": "scale_money_and_intervals", + "factor_id": "ird_ty2024_to_ty2027_high", + "reference_names": [ + "ird_taxable_income_total_by_band__row_8", + "ird_taxable_income_total_by_band__row_9", + "ird_taxable_income_total_by_band__row_10", + "ird_taxable_income_total_by_band__row_11", + "ird_taxable_income_total_by_band__row_12", + "ird_taxable_income_total_by_band__row_13", + "ird_taxable_income_total_by_band__row_14", + "ird_taxable_income_total_by_band__row_15", + "ird_taxable_income_total_by_band__row_16", + "ird_taxable_income_total_by_band__row_17", + "ird_taxable_income_total_by_band__row_18", + "ird_taxable_income_total_by_band__row_19", + "ird_taxable_income_total_by_band__row_20", + "ird_taxable_income_total_by_band__row_21", + "ird_taxable_income_total_by_band__row_22", + "ird_taxable_income_total_by_band__row_23", + "ird_taxable_income_total_by_band__row_24", + "ird_taxable_income_total_by_band__row_25", + "ird_taxable_income_total_by_band__row_26", + "ird_taxable_income_total_by_band__row_27", + "ird_taxable_income_total_by_band__row_28", + "ird_taxable_income_total_by_band__row_29", + "ird_taxable_income_total_by_band__row_30", + "ird_taxable_income_total_by_band__row_31", + "ird_taxable_income_total_by_band__row_32", + "ird_taxable_income_total_by_band__row_33", + "ird_taxable_income_total_by_band__row_34", + "ird_taxable_income_total_by_band__row_35", + "ird_taxable_income_total_by_band__row_36", + "ird_taxable_income_total_by_band__row_37", + "ird_taxable_income_total_by_band__row_38", + "ird_taxable_income_total_by_band__row_39", + "ird_taxable_income_total_by_band__row_40", + "ird_taxable_income_total_by_band__row_41", + "ird_taxable_income_total_by_band__row_42", + "ird_taxable_income_total_by_band__row_43", + "ird_taxable_income_total_by_band__row_44", + "ird_taxable_income_total_by_band__row_45", + "ird_taxable_income_total_by_band__row_46", + "ird_taxable_income_total_by_band__row_47", + "ird_taxable_income_total_by_band__row_48", + "ird_taxable_income_total_by_band__row_49", + "ird_taxable_income_total_by_band__row_50", + "ird_taxable_income_total_by_band__row_51", + "ird_taxable_income_total_by_band__row_52", + "ird_taxable_income_total_by_band__row_53", + "ird_taxable_income_total_by_band__row_54", + "ird_taxable_income_total_by_band__row_55", + "ird_taxable_income_total_by_band__row_56", + "ird_taxable_income_total_by_band__row_57", + "ird_taxable_income_total_by_band__row_58", + "ird_taxable_income_total_by_band__row_59", + "ird_taxable_income_total_by_band__row_60", + "ird_taxable_income_total_by_band__row_61", + "ird_taxable_income_total_by_band__row_62", + "ird_taxable_income_total_by_band__row_63", + "ird_taxable_income_total_by_band__row_64", + "ird_taxable_income_total_by_band__row_65", + "ird_taxable_income_total_by_band__row_66", + "ird_taxable_income_total_by_band__row_67", + "ird_taxable_income_total_by_band__row_68", + "ird_taxable_income_total_by_band__row_69", + "ird_taxable_income_total_by_band__row_70", + "ird_taxable_income_total_by_band__row_71", + "ird_taxable_income_total_by_band__row_72", + "ird_taxable_income_total_by_band__row_73", + "ird_taxable_income_total_by_band__row_74", + "ird_taxable_income_total_by_band__row_75", + "ird_taxable_income_total_by_band__row_76", + "ird_taxable_income_total_by_band__row_77", + "ird_taxable_income_total_by_band__row_78", + "ird_taxable_income_total_by_band__row_79", + "ird_taxable_income_total_by_band__row_80", + "ird_taxable_income_total_by_band__row_81", + "ird_taxable_income_total_by_band__row_82", + "ird_taxable_income_total_by_band__row_83", + "ird_taxable_income_total_by_band__row_84", + "ird_taxable_income_total_by_band__row_85", + "ird_taxable_income_total_by_band__row_86", + "ird_taxable_income_total_by_band__row_87", + "ird_taxable_income_total_by_band__row_88", + "ird_taxable_income_total_by_band__row_89", + "ird_taxable_income_total_by_band__row_90", + "ird_taxable_income_total_by_band__row_91", + "ird_taxable_income_total_by_band__row_92", + "ird_taxable_income_total_by_band__row_93", + "ird_taxable_income_total_by_band__row_94", + "ird_taxable_income_total_by_band__row_95", + "ird_taxable_income_total_by_band__row_96", + "ird_taxable_income_total_by_band__row_97", + "ird_taxable_income_total_by_band__row_98", + "ird_taxable_income_total_by_band__row_99", + "ird_taxable_income_total_by_band__row_100", + "ird_taxable_income_total_by_band__row_101", + "ird_taxable_income_total_by_band__row_102", + "ird_taxable_income_total_by_band__row_103", + "ird_taxable_income_total_by_band__row_104", + "ird_taxable_income_total_by_band__row_105", + "ird_taxable_income_total_by_band__row_106", + "ird_taxable_income_total_by_band__row_107", + "ird_taxable_income_total_by_band__row_108", + "ird_taxable_income_total_by_band__row_109", + "ird_taxable_income_total_by_band__row_110", + "ird_taxable_income_total_by_band__row_111", + "ird_taxable_income_total_by_band__row_112", + "ird_taxable_income_total_by_band__row_113", + "ird_taxable_income_total_by_band__row_114", + "ird_taxable_income_total_by_band__row_115", + "ird_taxable_income_total_by_band__row_116", + "ird_taxable_income_total_by_band__row_117", + "ird_taxable_income_total_by_band__row_118", + "ird_taxable_income_total_by_band__row_119", + "ird_taxable_income_total_by_band__row_120", + "ird_taxable_income_total_by_band__row_121", + "ird_taxable_income_total_by_band__row_122", + "ird_taxable_income_total_by_band__row_123", + "ird_taxable_income_total_by_band__row_124", + "ird_taxable_income_total_by_band__row_125", + "ird_taxable_income_total_by_band__row_126", + "ird_taxable_income_total_by_band__row_127", + "ird_taxable_income_total_by_band__row_128", + "ird_taxable_income_total_by_band__row_129", + "ird_taxable_income_total_by_band__row_130", + "ird_taxable_income_total_by_band__row_131", + "ird_taxable_income_total_by_band__row_132", + "ird_taxable_income_total_by_band__row_133", + "ird_taxable_income_total_by_band__row_134", + "ird_taxable_income_total_by_band__row_135", + "ird_taxable_income_total_by_band__row_136", + "ird_taxable_income_total_by_band__row_137", + "ird_taxable_income_total_by_band__row_138", + "ird_taxable_income_total_by_band__row_139", + "ird_taxable_income_total_by_band__row_140", + "ird_taxable_income_total_by_band__row_141", + "ird_taxable_income_total_by_band__row_142", + "ird_taxable_income_total_by_band__row_143", + "ird_taxable_income_total_by_band__row_144", + "ird_taxable_income_total_by_band__row_145", + "ird_taxable_income_total_by_band__row_146", + "ird_taxable_income_total_by_band__row_147", + "ird_taxable_income_total_by_band__row_148", + "ird_taxable_income_total_by_band__row_149", + "ird_taxable_income_total_by_band__row_150", + "ird_taxable_income_total_by_band__row_151", + "ird_taxable_income_total_by_band__row_152", + "ird_taxable_income_total_by_band__row_153", + "ird_taxable_income_total_by_band__row_154", + "ird_taxable_income_total_by_band__row_155", + "ird_taxable_income_total_by_band__row_156", + "ird_taxable_income_total_by_band__row_157", + "ird_taxable_income_total_by_band__row_158", + "ird_taxable_income_total_by_band__row_159", + "ird_taxable_income_total_by_band__row_160", + "ird_taxable_income_total_by_band__row_161", + "ird_taxable_income_total_by_band__row_162", + "ird_taxable_income_total_by_band__row_163", + "ird_taxable_income_total_by_band__row_164", + "ird_taxable_income_total_by_band__row_165", + "ird_taxable_income_total_by_band__row_166", + "ird_taxable_income_total_by_band__row_167", + "ird_taxable_income_total_by_band__row_168", + "ird_taxable_income_total_by_band__row_169", + "ird_taxable_income_total_by_band__row_170", + "ird_taxable_income_total_by_band__row_171", + "ird_taxable_income_total_by_band__row_172", + "ird_taxable_income_total_by_band__row_173", + "ird_taxable_income_total_by_band__row_174", + "ird_taxable_income_total_by_band__row_175", + "ird_taxable_income_total_by_band__row_176", + "ird_taxable_income_total_by_band__row_177", + "ird_taxable_income_total_by_band__row_178", + "ird_taxable_income_total_by_band__row_179", + "ird_taxable_income_total_by_band__row_180", + "ird_taxable_income_total_by_band__row_181", + "ird_taxable_income_total_by_band__row_182", + "ird_taxable_income_total_by_band__row_183", + "ird_taxable_income_total_by_band__row_184", + "ird_taxable_income_total_by_band__row_185", + "ird_taxable_income_total_by_band__row_186", + "ird_taxable_income_total_by_band__row_187", + "ird_taxable_income_total_by_band__row_188", + "ird_taxable_income_total_by_band__row_189", + "ird_taxable_income_total_by_band__row_190", + "ird_taxable_income_total_by_band__row_191", + "ird_taxable_income_total_by_band__row_192", + "ird_taxable_income_total_by_band__row_193", + "ird_taxable_income_total_by_band__row_194", + "ird_taxable_income_total_by_band__row_195", + "ird_taxable_income_total_by_band__row_196", + "ird_taxable_income_total_by_band__row_197", + "ird_taxable_income_total_by_band__row_198", + "ird_taxable_income_total_by_band__row_199", + "ird_taxable_income_total_by_band__row_200", + "ird_taxable_income_total_by_band__row_201", + "ird_taxable_income_total_by_band__row_202", + "ird_taxable_income_total_by_band__row_203", + "ird_taxable_income_total_by_band__row_204", + "ird_taxable_income_total_by_band__row_205", + "ird_taxable_income_total_by_band__row_206", + "ird_taxable_income_total_by_band__row_207", + "ird_taxable_income_total_by_band__row_208", + "ird_taxable_income_total_by_band__row_209", + "ird_taxable_income_total_by_band__row_210", + "ird_taxable_income_total_by_band__row_211", + "ird_taxable_income_total_by_band__row_212", + "ird_taxable_income_total_by_band__row_213", + "ird_taxable_income_total_by_band__row_214", + "ird_taxable_income_total_by_band__row_215", + "ird_taxable_income_total_by_band__row_216", + "ird_taxable_income_total_by_band__row_217", + "ird_taxable_income_total_by_band__row_218", + "ird_taxable_income_total_by_band__row_219", + "ird_taxable_income_total_by_band__row_220", + "ird_taxable_income_total_by_band__row_221", + "ird_taxable_income_total_by_band__row_222", + "ird_taxable_income_total_by_band__row_223", + "ird_taxable_income_total_by_band__row_224", + "ird_taxable_income_total_by_band__row_225", + "ird_taxable_income_total_by_band__row_226", + "ird_taxable_income_total_by_band__row_227", + "ird_taxable_income_total_by_band__row_228", + "ird_taxable_income_total_by_band__row_229", + "ird_taxable_income_total_by_band__row_230", + "ird_taxable_income_total_by_band__row_231", + "ird_taxable_income_total_by_band__row_232", + "ird_taxable_income_total_by_band__row_233", + "ird_taxable_income_total_by_band__row_234", + "ird_taxable_income_total_by_band__row_235", + "ird_taxable_income_total_by_band__row_236", + "ird_taxable_income_total_by_band__row_237", + "ird_taxable_income_total_by_band__row_238", + "ird_taxable_income_total_by_band__row_239", + "ird_taxable_income_total_by_band__row_240", + "ird_taxable_income_total_by_band__row_241", + "ird_taxable_income_total_by_band__row_242", + "ird_taxable_income_total_by_band__row_243", + "ird_taxable_income_total_by_band__row_244" + ], + "count_reference_names": [ + "ird_taxable_income_people_by_band__row_8", + "ird_taxable_income_people_by_band__row_9", + "ird_taxable_income_people_by_band__row_10", + "ird_taxable_income_people_by_band__row_11", + "ird_taxable_income_people_by_band__row_12", + "ird_taxable_income_people_by_band__row_13", + "ird_taxable_income_people_by_band__row_14", + "ird_taxable_income_people_by_band__row_15", + "ird_taxable_income_people_by_band__row_16", + "ird_taxable_income_people_by_band__row_17", + "ird_taxable_income_people_by_band__row_18", + "ird_taxable_income_people_by_band__row_19", + "ird_taxable_income_people_by_band__row_20", + "ird_taxable_income_people_by_band__row_21", + "ird_taxable_income_people_by_band__row_22", + "ird_taxable_income_people_by_band__row_23", + "ird_taxable_income_people_by_band__row_24", + "ird_taxable_income_people_by_band__row_25", + "ird_taxable_income_people_by_band__row_26", + "ird_taxable_income_people_by_band__row_27", + "ird_taxable_income_people_by_band__row_28", + "ird_taxable_income_people_by_band__row_29", + "ird_taxable_income_people_by_band__row_30", + "ird_taxable_income_people_by_band__row_31", + "ird_taxable_income_people_by_band__row_32", + "ird_taxable_income_people_by_band__row_33", + "ird_taxable_income_people_by_band__row_34", + "ird_taxable_income_people_by_band__row_35", + "ird_taxable_income_people_by_band__row_36", + "ird_taxable_income_people_by_band__row_37", + "ird_taxable_income_people_by_band__row_38", + "ird_taxable_income_people_by_band__row_39", + "ird_taxable_income_people_by_band__row_40", + "ird_taxable_income_people_by_band__row_41", + "ird_taxable_income_people_by_band__row_42", + "ird_taxable_income_people_by_band__row_43", + "ird_taxable_income_people_by_band__row_44", + "ird_taxable_income_people_by_band__row_45", + "ird_taxable_income_people_by_band__row_46", + "ird_taxable_income_people_by_band__row_47", + "ird_taxable_income_people_by_band__row_48", + "ird_taxable_income_people_by_band__row_49", + "ird_taxable_income_people_by_band__row_50", + "ird_taxable_income_people_by_band__row_51", + "ird_taxable_income_people_by_band__row_52", + "ird_taxable_income_people_by_band__row_53", + "ird_taxable_income_people_by_band__row_54", + "ird_taxable_income_people_by_band__row_55", + "ird_taxable_income_people_by_band__row_56", + "ird_taxable_income_people_by_band__row_57", + "ird_taxable_income_people_by_band__row_58", + "ird_taxable_income_people_by_band__row_59", + "ird_taxable_income_people_by_band__row_60", + "ird_taxable_income_people_by_band__row_61", + "ird_taxable_income_people_by_band__row_62", + "ird_taxable_income_people_by_band__row_63", + "ird_taxable_income_people_by_band__row_64", + "ird_taxable_income_people_by_band__row_65", + "ird_taxable_income_people_by_band__row_66", + "ird_taxable_income_people_by_band__row_67", + "ird_taxable_income_people_by_band__row_68", + "ird_taxable_income_people_by_band__row_69", + "ird_taxable_income_people_by_band__row_70", + "ird_taxable_income_people_by_band__row_71", + "ird_taxable_income_people_by_band__row_72", + "ird_taxable_income_people_by_band__row_73", + "ird_taxable_income_people_by_band__row_74", + "ird_taxable_income_people_by_band__row_75", + "ird_taxable_income_people_by_band__row_76", + "ird_taxable_income_people_by_band__row_77", + "ird_taxable_income_people_by_band__row_78", + "ird_taxable_income_people_by_band__row_79", + "ird_taxable_income_people_by_band__row_80", + "ird_taxable_income_people_by_band__row_81", + "ird_taxable_income_people_by_band__row_82", + "ird_taxable_income_people_by_band__row_83", + "ird_taxable_income_people_by_band__row_84", + "ird_taxable_income_people_by_band__row_85", + "ird_taxable_income_people_by_band__row_86", + "ird_taxable_income_people_by_band__row_87", + "ird_taxable_income_people_by_band__row_88", + "ird_taxable_income_people_by_band__row_89", + "ird_taxable_income_people_by_band__row_90", + "ird_taxable_income_people_by_band__row_91", + "ird_taxable_income_people_by_band__row_92", + "ird_taxable_income_people_by_band__row_93", + "ird_taxable_income_people_by_band__row_94", + "ird_taxable_income_people_by_band__row_95", + "ird_taxable_income_people_by_band__row_96", + "ird_taxable_income_people_by_band__row_97", + "ird_taxable_income_people_by_band__row_98", + "ird_taxable_income_people_by_band__row_99", + "ird_taxable_income_people_by_band__row_100", + "ird_taxable_income_people_by_band__row_101", + "ird_taxable_income_people_by_band__row_102", + "ird_taxable_income_people_by_band__row_103", + "ird_taxable_income_people_by_band__row_104", + "ird_taxable_income_people_by_band__row_105", + "ird_taxable_income_people_by_band__row_106", + "ird_taxable_income_people_by_band__row_107", + "ird_taxable_income_people_by_band__row_108", + "ird_taxable_income_people_by_band__row_109", + "ird_taxable_income_people_by_band__row_110", + "ird_taxable_income_people_by_band__row_111", + "ird_taxable_income_people_by_band__row_112", + "ird_taxable_income_people_by_band__row_113", + "ird_taxable_income_people_by_band__row_114", + "ird_taxable_income_people_by_band__row_115", + "ird_taxable_income_people_by_band__row_116", + "ird_taxable_income_people_by_band__row_117", + "ird_taxable_income_people_by_band__row_118", + "ird_taxable_income_people_by_band__row_119", + "ird_taxable_income_people_by_band__row_120", + "ird_taxable_income_people_by_band__row_121", + "ird_taxable_income_people_by_band__row_122", + "ird_taxable_income_people_by_band__row_123", + "ird_taxable_income_people_by_band__row_124", + "ird_taxable_income_people_by_band__row_125", + "ird_taxable_income_people_by_band__row_126", + "ird_taxable_income_people_by_band__row_127", + "ird_taxable_income_people_by_band__row_128", + "ird_taxable_income_people_by_band__row_129", + "ird_taxable_income_people_by_band__row_130", + "ird_taxable_income_people_by_band__row_131", + "ird_taxable_income_people_by_band__row_132", + "ird_taxable_income_people_by_band__row_133", + "ird_taxable_income_people_by_band__row_134", + "ird_taxable_income_people_by_band__row_135", + "ird_taxable_income_people_by_band__row_136", + "ird_taxable_income_people_by_band__row_137", + "ird_taxable_income_people_by_band__row_138", + "ird_taxable_income_people_by_band__row_139", + "ird_taxable_income_people_by_band__row_140", + "ird_taxable_income_people_by_band__row_141", + "ird_taxable_income_people_by_band__row_142", + "ird_taxable_income_people_by_band__row_143", + "ird_taxable_income_people_by_band__row_144", + "ird_taxable_income_people_by_band__row_145", + "ird_taxable_income_people_by_band__row_146", + "ird_taxable_income_people_by_band__row_147", + "ird_taxable_income_people_by_band__row_148", + "ird_taxable_income_people_by_band__row_149", + "ird_taxable_income_people_by_band__row_150", + "ird_taxable_income_people_by_band__row_151", + "ird_taxable_income_people_by_band__row_152", + "ird_taxable_income_people_by_band__row_153", + "ird_taxable_income_people_by_band__row_154", + "ird_taxable_income_people_by_band__row_155", + "ird_taxable_income_people_by_band__row_156", + "ird_taxable_income_people_by_band__row_157", + "ird_taxable_income_people_by_band__row_158", + "ird_taxable_income_people_by_band__row_159", + "ird_taxable_income_people_by_band__row_160", + "ird_taxable_income_people_by_band__row_161", + "ird_taxable_income_people_by_band__row_162", + "ird_taxable_income_people_by_band__row_163", + "ird_taxable_income_people_by_band__row_164", + "ird_taxable_income_people_by_band__row_165", + "ird_taxable_income_people_by_band__row_166", + "ird_taxable_income_people_by_band__row_167", + "ird_taxable_income_people_by_band__row_168", + "ird_taxable_income_people_by_band__row_169", + "ird_taxable_income_people_by_band__row_170", + "ird_taxable_income_people_by_band__row_171", + "ird_taxable_income_people_by_band__row_172", + "ird_taxable_income_people_by_band__row_173", + "ird_taxable_income_people_by_band__row_174", + "ird_taxable_income_people_by_band__row_175", + "ird_taxable_income_people_by_band__row_176", + "ird_taxable_income_people_by_band__row_177", + "ird_taxable_income_people_by_band__row_178", + "ird_taxable_income_people_by_band__row_179", + "ird_taxable_income_people_by_band__row_180", + "ird_taxable_income_people_by_band__row_181", + "ird_taxable_income_people_by_band__row_182", + "ird_taxable_income_people_by_band__row_183", + "ird_taxable_income_people_by_band__row_184", + "ird_taxable_income_people_by_band__row_185", + "ird_taxable_income_people_by_band__row_186", + "ird_taxable_income_people_by_band__row_187", + "ird_taxable_income_people_by_band__row_188", + "ird_taxable_income_people_by_band__row_189", + "ird_taxable_income_people_by_band__row_190", + "ird_taxable_income_people_by_band__row_191", + "ird_taxable_income_people_by_band__row_192", + "ird_taxable_income_people_by_band__row_193", + "ird_taxable_income_people_by_band__row_194", + "ird_taxable_income_people_by_band__row_195", + "ird_taxable_income_people_by_band__row_196", + "ird_taxable_income_people_by_band__row_197", + "ird_taxable_income_people_by_band__row_198", + "ird_taxable_income_people_by_band__row_199", + "ird_taxable_income_people_by_band__row_200", + "ird_taxable_income_people_by_band__row_201", + "ird_taxable_income_people_by_band__row_202", + "ird_taxable_income_people_by_band__row_203", + "ird_taxable_income_people_by_band__row_204", + "ird_taxable_income_people_by_band__row_205", + "ird_taxable_income_people_by_band__row_206", + "ird_taxable_income_people_by_band__row_207", + "ird_taxable_income_people_by_band__row_208", + "ird_taxable_income_people_by_band__row_209", + "ird_taxable_income_people_by_band__row_210", + "ird_taxable_income_people_by_band__row_211", + "ird_taxable_income_people_by_band__row_212", + "ird_taxable_income_people_by_band__row_213", + "ird_taxable_income_people_by_band__row_214", + "ird_taxable_income_people_by_band__row_215", + "ird_taxable_income_people_by_band__row_216", + "ird_taxable_income_people_by_band__row_217", + "ird_taxable_income_people_by_band__row_218", + "ird_taxable_income_people_by_band__row_219", + "ird_taxable_income_people_by_band__row_220", + "ird_taxable_income_people_by_band__row_221", + "ird_taxable_income_people_by_band__row_222", + "ird_taxable_income_people_by_band__row_223", + "ird_taxable_income_people_by_band__row_224", + "ird_taxable_income_people_by_band__row_225", + "ird_taxable_income_people_by_band__row_226", + "ird_taxable_income_people_by_band__row_227", + "ird_taxable_income_people_by_band__row_228", + "ird_taxable_income_people_by_band__row_229", + "ird_taxable_income_people_by_band__row_230", + "ird_taxable_income_people_by_band__row_231", + "ird_taxable_income_people_by_band__row_232", + "ird_taxable_income_people_by_band__row_233", + "ird_taxable_income_people_by_band__row_234", + "ird_taxable_income_people_by_band__row_235", + "ird_taxable_income_people_by_band__row_236", + "ird_taxable_income_people_by_band__row_237", + "ird_taxable_income_people_by_band__row_238", + "ird_taxable_income_people_by_band__row_239", + "ird_taxable_income_people_by_band__row_240", + "ird_taxable_income_people_by_band__row_241", + "ird_taxable_income_people_by_band__row_242", + "ird_taxable_income_people_by_band__row_243", + "ird_taxable_income_people_by_band__row_244" + ], + "interval_table_ids": [], + "required_measurement_binding": "ird_taxable_income_ty2027_v1" + } + ] } } } diff --git a/packages/microcosm-build/src/microcosm/build/nz/target_references.json b/packages/microcosm-build/src/microcosm/build/nz/target_references.json index bbe44aee98..8137a17bc3 100644 --- a/packages/microcosm-build/src/microcosm/build/nz/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/nz/target_references.json @@ -5,7 +5,8 @@ "allowed_value_operations": [ "identity", "rolled_forward_by_ratio", - "allocated_residual_by_ratio" + "allocated_residual_by_ratio", + "linear_combination" ], "target_references": [ { @@ -25597,14 +25598,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25619,7 +25624,7 @@ "target_label": "TY2026-27 ird taxable income people by band nil (parked)" }, "filter": "taxable_income_band_row_8_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_9", @@ -25649,14 +25654,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25671,7 +25680,7 @@ "target_label": "TY2026-27 ird taxable income people by band $0.01 - $100 (parked)" }, "filter": "taxable_income_band_row_9_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_10", @@ -25701,14 +25710,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25723,7 +25736,7 @@ "target_label": "TY2026-27 ird taxable income people by band $101 - $1,000 (parked)" }, "filter": "taxable_income_band_row_10_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_11", @@ -25753,14 +25766,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25775,7 +25792,7 @@ "target_label": "TY2026-27 ird taxable income people by band $1,001 - $2,000 (parked)" }, "filter": "taxable_income_band_row_11_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_12", @@ -25805,14 +25822,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25827,7 +25848,7 @@ "target_label": "TY2026-27 ird taxable income people by band $2,001 - $3,000 (parked)" }, "filter": "taxable_income_band_row_12_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_13", @@ -25857,14 +25878,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25879,7 +25904,7 @@ "target_label": "TY2026-27 ird taxable income people by band $3,001 - $4,000 (parked)" }, "filter": "taxable_income_band_row_13_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_14", @@ -25909,14 +25934,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25931,7 +25960,7 @@ "target_label": "TY2026-27 ird taxable income people by band $4,001 - $5,000 (parked)" }, "filter": "taxable_income_band_row_14_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_15", @@ -25961,14 +25990,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -25983,7 +26016,7 @@ "target_label": "TY2026-27 ird taxable income people by band $5,001 - $6,000 (parked)" }, "filter": "taxable_income_band_row_15_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_16", @@ -26013,14 +26046,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26035,7 +26072,7 @@ "target_label": "TY2026-27 ird taxable income people by band $6,001 - $7,000 (parked)" }, "filter": "taxable_income_band_row_16_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_17", @@ -26065,14 +26102,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26087,7 +26128,7 @@ "target_label": "TY2026-27 ird taxable income people by band $7,001 - $8,000 (parked)" }, "filter": "taxable_income_band_row_17_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_18", @@ -26117,14 +26158,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26139,7 +26184,7 @@ "target_label": "TY2026-27 ird taxable income people by band $8,001 - $9,000 (parked)" }, "filter": "taxable_income_band_row_18_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_19", @@ -26169,14 +26214,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26191,7 +26240,7 @@ "target_label": "TY2026-27 ird taxable income people by band $9,001 - $10,000 (parked)" }, "filter": "taxable_income_band_row_19_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_20", @@ -26221,14 +26270,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26243,7 +26296,7 @@ "target_label": "TY2026-27 ird taxable income people by band $10,001 - $11,000 (parked)" }, "filter": "taxable_income_band_row_20_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_21", @@ -26273,14 +26326,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26295,7 +26352,7 @@ "target_label": "TY2026-27 ird taxable income people by band $11,001 - $12,000 (parked)" }, "filter": "taxable_income_band_row_21_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_22", @@ -26325,14 +26382,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26347,7 +26408,7 @@ "target_label": "TY2026-27 ird taxable income people by band $12,001 - $13,000 (parked)" }, "filter": "taxable_income_band_row_22_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_23", @@ -26377,14 +26438,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26399,7 +26464,7 @@ "target_label": "TY2026-27 ird taxable income people by band $13,001 - $14,000 (parked)" }, "filter": "taxable_income_band_row_23_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_24", @@ -26429,14 +26494,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26451,7 +26520,7 @@ "target_label": "TY2026-27 ird taxable income people by band $14,001 - $15,000 (parked)" }, "filter": "taxable_income_band_row_24_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_25", @@ -26481,14 +26550,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26503,7 +26576,7 @@ "target_label": "TY2026-27 ird taxable income people by band $15,001 - $16,000 (parked)" }, "filter": "taxable_income_band_row_25_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_26", @@ -26533,14 +26606,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26555,7 +26632,7 @@ "target_label": "TY2026-27 ird taxable income people by band $16,001 - $17,000 (parked)" }, "filter": "taxable_income_band_row_26_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_27", @@ -26585,14 +26662,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26607,7 +26688,7 @@ "target_label": "TY2026-27 ird taxable income people by band $17,001 - $18,000 (parked)" }, "filter": "taxable_income_band_row_27_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_28", @@ -26637,14 +26718,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26659,7 +26744,7 @@ "target_label": "TY2026-27 ird taxable income people by band $18,001 - $19,000 (parked)" }, "filter": "taxable_income_band_row_28_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_29", @@ -26689,14 +26774,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26711,7 +26800,7 @@ "target_label": "TY2026-27 ird taxable income people by band $19,001 - $20,000 (parked)" }, "filter": "taxable_income_band_row_29_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_30", @@ -26741,14 +26830,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26763,7 +26856,7 @@ "target_label": "TY2026-27 ird taxable income people by band $20,000 - $21,000 (parked)" }, "filter": "taxable_income_band_row_30_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_31", @@ -26793,14 +26886,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26815,7 +26912,7 @@ "target_label": "TY2026-27 ird taxable income people by band $21,001 - $22,000 (parked)" }, "filter": "taxable_income_band_row_31_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_32", @@ -26845,14 +26942,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26867,7 +26968,7 @@ "target_label": "TY2026-27 ird taxable income people by band $22,001 - $23,000 (parked)" }, "filter": "taxable_income_band_row_32_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_33", @@ -26897,14 +26998,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26919,7 +27024,7 @@ "target_label": "TY2026-27 ird taxable income people by band $23,001 - $24,000 (parked)" }, "filter": "taxable_income_band_row_33_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_34", @@ -26949,14 +27054,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -26971,7 +27080,7 @@ "target_label": "TY2026-27 ird taxable income people by band $24,001 - $25,000 (parked)" }, "filter": "taxable_income_band_row_34_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_35", @@ -27001,14 +27110,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27023,7 +27136,7 @@ "target_label": "TY2026-27 ird taxable income people by band $25,001 - $26,000 (parked)" }, "filter": "taxable_income_band_row_35_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_36", @@ -27053,14 +27166,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27075,7 +27192,7 @@ "target_label": "TY2026-27 ird taxable income people by band $26,001 - $27,000 (parked)" }, "filter": "taxable_income_band_row_36_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_37", @@ -27105,14 +27222,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27127,7 +27248,7 @@ "target_label": "TY2026-27 ird taxable income people by band $27,001 - $28,000 (parked)" }, "filter": "taxable_income_band_row_37_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_38", @@ -27157,14 +27278,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27179,7 +27304,7 @@ "target_label": "TY2026-27 ird taxable income people by band $28,001 - $29,000 (parked)" }, "filter": "taxable_income_band_row_38_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_39", @@ -27209,14 +27334,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27231,7 +27360,7 @@ "target_label": "TY2026-27 ird taxable income people by band $29,001 - $30,000 (parked)" }, "filter": "taxable_income_band_row_39_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_40", @@ -27261,14 +27390,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27283,7 +27416,7 @@ "target_label": "TY2026-27 ird taxable income people by band $30,001 - $31,000 (parked)" }, "filter": "taxable_income_band_row_40_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_41", @@ -27313,14 +27446,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27335,7 +27472,7 @@ "target_label": "TY2026-27 ird taxable income people by band $31,001 - $32,000 (parked)" }, "filter": "taxable_income_band_row_41_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_42", @@ -27365,14 +27502,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27387,7 +27528,7 @@ "target_label": "TY2026-27 ird taxable income people by band $32,001 - $33,000 (parked)" }, "filter": "taxable_income_band_row_42_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_43", @@ -27417,14 +27558,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27439,7 +27584,7 @@ "target_label": "TY2026-27 ird taxable income people by band $33,001 - $34,000 (parked)" }, "filter": "taxable_income_band_row_43_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_44", @@ -27469,14 +27614,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27491,7 +27640,7 @@ "target_label": "TY2026-27 ird taxable income people by band $34,001 - $35,000 (parked)" }, "filter": "taxable_income_band_row_44_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_45", @@ -27521,14 +27670,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27543,7 +27696,7 @@ "target_label": "TY2026-27 ird taxable income people by band $35,001 - $36,000 (parked)" }, "filter": "taxable_income_band_row_45_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_46", @@ -27573,14 +27726,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27595,7 +27752,7 @@ "target_label": "TY2026-27 ird taxable income people by band $36,001 - $37,000 (parked)" }, "filter": "taxable_income_band_row_46_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_47", @@ -27625,14 +27782,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27647,7 +27808,7 @@ "target_label": "TY2026-27 ird taxable income people by band $37,001 - $38,000 (parked)" }, "filter": "taxable_income_band_row_47_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_48", @@ -27677,14 +27838,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27699,7 +27864,7 @@ "target_label": "TY2026-27 ird taxable income people by band $38,001 - $39,000 (parked)" }, "filter": "taxable_income_band_row_48_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_49", @@ -27729,14 +27894,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27751,7 +27920,7 @@ "target_label": "TY2026-27 ird taxable income people by band $39,001 - $40,000 (parked)" }, "filter": "taxable_income_band_row_49_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_50", @@ -27781,14 +27950,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27803,7 +27976,7 @@ "target_label": "TY2026-27 ird taxable income people by band $40,001 - $41,000 (parked)" }, "filter": "taxable_income_band_row_50_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_51", @@ -27833,14 +28006,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27855,7 +28032,7 @@ "target_label": "TY2026-27 ird taxable income people by band $41,001 - $42,000 (parked)" }, "filter": "taxable_income_band_row_51_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_52", @@ -27885,14 +28062,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27907,7 +28088,7 @@ "target_label": "TY2026-27 ird taxable income people by band $42,001 - $43,000 (parked)" }, "filter": "taxable_income_band_row_52_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_53", @@ -27937,14 +28118,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -27959,7 +28144,7 @@ "target_label": "TY2026-27 ird taxable income people by band $43,001 - $44,000 (parked)" }, "filter": "taxable_income_band_row_53_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_54", @@ -27989,14 +28174,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28011,7 +28200,7 @@ "target_label": "TY2026-27 ird taxable income people by band $44,001 - $45,000 (parked)" }, "filter": "taxable_income_band_row_54_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_55", @@ -28041,14 +28230,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28063,7 +28256,7 @@ "target_label": "TY2026-27 ird taxable income people by band $45,001 - $46,000 (parked)" }, "filter": "taxable_income_band_row_55_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_56", @@ -28093,14 +28286,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28115,7 +28312,7 @@ "target_label": "TY2026-27 ird taxable income people by band $46,001 - $47,000 (parked)" }, "filter": "taxable_income_band_row_56_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_57", @@ -28145,14 +28342,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28167,7 +28368,7 @@ "target_label": "TY2026-27 ird taxable income people by band $47,001 - $48,000 (parked)" }, "filter": "taxable_income_band_row_57_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_58", @@ -28197,14 +28398,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28219,7 +28424,7 @@ "target_label": "TY2026-27 ird taxable income people by band $48,001 - $49,000 (parked)" }, "filter": "taxable_income_band_row_58_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_59", @@ -28249,14 +28454,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28271,7 +28480,7 @@ "target_label": "TY2026-27 ird taxable income people by band $49,001 - $50,000 (parked)" }, "filter": "taxable_income_band_row_59_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_60", @@ -28301,14 +28510,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28323,7 +28536,7 @@ "target_label": "TY2026-27 ird taxable income people by band $50,000 - $51,000 (parked)" }, "filter": "taxable_income_band_row_60_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_61", @@ -28353,14 +28566,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28375,7 +28592,7 @@ "target_label": "TY2026-27 ird taxable income people by band $51,001 - $52,000 (parked)" }, "filter": "taxable_income_band_row_61_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_62", @@ -28405,14 +28622,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28427,7 +28648,7 @@ "target_label": "TY2026-27 ird taxable income people by band $52,001 - $53,000 (parked)" }, "filter": "taxable_income_band_row_62_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_63", @@ -28457,14 +28678,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28479,7 +28704,7 @@ "target_label": "TY2026-27 ird taxable income people by band $53,001 - $54,000 (parked)" }, "filter": "taxable_income_band_row_63_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_64", @@ -28509,14 +28734,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28531,7 +28760,7 @@ "target_label": "TY2026-27 ird taxable income people by band $54,001 - $55,000 (parked)" }, "filter": "taxable_income_band_row_64_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_65", @@ -28561,14 +28790,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28583,7 +28816,7 @@ "target_label": "TY2026-27 ird taxable income people by band $55,001 - $56,000 (parked)" }, "filter": "taxable_income_band_row_65_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_66", @@ -28613,14 +28846,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28635,7 +28872,7 @@ "target_label": "TY2026-27 ird taxable income people by band $56,001 - $57,000 (parked)" }, "filter": "taxable_income_band_row_66_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_67", @@ -28665,14 +28902,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28687,7 +28928,7 @@ "target_label": "TY2026-27 ird taxable income people by band $57,001 - $58,000 (parked)" }, "filter": "taxable_income_band_row_67_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_68", @@ -28717,14 +28958,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28739,7 +28984,7 @@ "target_label": "TY2026-27 ird taxable income people by band $58,001 - $59,000 (parked)" }, "filter": "taxable_income_band_row_68_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_69", @@ -28769,14 +29014,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28791,7 +29040,7 @@ "target_label": "TY2026-27 ird taxable income people by band $59,001 - $60,000 (parked)" }, "filter": "taxable_income_band_row_69_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_70", @@ -28821,14 +29070,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28843,7 +29096,7 @@ "target_label": "TY2026-27 ird taxable income people by band $60,001 - $61,000 (parked)" }, "filter": "taxable_income_band_row_70_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_71", @@ -28873,14 +29126,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28895,7 +29152,7 @@ "target_label": "TY2026-27 ird taxable income people by band $61,001 - $62,000 (parked)" }, "filter": "taxable_income_band_row_71_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_72", @@ -28925,14 +29182,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28947,7 +29208,7 @@ "target_label": "TY2026-27 ird taxable income people by band $62,001 - $63,000 (parked)" }, "filter": "taxable_income_band_row_72_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_73", @@ -28977,14 +29238,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -28999,7 +29264,7 @@ "target_label": "TY2026-27 ird taxable income people by band $63,001 - $64,000 (parked)" }, "filter": "taxable_income_band_row_73_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_74", @@ -29029,14 +29294,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29051,7 +29320,7 @@ "target_label": "TY2026-27 ird taxable income people by band $64,001 - $65,000 (parked)" }, "filter": "taxable_income_band_row_74_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_75", @@ -29081,14 +29350,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29103,7 +29376,7 @@ "target_label": "TY2026-27 ird taxable income people by band $65,001 - $66,000 (parked)" }, "filter": "taxable_income_band_row_75_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_76", @@ -29133,14 +29406,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29155,7 +29432,7 @@ "target_label": "TY2026-27 ird taxable income people by band $66,001 - $67,000 (parked)" }, "filter": "taxable_income_band_row_76_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_77", @@ -29185,14 +29462,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29207,7 +29488,7 @@ "target_label": "TY2026-27 ird taxable income people by band $67,001 - $68,000 (parked)" }, "filter": "taxable_income_band_row_77_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_78", @@ -29237,14 +29518,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29259,7 +29544,7 @@ "target_label": "TY2026-27 ird taxable income people by band $68,001 - $69,000 (parked)" }, "filter": "taxable_income_band_row_78_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_79", @@ -29289,14 +29574,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29311,7 +29600,7 @@ "target_label": "TY2026-27 ird taxable income people by band $69,001 - $70,000 (parked)" }, "filter": "taxable_income_band_row_79_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_80", @@ -29341,14 +29630,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29363,7 +29656,7 @@ "target_label": "TY2026-27 ird taxable income people by band $70,001 - $71,000 (parked)" }, "filter": "taxable_income_band_row_80_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_81", @@ -29393,14 +29686,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29415,7 +29712,7 @@ "target_label": "TY2026-27 ird taxable income people by band $71,001 - $72,000 (parked)" }, "filter": "taxable_income_band_row_81_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_82", @@ -29445,14 +29742,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29467,7 +29768,7 @@ "target_label": "TY2026-27 ird taxable income people by band $72,001 - $73,000 (parked)" }, "filter": "taxable_income_band_row_82_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_83", @@ -29497,14 +29798,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29519,7 +29824,7 @@ "target_label": "TY2026-27 ird taxable income people by band $73,001 - $74,000 (parked)" }, "filter": "taxable_income_band_row_83_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_84", @@ -29549,14 +29854,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29571,7 +29880,7 @@ "target_label": "TY2026-27 ird taxable income people by band $74,001 - $75,000 (parked)" }, "filter": "taxable_income_band_row_84_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_85", @@ -29601,14 +29910,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29623,7 +29936,7 @@ "target_label": "TY2026-27 ird taxable income people by band $75,001 - $76,000 (parked)" }, "filter": "taxable_income_band_row_85_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_86", @@ -29653,14 +29966,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29675,7 +29992,7 @@ "target_label": "TY2026-27 ird taxable income people by band $76,001 - $77,000 (parked)" }, "filter": "taxable_income_band_row_86_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_87", @@ -29705,14 +30022,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29727,7 +30048,7 @@ "target_label": "TY2026-27 ird taxable income people by band $77,001 - $78,000 (parked)" }, "filter": "taxable_income_band_row_87_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_88", @@ -29757,14 +30078,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29779,7 +30104,7 @@ "target_label": "TY2026-27 ird taxable income people by band $78,001 - $79,000 (parked)" }, "filter": "taxable_income_band_row_88_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_89", @@ -29809,14 +30134,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29831,7 +30160,7 @@ "target_label": "TY2026-27 ird taxable income people by band $79,001 - $80,000 (parked)" }, "filter": "taxable_income_band_row_89_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_90", @@ -29861,14 +30190,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29883,7 +30216,7 @@ "target_label": "TY2026-27 ird taxable income people by band $80,000 - $81,000 (parked)" }, "filter": "taxable_income_band_row_90_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_91", @@ -29913,14 +30246,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29935,7 +30272,7 @@ "target_label": "TY2026-27 ird taxable income people by band $81,001 - $82,000 (parked)" }, "filter": "taxable_income_band_row_91_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_92", @@ -29965,14 +30302,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -29987,7 +30328,7 @@ "target_label": "TY2026-27 ird taxable income people by band $82,001 - $83,000 (parked)" }, "filter": "taxable_income_band_row_92_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_93", @@ -30017,14 +30358,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30039,7 +30384,7 @@ "target_label": "TY2026-27 ird taxable income people by band $83,001 - $84,000 (parked)" }, "filter": "taxable_income_band_row_93_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_94", @@ -30069,14 +30414,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30091,7 +30440,7 @@ "target_label": "TY2026-27 ird taxable income people by band $84,001 - $85,000 (parked)" }, "filter": "taxable_income_band_row_94_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_95", @@ -30121,14 +30470,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30143,7 +30496,7 @@ "target_label": "TY2026-27 ird taxable income people by band $85,001 - $86,000 (parked)" }, "filter": "taxable_income_band_row_95_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_96", @@ -30173,14 +30526,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30195,7 +30552,7 @@ "target_label": "TY2026-27 ird taxable income people by band $86,001 - $87,000 (parked)" }, "filter": "taxable_income_band_row_96_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_97", @@ -30225,14 +30582,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30247,7 +30608,7 @@ "target_label": "TY2026-27 ird taxable income people by band $87,001 - $88,000 (parked)" }, "filter": "taxable_income_band_row_97_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_98", @@ -30277,14 +30638,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30299,7 +30664,7 @@ "target_label": "TY2026-27 ird taxable income people by band $88,001 - $89,000 (parked)" }, "filter": "taxable_income_band_row_98_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_99", @@ -30329,14 +30694,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30351,7 +30720,7 @@ "target_label": "TY2026-27 ird taxable income people by band $89,001 - $90,000 (parked)" }, "filter": "taxable_income_band_row_99_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_100", @@ -30381,14 +30750,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30403,7 +30776,7 @@ "target_label": "TY2026-27 ird taxable income people by band $90,001 - $91,000 (parked)" }, "filter": "taxable_income_band_row_100_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_101", @@ -30433,14 +30806,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30455,7 +30832,7 @@ "target_label": "TY2026-27 ird taxable income people by band $91,001 - $92,000 (parked)" }, "filter": "taxable_income_band_row_101_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_102", @@ -30485,14 +30862,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30507,7 +30888,7 @@ "target_label": "TY2026-27 ird taxable income people by band $92,001 - $93,000 (parked)" }, "filter": "taxable_income_band_row_102_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_103", @@ -30537,14 +30918,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30559,7 +30944,7 @@ "target_label": "TY2026-27 ird taxable income people by band $93,001 - $94,000 (parked)" }, "filter": "taxable_income_band_row_103_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_104", @@ -30589,14 +30974,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30611,7 +31000,7 @@ "target_label": "TY2026-27 ird taxable income people by band $94,001 - $95,000 (parked)" }, "filter": "taxable_income_band_row_104_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_105", @@ -30641,14 +31030,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30663,7 +31056,7 @@ "target_label": "TY2026-27 ird taxable income people by band $95,001 - $96,000 (parked)" }, "filter": "taxable_income_band_row_105_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_106", @@ -30693,14 +31086,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30715,7 +31112,7 @@ "target_label": "TY2026-27 ird taxable income people by band $96,001 - $97,000 (parked)" }, "filter": "taxable_income_band_row_106_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_107", @@ -30745,14 +31142,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30767,7 +31168,7 @@ "target_label": "TY2026-27 ird taxable income people by band $97,001 - $98,000 (parked)" }, "filter": "taxable_income_band_row_107_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_108", @@ -30797,14 +31198,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30819,7 +31224,7 @@ "target_label": "TY2026-27 ird taxable income people by band $98,001 - $99,000 (parked)" }, "filter": "taxable_income_band_row_108_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_109", @@ -30849,14 +31254,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30871,7 +31280,7 @@ "target_label": "TY2026-27 ird taxable income people by band $99,001 - $100,000 (parked)" }, "filter": "taxable_income_band_row_109_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_110", @@ -30901,14 +31310,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30923,7 +31336,7 @@ "target_label": "TY2026-27 ird taxable income people by band $100,001 - $101,000 (parked)" }, "filter": "taxable_income_band_row_110_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_111", @@ -30953,14 +31366,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -30975,7 +31392,7 @@ "target_label": "TY2026-27 ird taxable income people by band $101,001 - $102,000 (parked)" }, "filter": "taxable_income_band_row_111_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_112", @@ -31005,14 +31422,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31027,7 +31448,7 @@ "target_label": "TY2026-27 ird taxable income people by band $102,001 - $103,000 (parked)" }, "filter": "taxable_income_band_row_112_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_113", @@ -31057,14 +31478,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31079,7 +31504,7 @@ "target_label": "TY2026-27 ird taxable income people by band $103,001 - $104,000 (parked)" }, "filter": "taxable_income_band_row_113_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_114", @@ -31109,14 +31534,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31131,7 +31560,7 @@ "target_label": "TY2026-27 ird taxable income people by band $104,001 - $105,000 (parked)" }, "filter": "taxable_income_band_row_114_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_115", @@ -31161,14 +31590,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31183,7 +31616,7 @@ "target_label": "TY2026-27 ird taxable income people by band $105,001 - $106,000 (parked)" }, "filter": "taxable_income_band_row_115_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_116", @@ -31213,14 +31646,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31235,7 +31672,7 @@ "target_label": "TY2026-27 ird taxable income people by band $106,001 - $107,000 (parked)" }, "filter": "taxable_income_band_row_116_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_117", @@ -31265,14 +31702,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31287,7 +31728,7 @@ "target_label": "TY2026-27 ird taxable income people by band $107,001 - $108,000 (parked)" }, "filter": "taxable_income_band_row_117_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_118", @@ -31317,14 +31758,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31339,7 +31784,7 @@ "target_label": "TY2026-27 ird taxable income people by band $108,001 - $109,000 (parked)" }, "filter": "taxable_income_band_row_118_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_119", @@ -31369,14 +31814,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31391,7 +31840,7 @@ "target_label": "TY2026-27 ird taxable income people by band $109,001 - $110,000 (parked)" }, "filter": "taxable_income_band_row_119_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_120", @@ -31421,14 +31870,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31443,7 +31896,7 @@ "target_label": "TY2026-27 ird taxable income people by band $110,001 - $111,000 (parked)" }, "filter": "taxable_income_band_row_120_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_121", @@ -31473,14 +31926,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31495,7 +31952,7 @@ "target_label": "TY2026-27 ird taxable income people by band $111,001 - $112,000 (parked)" }, "filter": "taxable_income_band_row_121_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_122", @@ -31525,14 +31982,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31547,7 +32008,7 @@ "target_label": "TY2026-27 ird taxable income people by band $112,001 - $113,000 (parked)" }, "filter": "taxable_income_band_row_122_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_123", @@ -31577,14 +32038,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31599,7 +32064,7 @@ "target_label": "TY2026-27 ird taxable income people by band $113,001 - $114,000 (parked)" }, "filter": "taxable_income_band_row_123_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_124", @@ -31629,14 +32094,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31651,7 +32120,7 @@ "target_label": "TY2026-27 ird taxable income people by band $114,001 - $115,000 (parked)" }, "filter": "taxable_income_band_row_124_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_125", @@ -31681,14 +32150,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31703,7 +32176,7 @@ "target_label": "TY2026-27 ird taxable income people by band $115,001 - $116,000 (parked)" }, "filter": "taxable_income_band_row_125_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_126", @@ -31733,14 +32206,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31755,7 +32232,7 @@ "target_label": "TY2026-27 ird taxable income people by band $116,001 - $117,000 (parked)" }, "filter": "taxable_income_band_row_126_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_127", @@ -31785,14 +32262,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31807,7 +32288,7 @@ "target_label": "TY2026-27 ird taxable income people by band $117,001 - $118,000 (parked)" }, "filter": "taxable_income_band_row_127_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_128", @@ -31837,14 +32318,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31859,7 +32344,7 @@ "target_label": "TY2026-27 ird taxable income people by band $118,001 - $119,000 (parked)" }, "filter": "taxable_income_band_row_128_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_129", @@ -31889,14 +32374,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31911,7 +32400,7 @@ "target_label": "TY2026-27 ird taxable income people by band $119,001 - $120,000 (parked)" }, "filter": "taxable_income_band_row_129_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_130", @@ -31941,14 +32430,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -31963,7 +32456,7 @@ "target_label": "TY2026-27 ird taxable income people by band $120,001 - $121,000 (parked)" }, "filter": "taxable_income_band_row_130_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_131", @@ -31993,14 +32486,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32015,7 +32512,7 @@ "target_label": "TY2026-27 ird taxable income people by band $121,001 - $122,000 (parked)" }, "filter": "taxable_income_band_row_131_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_132", @@ -32045,14 +32542,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32067,7 +32568,7 @@ "target_label": "TY2026-27 ird taxable income people by band $122,001 - $123,000 (parked)" }, "filter": "taxable_income_band_row_132_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_133", @@ -32097,14 +32598,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32119,7 +32624,7 @@ "target_label": "TY2026-27 ird taxable income people by band $123,001 - $124,000 (parked)" }, "filter": "taxable_income_band_row_133_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_134", @@ -32149,14 +32654,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32171,7 +32680,7 @@ "target_label": "TY2026-27 ird taxable income people by band $124,001 - $125,000 (parked)" }, "filter": "taxable_income_band_row_134_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_135", @@ -32201,14 +32710,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32223,7 +32736,7 @@ "target_label": "TY2026-27 ird taxable income people by band $125,001 - $126,000 (parked)" }, "filter": "taxable_income_band_row_135_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_136", @@ -32253,14 +32766,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32275,7 +32792,7 @@ "target_label": "TY2026-27 ird taxable income people by band $126,001 - $127,000 (parked)" }, "filter": "taxable_income_band_row_136_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_137", @@ -32305,14 +32822,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32327,7 +32848,7 @@ "target_label": "TY2026-27 ird taxable income people by band $127,001 - $128,000 (parked)" }, "filter": "taxable_income_band_row_137_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_138", @@ -32357,14 +32878,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32379,7 +32904,7 @@ "target_label": "TY2026-27 ird taxable income people by band $128,001 - $129,000 (parked)" }, "filter": "taxable_income_band_row_138_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_139", @@ -32409,14 +32934,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32431,7 +32960,7 @@ "target_label": "TY2026-27 ird taxable income people by band $129,001 - $130,000 (parked)" }, "filter": "taxable_income_band_row_139_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_140", @@ -32461,14 +32990,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32483,7 +33016,7 @@ "target_label": "TY2026-27 ird taxable income people by band $130,001 - $131,000 (parked)" }, "filter": "taxable_income_band_row_140_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_141", @@ -32513,14 +33046,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32535,7 +33072,7 @@ "target_label": "TY2026-27 ird taxable income people by band $131,001 - $132,000 (parked)" }, "filter": "taxable_income_band_row_141_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_142", @@ -32565,14 +33102,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32587,7 +33128,7 @@ "target_label": "TY2026-27 ird taxable income people by band $132,001 - $133,000 (parked)" }, "filter": "taxable_income_band_row_142_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_143", @@ -32617,14 +33158,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32639,7 +33184,7 @@ "target_label": "TY2026-27 ird taxable income people by band $133,001 - $134,000 (parked)" }, "filter": "taxable_income_band_row_143_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_144", @@ -32669,14 +33214,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32691,7 +33240,7 @@ "target_label": "TY2026-27 ird taxable income people by band $134,001 - $135,000 (parked)" }, "filter": "taxable_income_band_row_144_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_145", @@ -32721,14 +33270,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32743,7 +33296,7 @@ "target_label": "TY2026-27 ird taxable income people by band $135,001 - $136,000 (parked)" }, "filter": "taxable_income_band_row_145_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_146", @@ -32773,14 +33326,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32795,7 +33352,7 @@ "target_label": "TY2026-27 ird taxable income people by band $136,001 - $137,000 (parked)" }, "filter": "taxable_income_band_row_146_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_147", @@ -32825,14 +33382,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32847,7 +33408,7 @@ "target_label": "TY2026-27 ird taxable income people by band $137,001 - $138,000 (parked)" }, "filter": "taxable_income_band_row_147_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_148", @@ -32877,14 +33438,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32899,7 +33464,7 @@ "target_label": "TY2026-27 ird taxable income people by band $138,001 - $139,000 (parked)" }, "filter": "taxable_income_band_row_148_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_149", @@ -32929,14 +33494,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -32951,7 +33520,7 @@ "target_label": "TY2026-27 ird taxable income people by band $139,001 - $140,000 (parked)" }, "filter": "taxable_income_band_row_149_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_150", @@ -32981,14 +33550,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33003,7 +33576,7 @@ "target_label": "TY2026-27 ird taxable income people by band $140,001 - $141,000 (parked)" }, "filter": "taxable_income_band_row_150_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_151", @@ -33033,14 +33606,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33055,7 +33632,7 @@ "target_label": "TY2026-27 ird taxable income people by band $141,001 - $142,000 (parked)" }, "filter": "taxable_income_band_row_151_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_152", @@ -33085,14 +33662,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33107,7 +33688,7 @@ "target_label": "TY2026-27 ird taxable income people by band $142,001 - $143,000 (parked)" }, "filter": "taxable_income_band_row_152_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_153", @@ -33137,14 +33718,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33159,7 +33744,7 @@ "target_label": "TY2026-27 ird taxable income people by band $143,001 - $144,000 (parked)" }, "filter": "taxable_income_band_row_153_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_154", @@ -33189,14 +33774,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33211,7 +33800,7 @@ "target_label": "TY2026-27 ird taxable income people by band $144,001 - $145,000 (parked)" }, "filter": "taxable_income_band_row_154_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_155", @@ -33241,14 +33830,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33263,7 +33856,7 @@ "target_label": "TY2026-27 ird taxable income people by band $145,001 - $146,000 (parked)" }, "filter": "taxable_income_band_row_155_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_156", @@ -33293,14 +33886,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33315,7 +33912,7 @@ "target_label": "TY2026-27 ird taxable income people by band $146,001 - $147,000 (parked)" }, "filter": "taxable_income_band_row_156_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_157", @@ -33345,14 +33942,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33367,7 +33968,7 @@ "target_label": "TY2026-27 ird taxable income people by band $147,001 - $148,000 (parked)" }, "filter": "taxable_income_band_row_157_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_158", @@ -33397,14 +33998,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33419,7 +34024,7 @@ "target_label": "TY2026-27 ird taxable income people by band $148,001 - $149,000 (parked)" }, "filter": "taxable_income_band_row_158_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_159", @@ -33449,14 +34054,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33471,7 +34080,7 @@ "target_label": "TY2026-27 ird taxable income people by band $149,001 - $150,000 (parked)" }, "filter": "taxable_income_band_row_159_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_160", @@ -33501,14 +34110,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33523,7 +34136,7 @@ "target_label": "TY2026-27 ird taxable income people by band $150,001 - $151,000 (parked)" }, "filter": "taxable_income_band_row_160_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_161", @@ -33553,14 +34166,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33575,7 +34192,7 @@ "target_label": "TY2026-27 ird taxable income people by band $151,001 - $152,000 (parked)" }, "filter": "taxable_income_band_row_161_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_162", @@ -33605,14 +34222,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33627,7 +34248,7 @@ "target_label": "TY2026-27 ird taxable income people by band $152,001 - $153,000 (parked)" }, "filter": "taxable_income_band_row_162_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_163", @@ -33657,14 +34278,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33679,7 +34304,7 @@ "target_label": "TY2026-27 ird taxable income people by band $153,001 - $154,000 (parked)" }, "filter": "taxable_income_band_row_163_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_164", @@ -33709,14 +34334,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33731,7 +34360,7 @@ "target_label": "TY2026-27 ird taxable income people by band $154,001 - $155,000 (parked)" }, "filter": "taxable_income_band_row_164_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_165", @@ -33761,14 +34390,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33783,7 +34416,7 @@ "target_label": "TY2026-27 ird taxable income people by band $155,001 - $156,000 (parked)" }, "filter": "taxable_income_band_row_165_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_166", @@ -33813,14 +34446,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33835,7 +34472,7 @@ "target_label": "TY2026-27 ird taxable income people by band $156,001 - $157,000 (parked)" }, "filter": "taxable_income_band_row_166_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_167", @@ -33865,14 +34502,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33887,7 +34528,7 @@ "target_label": "TY2026-27 ird taxable income people by band $157,001 - $158,000 (parked)" }, "filter": "taxable_income_band_row_167_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_168", @@ -33917,14 +34558,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33939,7 +34584,7 @@ "target_label": "TY2026-27 ird taxable income people by band $158,001 - $159,000 (parked)" }, "filter": "taxable_income_band_row_168_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_169", @@ -33969,14 +34614,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -33991,7 +34640,7 @@ "target_label": "TY2026-27 ird taxable income people by band $159,001 - $160,000 (parked)" }, "filter": "taxable_income_band_row_169_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_170", @@ -34021,14 +34670,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34043,7 +34696,7 @@ "target_label": "TY2026-27 ird taxable income people by band $160,001 - $161,000 (parked)" }, "filter": "taxable_income_band_row_170_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_171", @@ -34073,14 +34726,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34095,7 +34752,7 @@ "target_label": "TY2026-27 ird taxable income people by band $161,001 - $162,000 (parked)" }, "filter": "taxable_income_band_row_171_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_172", @@ -34125,14 +34782,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34147,7 +34808,7 @@ "target_label": "TY2026-27 ird taxable income people by band $162,001 - $163,000 (parked)" }, "filter": "taxable_income_band_row_172_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_173", @@ -34177,14 +34838,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34199,7 +34864,7 @@ "target_label": "TY2026-27 ird taxable income people by band $163,001 - $164,000 (parked)" }, "filter": "taxable_income_band_row_173_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_174", @@ -34229,14 +34894,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34251,7 +34920,7 @@ "target_label": "TY2026-27 ird taxable income people by band $164,001 - $165,000 (parked)" }, "filter": "taxable_income_band_row_174_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_175", @@ -34281,14 +34950,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34303,7 +34976,7 @@ "target_label": "TY2026-27 ird taxable income people by band $165,001 - $166,000 (parked)" }, "filter": "taxable_income_band_row_175_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_176", @@ -34333,14 +35006,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34355,7 +35032,7 @@ "target_label": "TY2026-27 ird taxable income people by band $166,001 - $167,000 (parked)" }, "filter": "taxable_income_band_row_176_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_177", @@ -34385,14 +35062,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34407,7 +35088,7 @@ "target_label": "TY2026-27 ird taxable income people by band $167,001 - $168,000 (parked)" }, "filter": "taxable_income_band_row_177_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_178", @@ -34437,14 +35118,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34459,7 +35144,7 @@ "target_label": "TY2026-27 ird taxable income people by band $168,001 - $169,000 (parked)" }, "filter": "taxable_income_band_row_178_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_179", @@ -34489,14 +35174,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34511,7 +35200,7 @@ "target_label": "TY2026-27 ird taxable income people by band $169,001 - $170,000 (parked)" }, "filter": "taxable_income_band_row_179_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_180", @@ -34541,14 +35230,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34563,7 +35256,7 @@ "target_label": "TY2026-27 ird taxable income people by band $170,001 - $171,000 (parked)" }, "filter": "taxable_income_band_row_180_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_181", @@ -34593,14 +35286,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34615,7 +35312,7 @@ "target_label": "TY2026-27 ird taxable income people by band $171,001 - $172,000 (parked)" }, "filter": "taxable_income_band_row_181_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_182", @@ -34645,14 +35342,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34667,7 +35368,7 @@ "target_label": "TY2026-27 ird taxable income people by band $172,001 - $173,000 (parked)" }, "filter": "taxable_income_band_row_182_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_183", @@ -34697,14 +35398,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34719,7 +35424,7 @@ "target_label": "TY2026-27 ird taxable income people by band $173,001 - $174,000 (parked)" }, "filter": "taxable_income_band_row_183_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_184", @@ -34749,14 +35454,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34771,7 +35480,7 @@ "target_label": "TY2026-27 ird taxable income people by band $174,001 - $175,000 (parked)" }, "filter": "taxable_income_band_row_184_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_185", @@ -34801,14 +35510,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34823,7 +35536,7 @@ "target_label": "TY2026-27 ird taxable income people by band $175,001 - $176,000 (parked)" }, "filter": "taxable_income_band_row_185_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_186", @@ -34853,14 +35566,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34875,7 +35592,7 @@ "target_label": "TY2026-27 ird taxable income people by band $176,001 - $177,000 (parked)" }, "filter": "taxable_income_band_row_186_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_187", @@ -34905,14 +35622,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34927,7 +35648,7 @@ "target_label": "TY2026-27 ird taxable income people by band $177,001 - $178,000 (parked)" }, "filter": "taxable_income_band_row_187_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_188", @@ -34957,14 +35678,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -34979,7 +35704,7 @@ "target_label": "TY2026-27 ird taxable income people by band $178,001 - $179,000 (parked)" }, "filter": "taxable_income_band_row_188_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_189", @@ -35009,14 +35734,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35031,7 +35760,7 @@ "target_label": "TY2026-27 ird taxable income people by band $179,001 - $180,000 (parked)" }, "filter": "taxable_income_band_row_189_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_190", @@ -35061,14 +35790,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35083,7 +35816,7 @@ "target_label": "TY2026-27 ird taxable income people by band $180,001 - $181,000 (parked)" }, "filter": "taxable_income_band_row_190_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_191", @@ -35113,14 +35846,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35135,7 +35872,7 @@ "target_label": "TY2026-27 ird taxable income people by band $181,001 - $182,000 (parked)" }, "filter": "taxable_income_band_row_191_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_192", @@ -35165,14 +35902,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35187,7 +35928,7 @@ "target_label": "TY2026-27 ird taxable income people by band $182,001 - $183,000 (parked)" }, "filter": "taxable_income_band_row_192_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_193", @@ -35217,14 +35958,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35239,7 +35984,7 @@ "target_label": "TY2026-27 ird taxable income people by band $183,001 - $184,000 (parked)" }, "filter": "taxable_income_band_row_193_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_194", @@ -35269,14 +36014,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35291,7 +36040,7 @@ "target_label": "TY2026-27 ird taxable income people by band $184,001 - $185,000 (parked)" }, "filter": "taxable_income_band_row_194_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_195", @@ -35321,14 +36070,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35343,7 +36096,7 @@ "target_label": "TY2026-27 ird taxable income people by band $185,001 - $186,000 (parked)" }, "filter": "taxable_income_band_row_195_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_196", @@ -35373,14 +36126,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35395,7 +36152,7 @@ "target_label": "TY2026-27 ird taxable income people by band $186,001 - $187,000 (parked)" }, "filter": "taxable_income_band_row_196_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_197", @@ -35425,14 +36182,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35447,7 +36208,7 @@ "target_label": "TY2026-27 ird taxable income people by band $187,001 - $188,000 (parked)" }, "filter": "taxable_income_band_row_197_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_198", @@ -35477,14 +36238,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35499,7 +36264,7 @@ "target_label": "TY2026-27 ird taxable income people by band $188,001 - $189,000 (parked)" }, "filter": "taxable_income_band_row_198_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_199", @@ -35529,14 +36294,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35551,7 +36320,7 @@ "target_label": "TY2026-27 ird taxable income people by band $189,001 - $190,000 (parked)" }, "filter": "taxable_income_band_row_199_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_200", @@ -35581,14 +36350,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35603,7 +36376,7 @@ "target_label": "TY2026-27 ird taxable income people by band $190,001 - $191,000 (parked)" }, "filter": "taxable_income_band_row_200_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_201", @@ -35633,14 +36406,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35655,7 +36432,7 @@ "target_label": "TY2026-27 ird taxable income people by band $191,001 - $192,000 (parked)" }, "filter": "taxable_income_band_row_201_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_202", @@ -35685,14 +36462,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35707,7 +36488,7 @@ "target_label": "TY2026-27 ird taxable income people by band $192,001 - $193,000 (parked)" }, "filter": "taxable_income_band_row_202_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_203", @@ -35737,14 +36518,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35759,7 +36544,7 @@ "target_label": "TY2026-27 ird taxable income people by band $193,001 - $194,000 (parked)" }, "filter": "taxable_income_band_row_203_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_204", @@ -35789,14 +36574,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35811,7 +36600,7 @@ "target_label": "TY2026-27 ird taxable income people by band $194,001 - $195,000 (parked)" }, "filter": "taxable_income_band_row_204_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_205", @@ -35841,14 +36630,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35863,7 +36656,7 @@ "target_label": "TY2026-27 ird taxable income people by band $195,001 - $196,000 (parked)" }, "filter": "taxable_income_band_row_205_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_206", @@ -35893,14 +36686,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35915,7 +36712,7 @@ "target_label": "TY2026-27 ird taxable income people by band $196,001 - $197,000 (parked)" }, "filter": "taxable_income_band_row_206_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_207", @@ -35945,14 +36742,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -35967,7 +36768,7 @@ "target_label": "TY2026-27 ird taxable income people by band $197,001 - $198,000 (parked)" }, "filter": "taxable_income_band_row_207_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_208", @@ -35997,14 +36798,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36019,7 +36824,7 @@ "target_label": "TY2026-27 ird taxable income people by band $198,001 - $199,000 (parked)" }, "filter": "taxable_income_band_row_208_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_209", @@ -36049,14 +36854,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36071,7 +36880,7 @@ "target_label": "TY2026-27 ird taxable income people by band $199,001 - $200,000 (parked)" }, "filter": "taxable_income_band_row_209_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_210", @@ -36101,14 +36910,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36123,7 +36936,7 @@ "target_label": "TY2026-27 ird taxable income people by band $200,001 - $205,000 (parked)" }, "filter": "taxable_income_band_row_210_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_211", @@ -36153,14 +36966,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36175,7 +36992,7 @@ "target_label": "TY2026-27 ird taxable income people by band $205,001 - $210,000 (parked)" }, "filter": "taxable_income_band_row_211_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_212", @@ -36205,14 +37022,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36227,7 +37048,7 @@ "target_label": "TY2026-27 ird taxable income people by band $210,001 - $215,000 (parked)" }, "filter": "taxable_income_band_row_212_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_213", @@ -36257,14 +37078,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36279,7 +37104,7 @@ "target_label": "TY2026-27 ird taxable income people by band $215,001 - $220,000 (parked)" }, "filter": "taxable_income_band_row_213_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_214", @@ -36309,14 +37134,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36331,7 +37160,7 @@ "target_label": "TY2026-27 ird taxable income people by band $220,001 - $225,000 (parked)" }, "filter": "taxable_income_band_row_214_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_215", @@ -36361,14 +37190,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36383,7 +37216,7 @@ "target_label": "TY2026-27 ird taxable income people by band $225,001 - $230,000 (parked)" }, "filter": "taxable_income_band_row_215_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_216", @@ -36413,14 +37246,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36435,7 +37272,7 @@ "target_label": "TY2026-27 ird taxable income people by band $230,001 - $235,000 (parked)" }, "filter": "taxable_income_band_row_216_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_217", @@ -36465,14 +37302,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36487,7 +37328,7 @@ "target_label": "TY2026-27 ird taxable income people by band $235,001 - $240,000 (parked)" }, "filter": "taxable_income_band_row_217_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_218", @@ -36517,14 +37358,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36539,7 +37384,7 @@ "target_label": "TY2026-27 ird taxable income people by band $240,001 - $245,000 (parked)" }, "filter": "taxable_income_band_row_218_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_219", @@ -36569,14 +37414,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36591,7 +37440,7 @@ "target_label": "TY2026-27 ird taxable income people by band $245,001 - $250,000 (parked)" }, "filter": "taxable_income_band_row_219_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_220", @@ -36621,14 +37470,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36643,7 +37496,7 @@ "target_label": "TY2026-27 ird taxable income people by band $250,001 - $255,000 (parked)" }, "filter": "taxable_income_band_row_220_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_221", @@ -36673,14 +37526,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36695,7 +37552,7 @@ "target_label": "TY2026-27 ird taxable income people by band $255,001 - $260,000 (parked)" }, "filter": "taxable_income_band_row_221_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_222", @@ -36725,14 +37582,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36747,7 +37608,7 @@ "target_label": "TY2026-27 ird taxable income people by band $260,001 - $265,000 (parked)" }, "filter": "taxable_income_band_row_222_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_223", @@ -36777,14 +37638,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36799,7 +37664,7 @@ "target_label": "TY2026-27 ird taxable income people by band $265,001 - $270,000 (parked)" }, "filter": "taxable_income_band_row_223_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_224", @@ -36829,14 +37694,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36851,7 +37720,7 @@ "target_label": "TY2026-27 ird taxable income people by band $270,001 - $275,000 (parked)" }, "filter": "taxable_income_band_row_224_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_225", @@ -36881,14 +37750,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36903,7 +37776,7 @@ "target_label": "TY2026-27 ird taxable income people by band $275,001 - $280,000 (parked)" }, "filter": "taxable_income_band_row_225_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_226", @@ -36933,14 +37806,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -36955,7 +37832,7 @@ "target_label": "TY2026-27 ird taxable income people by band $280,001 - $285,000 (parked)" }, "filter": "taxable_income_band_row_226_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_227", @@ -36985,14 +37862,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37007,7 +37888,7 @@ "target_label": "TY2026-27 ird taxable income people by band $285,001 - $290,000 (parked)" }, "filter": "taxable_income_band_row_227_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_228", @@ -37037,14 +37918,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37059,7 +37944,7 @@ "target_label": "TY2026-27 ird taxable income people by band $290,001 - $295,000 (parked)" }, "filter": "taxable_income_band_row_228_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_229", @@ -37089,14 +37974,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37111,7 +38000,7 @@ "target_label": "TY2026-27 ird taxable income people by band $295,001 - $300,000 (parked)" }, "filter": "taxable_income_band_row_229_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_230", @@ -37141,14 +38030,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37163,7 +38056,7 @@ "target_label": "TY2026-27 ird taxable income people by band $300,000 - $350,000 (parked)" }, "filter": "taxable_income_band_row_230_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_231", @@ -37193,14 +38086,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37215,7 +38112,7 @@ "target_label": "TY2026-27 ird taxable income people by band $350,001 - $400,000 (parked)" }, "filter": "taxable_income_band_row_231_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_232", @@ -37245,14 +38142,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37267,7 +38168,7 @@ "target_label": "TY2026-27 ird taxable income people by band $400,001 - $450,000 (parked)" }, "filter": "taxable_income_band_row_232_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_233", @@ -37297,14 +38198,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37319,7 +38224,7 @@ "target_label": "TY2026-27 ird taxable income people by band $450,001 - $500,000 (parked)" }, "filter": "taxable_income_band_row_233_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_234", @@ -37349,14 +38254,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37371,7 +38280,7 @@ "target_label": "TY2026-27 ird taxable income people by band $500,001 - $550,000 (parked)" }, "filter": "taxable_income_band_row_234_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_235", @@ -37401,14 +38310,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37423,7 +38336,7 @@ "target_label": "TY2026-27 ird taxable income people by band $550,001 - $600,000 (parked)" }, "filter": "taxable_income_band_row_235_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_236", @@ -37453,14 +38366,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37475,7 +38392,7 @@ "target_label": "TY2026-27 ird taxable income people by band $600,001 - $650,000 (parked)" }, "filter": "taxable_income_band_row_236_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_237", @@ -37505,14 +38422,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37527,7 +38448,7 @@ "target_label": "TY2026-27 ird taxable income people by band $650,001 - $700,000 (parked)" }, "filter": "taxable_income_band_row_237_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_238", @@ -37557,14 +38478,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37579,7 +38504,7 @@ "target_label": "TY2026-27 ird taxable income people by band $700,001 - $750,000 (parked)" }, "filter": "taxable_income_band_row_238_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_239", @@ -37609,14 +38534,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37631,7 +38560,7 @@ "target_label": "TY2026-27 ird taxable income people by band $750,001 - $800,000 (parked)" }, "filter": "taxable_income_band_row_239_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_240", @@ -37661,14 +38590,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37683,7 +38616,7 @@ "target_label": "TY2026-27 ird taxable income people by band $800,001 - $850,000 (parked)" }, "filter": "taxable_income_band_row_240_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_241", @@ -37713,14 +38646,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37735,7 +38672,7 @@ "target_label": "TY2026-27 ird taxable income people by band $850,001 - $900,000 (parked)" }, "filter": "taxable_income_band_row_241_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_242", @@ -37765,14 +38702,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37787,7 +38728,7 @@ "target_label": "TY2026-27 ird taxable income people by band $900,001 - $950,000 (parked)" }, "filter": "taxable_income_band_row_242_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_243", @@ -37817,14 +38758,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37839,7 +38784,7 @@ "target_label": "TY2026-27 ird taxable income people by band $950,001 - $1,000,000 (parked)" }, "filter": "taxable_income_band_row_243_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_people_by_band__row_244", @@ -37869,14 +38814,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_people_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "count" }, "hierarchy": { "provider": { @@ -37891,7 +38840,7 @@ "target_label": "TY2026-27 ird taxable income people by band Over $1,000,000 (parked)" }, "filter": "taxable_income_band_row_244_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_8", @@ -37921,14 +38870,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -37943,7 +38896,7 @@ "target_label": "TY2026-27 ird taxable income total by band nil (parked)" }, "filter": "taxable_income_band_row_8_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_9", @@ -37973,14 +38926,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -37995,7 +38952,7 @@ "target_label": "TY2026-27 ird taxable income total by band $0.01 - $100 (parked)" }, "filter": "taxable_income_band_row_9_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_10", @@ -38025,14 +38982,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38047,7 +39008,7 @@ "target_label": "TY2026-27 ird taxable income total by band $101 - $1,000 (parked)" }, "filter": "taxable_income_band_row_10_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_11", @@ -38077,14 +39038,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38099,7 +39064,7 @@ "target_label": "TY2026-27 ird taxable income total by band $1,001 - $2,000 (parked)" }, "filter": "taxable_income_band_row_11_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_12", @@ -38129,14 +39094,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38151,7 +39120,7 @@ "target_label": "TY2026-27 ird taxable income total by band $2,001 - $3,000 (parked)" }, "filter": "taxable_income_band_row_12_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_13", @@ -38181,14 +39150,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38203,7 +39176,7 @@ "target_label": "TY2026-27 ird taxable income total by band $3,001 - $4,000 (parked)" }, "filter": "taxable_income_band_row_13_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_14", @@ -38233,14 +39206,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38255,7 +39232,7 @@ "target_label": "TY2026-27 ird taxable income total by band $4,001 - $5,000 (parked)" }, "filter": "taxable_income_band_row_14_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_15", @@ -38285,14 +39262,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38307,7 +39288,7 @@ "target_label": "TY2026-27 ird taxable income total by band $5,001 - $6,000 (parked)" }, "filter": "taxable_income_band_row_15_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_16", @@ -38337,14 +39318,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38359,7 +39344,7 @@ "target_label": "TY2026-27 ird taxable income total by band $6,001 - $7,000 (parked)" }, "filter": "taxable_income_band_row_16_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_17", @@ -38389,14 +39374,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38411,7 +39400,7 @@ "target_label": "TY2026-27 ird taxable income total by band $7,001 - $8,000 (parked)" }, "filter": "taxable_income_band_row_17_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_18", @@ -38441,14 +39430,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38463,7 +39456,7 @@ "target_label": "TY2026-27 ird taxable income total by band $8,001 - $9,000 (parked)" }, "filter": "taxable_income_band_row_18_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_19", @@ -38493,14 +39486,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38515,7 +39512,7 @@ "target_label": "TY2026-27 ird taxable income total by band $9,001 - $10,000 (parked)" }, "filter": "taxable_income_band_row_19_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_20", @@ -38545,14 +39542,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38567,7 +39568,7 @@ "target_label": "TY2026-27 ird taxable income total by band $10,001 - $11,000 (parked)" }, "filter": "taxable_income_band_row_20_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_21", @@ -38597,14 +39598,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38619,7 +39624,7 @@ "target_label": "TY2026-27 ird taxable income total by band $11,001 - $12,000 (parked)" }, "filter": "taxable_income_band_row_21_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_22", @@ -38649,14 +39654,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38671,7 +39680,7 @@ "target_label": "TY2026-27 ird taxable income total by band $12,001 - $13,000 (parked)" }, "filter": "taxable_income_band_row_22_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_23", @@ -38701,14 +39710,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38723,7 +39736,7 @@ "target_label": "TY2026-27 ird taxable income total by band $13,001 - $14,000 (parked)" }, "filter": "taxable_income_band_row_23_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_24", @@ -38753,14 +39766,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38775,7 +39792,7 @@ "target_label": "TY2026-27 ird taxable income total by band $14,001 - $15,000 (parked)" }, "filter": "taxable_income_band_row_24_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_25", @@ -38805,14 +39822,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38827,7 +39848,7 @@ "target_label": "TY2026-27 ird taxable income total by band $15,001 - $16,000 (parked)" }, "filter": "taxable_income_band_row_25_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_26", @@ -38857,14 +39878,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38879,7 +39904,7 @@ "target_label": "TY2026-27 ird taxable income total by band $16,001 - $17,000 (parked)" }, "filter": "taxable_income_band_row_26_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_27", @@ -38909,14 +39934,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38931,7 +39960,7 @@ "target_label": "TY2026-27 ird taxable income total by band $17,001 - $18,000 (parked)" }, "filter": "taxable_income_band_row_27_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_28", @@ -38961,14 +39990,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -38983,7 +40016,7 @@ "target_label": "TY2026-27 ird taxable income total by band $18,001 - $19,000 (parked)" }, "filter": "taxable_income_band_row_28_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_29", @@ -39013,14 +40046,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39035,7 +40072,7 @@ "target_label": "TY2026-27 ird taxable income total by band $19,001 - $20,000 (parked)" }, "filter": "taxable_income_band_row_29_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_30", @@ -39065,14 +40102,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39087,7 +40128,7 @@ "target_label": "TY2026-27 ird taxable income total by band $20,000 - $21,000 (parked)" }, "filter": "taxable_income_band_row_30_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_31", @@ -39117,14 +40158,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39139,7 +40184,7 @@ "target_label": "TY2026-27 ird taxable income total by band $21,001 - $22,000 (parked)" }, "filter": "taxable_income_band_row_31_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_32", @@ -39169,14 +40214,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39191,7 +40240,7 @@ "target_label": "TY2026-27 ird taxable income total by band $22,001 - $23,000 (parked)" }, "filter": "taxable_income_band_row_32_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_33", @@ -39221,14 +40270,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39243,7 +40296,7 @@ "target_label": "TY2026-27 ird taxable income total by band $23,001 - $24,000 (parked)" }, "filter": "taxable_income_band_row_33_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_34", @@ -39273,14 +40326,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39295,7 +40352,7 @@ "target_label": "TY2026-27 ird taxable income total by band $24,001 - $25,000 (parked)" }, "filter": "taxable_income_band_row_34_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_35", @@ -39325,14 +40382,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39347,7 +40408,7 @@ "target_label": "TY2026-27 ird taxable income total by band $25,001 - $26,000 (parked)" }, "filter": "taxable_income_band_row_35_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_36", @@ -39377,14 +40438,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39399,7 +40464,7 @@ "target_label": "TY2026-27 ird taxable income total by band $26,001 - $27,000 (parked)" }, "filter": "taxable_income_band_row_36_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_37", @@ -39429,14 +40494,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39451,7 +40520,7 @@ "target_label": "TY2026-27 ird taxable income total by band $27,001 - $28,000 (parked)" }, "filter": "taxable_income_band_row_37_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_38", @@ -39481,14 +40550,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39503,7 +40576,7 @@ "target_label": "TY2026-27 ird taxable income total by band $28,001 - $29,000 (parked)" }, "filter": "taxable_income_band_row_38_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_39", @@ -39533,14 +40606,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39555,7 +40632,7 @@ "target_label": "TY2026-27 ird taxable income total by band $29,001 - $30,000 (parked)" }, "filter": "taxable_income_band_row_39_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_40", @@ -39585,14 +40662,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39607,7 +40688,7 @@ "target_label": "TY2026-27 ird taxable income total by band $30,001 - $31,000 (parked)" }, "filter": "taxable_income_band_row_40_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_41", @@ -39637,14 +40718,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39659,7 +40744,7 @@ "target_label": "TY2026-27 ird taxable income total by band $31,001 - $32,000 (parked)" }, "filter": "taxable_income_band_row_41_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_42", @@ -39689,14 +40774,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39711,7 +40800,7 @@ "target_label": "TY2026-27 ird taxable income total by band $32,001 - $33,000 (parked)" }, "filter": "taxable_income_band_row_42_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_43", @@ -39741,14 +40830,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39763,7 +40856,7 @@ "target_label": "TY2026-27 ird taxable income total by band $33,001 - $34,000 (parked)" }, "filter": "taxable_income_band_row_43_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_44", @@ -39793,14 +40886,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39815,7 +40912,7 @@ "target_label": "TY2026-27 ird taxable income total by band $34,001 - $35,000 (parked)" }, "filter": "taxable_income_band_row_44_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_45", @@ -39845,14 +40942,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39867,7 +40968,7 @@ "target_label": "TY2026-27 ird taxable income total by band $35,001 - $36,000 (parked)" }, "filter": "taxable_income_band_row_45_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_46", @@ -39897,14 +40998,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39919,7 +41024,7 @@ "target_label": "TY2026-27 ird taxable income total by band $36,001 - $37,000 (parked)" }, "filter": "taxable_income_band_row_46_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_47", @@ -39949,14 +41054,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -39971,7 +41080,7 @@ "target_label": "TY2026-27 ird taxable income total by band $37,001 - $38,000 (parked)" }, "filter": "taxable_income_band_row_47_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_48", @@ -40001,14 +41110,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40023,7 +41136,7 @@ "target_label": "TY2026-27 ird taxable income total by band $38,001 - $39,000 (parked)" }, "filter": "taxable_income_band_row_48_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_49", @@ -40053,14 +41166,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40075,7 +41192,7 @@ "target_label": "TY2026-27 ird taxable income total by band $39,001 - $40,000 (parked)" }, "filter": "taxable_income_band_row_49_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_50", @@ -40105,14 +41222,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40127,7 +41248,7 @@ "target_label": "TY2026-27 ird taxable income total by band $40,001 - $41,000 (parked)" }, "filter": "taxable_income_band_row_50_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_51", @@ -40157,14 +41278,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40179,7 +41304,7 @@ "target_label": "TY2026-27 ird taxable income total by band $41,001 - $42,000 (parked)" }, "filter": "taxable_income_band_row_51_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_52", @@ -40209,14 +41334,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40231,7 +41360,7 @@ "target_label": "TY2026-27 ird taxable income total by band $42,001 - $43,000 (parked)" }, "filter": "taxable_income_band_row_52_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_53", @@ -40261,14 +41390,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40283,7 +41416,7 @@ "target_label": "TY2026-27 ird taxable income total by band $43,001 - $44,000 (parked)" }, "filter": "taxable_income_band_row_53_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_54", @@ -40313,14 +41446,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40335,7 +41472,7 @@ "target_label": "TY2026-27 ird taxable income total by band $44,001 - $45,000 (parked)" }, "filter": "taxable_income_band_row_54_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_55", @@ -40365,14 +41502,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40387,7 +41528,7 @@ "target_label": "TY2026-27 ird taxable income total by band $45,001 - $46,000 (parked)" }, "filter": "taxable_income_band_row_55_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_56", @@ -40417,14 +41558,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40439,7 +41584,7 @@ "target_label": "TY2026-27 ird taxable income total by band $46,001 - $47,000 (parked)" }, "filter": "taxable_income_band_row_56_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_57", @@ -40469,14 +41614,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40491,7 +41640,7 @@ "target_label": "TY2026-27 ird taxable income total by band $47,001 - $48,000 (parked)" }, "filter": "taxable_income_band_row_57_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_58", @@ -40521,14 +41670,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40543,7 +41696,7 @@ "target_label": "TY2026-27 ird taxable income total by band $48,001 - $49,000 (parked)" }, "filter": "taxable_income_band_row_58_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_59", @@ -40573,14 +41726,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40595,7 +41752,7 @@ "target_label": "TY2026-27 ird taxable income total by band $49,001 - $50,000 (parked)" }, "filter": "taxable_income_band_row_59_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_60", @@ -40625,14 +41782,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40647,7 +41808,7 @@ "target_label": "TY2026-27 ird taxable income total by band $50,000 - $51,000 (parked)" }, "filter": "taxable_income_band_row_60_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_61", @@ -40677,14 +41838,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40699,7 +41864,7 @@ "target_label": "TY2026-27 ird taxable income total by band $51,001 - $52,000 (parked)" }, "filter": "taxable_income_band_row_61_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_62", @@ -40729,14 +41894,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40751,7 +41920,7 @@ "target_label": "TY2026-27 ird taxable income total by band $52,001 - $53,000 (parked)" }, "filter": "taxable_income_band_row_62_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_63", @@ -40781,14 +41950,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40803,7 +41976,7 @@ "target_label": "TY2026-27 ird taxable income total by band $53,001 - $54,000 (parked)" }, "filter": "taxable_income_band_row_63_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_64", @@ -40833,14 +42006,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40855,7 +42032,7 @@ "target_label": "TY2026-27 ird taxable income total by band $54,001 - $55,000 (parked)" }, "filter": "taxable_income_band_row_64_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_65", @@ -40885,14 +42062,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40907,7 +42088,7 @@ "target_label": "TY2026-27 ird taxable income total by band $55,001 - $56,000 (parked)" }, "filter": "taxable_income_band_row_65_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_66", @@ -40937,14 +42118,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -40959,7 +42144,7 @@ "target_label": "TY2026-27 ird taxable income total by band $56,001 - $57,000 (parked)" }, "filter": "taxable_income_band_row_66_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_67", @@ -40989,14 +42174,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41011,7 +42200,7 @@ "target_label": "TY2026-27 ird taxable income total by band $57,001 - $58,000 (parked)" }, "filter": "taxable_income_band_row_67_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_68", @@ -41041,14 +42230,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41063,7 +42256,7 @@ "target_label": "TY2026-27 ird taxable income total by band $58,001 - $59,000 (parked)" }, "filter": "taxable_income_band_row_68_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_69", @@ -41093,14 +42286,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41115,7 +42312,7 @@ "target_label": "TY2026-27 ird taxable income total by band $59,001 - $60,000 (parked)" }, "filter": "taxable_income_band_row_69_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_70", @@ -41145,14 +42342,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41167,7 +42368,7 @@ "target_label": "TY2026-27 ird taxable income total by band $60,001 - $61,000 (parked)" }, "filter": "taxable_income_band_row_70_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_71", @@ -41197,14 +42398,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41219,7 +42424,7 @@ "target_label": "TY2026-27 ird taxable income total by band $61,001 - $62,000 (parked)" }, "filter": "taxable_income_band_row_71_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_72", @@ -41249,14 +42454,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41271,7 +42480,7 @@ "target_label": "TY2026-27 ird taxable income total by band $62,001 - $63,000 (parked)" }, "filter": "taxable_income_band_row_72_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_73", @@ -41301,14 +42510,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41323,7 +42536,7 @@ "target_label": "TY2026-27 ird taxable income total by band $63,001 - $64,000 (parked)" }, "filter": "taxable_income_band_row_73_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_74", @@ -41353,14 +42566,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41375,7 +42592,7 @@ "target_label": "TY2026-27 ird taxable income total by band $64,001 - $65,000 (parked)" }, "filter": "taxable_income_band_row_74_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_75", @@ -41405,14 +42622,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41427,7 +42648,7 @@ "target_label": "TY2026-27 ird taxable income total by band $65,001 - $66,000 (parked)" }, "filter": "taxable_income_band_row_75_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_76", @@ -41457,14 +42678,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41479,7 +42704,7 @@ "target_label": "TY2026-27 ird taxable income total by band $66,001 - $67,000 (parked)" }, "filter": "taxable_income_band_row_76_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_77", @@ -41509,14 +42734,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41531,7 +42760,7 @@ "target_label": "TY2026-27 ird taxable income total by band $67,001 - $68,000 (parked)" }, "filter": "taxable_income_band_row_77_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_78", @@ -41561,14 +42790,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41583,7 +42816,7 @@ "target_label": "TY2026-27 ird taxable income total by band $68,001 - $69,000 (parked)" }, "filter": "taxable_income_band_row_78_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_79", @@ -41613,14 +42846,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41635,7 +42872,7 @@ "target_label": "TY2026-27 ird taxable income total by band $69,001 - $70,000 (parked)" }, "filter": "taxable_income_band_row_79_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_80", @@ -41665,14 +42902,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41687,7 +42928,7 @@ "target_label": "TY2026-27 ird taxable income total by band $70,001 - $71,000 (parked)" }, "filter": "taxable_income_band_row_80_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_81", @@ -41717,14 +42958,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41739,7 +42984,7 @@ "target_label": "TY2026-27 ird taxable income total by band $71,001 - $72,000 (parked)" }, "filter": "taxable_income_band_row_81_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_82", @@ -41769,14 +43014,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41791,7 +43040,7 @@ "target_label": "TY2026-27 ird taxable income total by band $72,001 - $73,000 (parked)" }, "filter": "taxable_income_band_row_82_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_83", @@ -41821,14 +43070,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41843,7 +43096,7 @@ "target_label": "TY2026-27 ird taxable income total by band $73,001 - $74,000 (parked)" }, "filter": "taxable_income_band_row_83_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_84", @@ -41873,14 +43126,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41895,7 +43152,7 @@ "target_label": "TY2026-27 ird taxable income total by band $74,001 - $75,000 (parked)" }, "filter": "taxable_income_band_row_84_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_85", @@ -41925,14 +43182,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41947,7 +43208,7 @@ "target_label": "TY2026-27 ird taxable income total by band $75,001 - $76,000 (parked)" }, "filter": "taxable_income_band_row_85_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_86", @@ -41977,14 +43238,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -41999,7 +43264,7 @@ "target_label": "TY2026-27 ird taxable income total by band $76,001 - $77,000 (parked)" }, "filter": "taxable_income_band_row_86_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_87", @@ -42029,14 +43294,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42051,7 +43320,7 @@ "target_label": "TY2026-27 ird taxable income total by band $77,001 - $78,000 (parked)" }, "filter": "taxable_income_band_row_87_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_88", @@ -42081,14 +43350,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42103,7 +43376,7 @@ "target_label": "TY2026-27 ird taxable income total by band $78,001 - $79,000 (parked)" }, "filter": "taxable_income_band_row_88_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_89", @@ -42133,14 +43406,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42155,7 +43432,7 @@ "target_label": "TY2026-27 ird taxable income total by band $79,001 - $80,000 (parked)" }, "filter": "taxable_income_band_row_89_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_90", @@ -42185,14 +43462,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42207,7 +43488,7 @@ "target_label": "TY2026-27 ird taxable income total by band $80,000 - $81,000 (parked)" }, "filter": "taxable_income_band_row_90_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_91", @@ -42237,14 +43518,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42259,7 +43544,7 @@ "target_label": "TY2026-27 ird taxable income total by band $81,001 - $82,000 (parked)" }, "filter": "taxable_income_band_row_91_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_92", @@ -42289,14 +43574,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42311,7 +43600,7 @@ "target_label": "TY2026-27 ird taxable income total by band $82,001 - $83,000 (parked)" }, "filter": "taxable_income_band_row_92_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_93", @@ -42341,14 +43630,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42363,7 +43656,7 @@ "target_label": "TY2026-27 ird taxable income total by band $83,001 - $84,000 (parked)" }, "filter": "taxable_income_band_row_93_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_94", @@ -42393,14 +43686,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42415,7 +43712,7 @@ "target_label": "TY2026-27 ird taxable income total by band $84,001 - $85,000 (parked)" }, "filter": "taxable_income_band_row_94_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_95", @@ -42445,14 +43742,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42467,7 +43768,7 @@ "target_label": "TY2026-27 ird taxable income total by band $85,001 - $86,000 (parked)" }, "filter": "taxable_income_band_row_95_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_96", @@ -42497,14 +43798,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42519,7 +43824,7 @@ "target_label": "TY2026-27 ird taxable income total by band $86,001 - $87,000 (parked)" }, "filter": "taxable_income_band_row_96_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_97", @@ -42549,14 +43854,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42571,7 +43880,7 @@ "target_label": "TY2026-27 ird taxable income total by band $87,001 - $88,000 (parked)" }, "filter": "taxable_income_band_row_97_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_98", @@ -42601,14 +43910,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42623,7 +43936,7 @@ "target_label": "TY2026-27 ird taxable income total by band $88,001 - $89,000 (parked)" }, "filter": "taxable_income_band_row_98_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_99", @@ -42653,14 +43966,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42675,7 +43992,7 @@ "target_label": "TY2026-27 ird taxable income total by band $89,001 - $90,000 (parked)" }, "filter": "taxable_income_band_row_99_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_100", @@ -42705,14 +44022,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42727,7 +44048,7 @@ "target_label": "TY2026-27 ird taxable income total by band $90,001 - $91,000 (parked)" }, "filter": "taxable_income_band_row_100_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_101", @@ -42757,14 +44078,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42779,7 +44104,7 @@ "target_label": "TY2026-27 ird taxable income total by band $91,001 - $92,000 (parked)" }, "filter": "taxable_income_band_row_101_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_102", @@ -42809,14 +44134,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42831,7 +44160,7 @@ "target_label": "TY2026-27 ird taxable income total by band $92,001 - $93,000 (parked)" }, "filter": "taxable_income_band_row_102_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_103", @@ -42861,14 +44190,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42883,7 +44216,7 @@ "target_label": "TY2026-27 ird taxable income total by band $93,001 - $94,000 (parked)" }, "filter": "taxable_income_band_row_103_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_104", @@ -42913,14 +44246,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42935,7 +44272,7 @@ "target_label": "TY2026-27 ird taxable income total by band $94,001 - $95,000 (parked)" }, "filter": "taxable_income_band_row_104_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_105", @@ -42965,14 +44302,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -42987,7 +44328,7 @@ "target_label": "TY2026-27 ird taxable income total by band $95,001 - $96,000 (parked)" }, "filter": "taxable_income_band_row_105_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_106", @@ -43017,14 +44358,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43039,7 +44384,7 @@ "target_label": "TY2026-27 ird taxable income total by band $96,001 - $97,000 (parked)" }, "filter": "taxable_income_band_row_106_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_107", @@ -43069,14 +44414,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43091,7 +44440,7 @@ "target_label": "TY2026-27 ird taxable income total by band $97,001 - $98,000 (parked)" }, "filter": "taxable_income_band_row_107_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_108", @@ -43121,14 +44470,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43143,7 +44496,7 @@ "target_label": "TY2026-27 ird taxable income total by band $98,001 - $99,000 (parked)" }, "filter": "taxable_income_band_row_108_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_109", @@ -43173,14 +44526,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43195,7 +44552,7 @@ "target_label": "TY2026-27 ird taxable income total by band $99,001 - $100,000 (parked)" }, "filter": "taxable_income_band_row_109_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_110", @@ -43225,14 +44582,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43247,7 +44608,7 @@ "target_label": "TY2026-27 ird taxable income total by band $100,001 - $101,000 (parked)" }, "filter": "taxable_income_band_row_110_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_111", @@ -43277,14 +44638,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43299,7 +44664,7 @@ "target_label": "TY2026-27 ird taxable income total by band $101,001 - $102,000 (parked)" }, "filter": "taxable_income_band_row_111_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_112", @@ -43329,14 +44694,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43351,7 +44720,7 @@ "target_label": "TY2026-27 ird taxable income total by band $102,001 - $103,000 (parked)" }, "filter": "taxable_income_band_row_112_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_113", @@ -43381,14 +44750,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43403,7 +44776,7 @@ "target_label": "TY2026-27 ird taxable income total by band $103,001 - $104,000 (parked)" }, "filter": "taxable_income_band_row_113_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_114", @@ -43433,14 +44806,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43455,7 +44832,7 @@ "target_label": "TY2026-27 ird taxable income total by band $104,001 - $105,000 (parked)" }, "filter": "taxable_income_band_row_114_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_115", @@ -43485,14 +44862,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43507,7 +44888,7 @@ "target_label": "TY2026-27 ird taxable income total by band $105,001 - $106,000 (parked)" }, "filter": "taxable_income_band_row_115_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_116", @@ -43537,14 +44918,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43559,7 +44944,7 @@ "target_label": "TY2026-27 ird taxable income total by band $106,001 - $107,000 (parked)" }, "filter": "taxable_income_band_row_116_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_117", @@ -43589,14 +44974,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43611,7 +45000,7 @@ "target_label": "TY2026-27 ird taxable income total by band $107,001 - $108,000 (parked)" }, "filter": "taxable_income_band_row_117_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_118", @@ -43641,14 +45030,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43663,7 +45056,7 @@ "target_label": "TY2026-27 ird taxable income total by band $108,001 - $109,000 (parked)" }, "filter": "taxable_income_band_row_118_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_119", @@ -43693,14 +45086,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43715,7 +45112,7 @@ "target_label": "TY2026-27 ird taxable income total by band $109,001 - $110,000 (parked)" }, "filter": "taxable_income_band_row_119_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_120", @@ -43745,14 +45142,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43767,7 +45168,7 @@ "target_label": "TY2026-27 ird taxable income total by band $110,001 - $111,000 (parked)" }, "filter": "taxable_income_band_row_120_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_121", @@ -43797,14 +45198,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43819,7 +45224,7 @@ "target_label": "TY2026-27 ird taxable income total by band $111,001 - $112,000 (parked)" }, "filter": "taxable_income_band_row_121_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_122", @@ -43849,14 +45254,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43871,7 +45280,7 @@ "target_label": "TY2026-27 ird taxable income total by band $112,001 - $113,000 (parked)" }, "filter": "taxable_income_band_row_122_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_123", @@ -43901,14 +45310,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43923,7 +45336,7 @@ "target_label": "TY2026-27 ird taxable income total by band $113,001 - $114,000 (parked)" }, "filter": "taxable_income_band_row_123_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_124", @@ -43953,14 +45366,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -43975,7 +45392,7 @@ "target_label": "TY2026-27 ird taxable income total by band $114,001 - $115,000 (parked)" }, "filter": "taxable_income_band_row_124_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_125", @@ -44005,14 +45422,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44027,7 +45448,7 @@ "target_label": "TY2026-27 ird taxable income total by band $115,001 - $116,000 (parked)" }, "filter": "taxable_income_band_row_125_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_126", @@ -44057,14 +45478,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44079,7 +45504,7 @@ "target_label": "TY2026-27 ird taxable income total by band $116,001 - $117,000 (parked)" }, "filter": "taxable_income_band_row_126_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_127", @@ -44109,14 +45534,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44131,7 +45560,7 @@ "target_label": "TY2026-27 ird taxable income total by band $117,001 - $118,000 (parked)" }, "filter": "taxable_income_band_row_127_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_128", @@ -44161,14 +45590,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44183,7 +45616,7 @@ "target_label": "TY2026-27 ird taxable income total by band $118,001 - $119,000 (parked)" }, "filter": "taxable_income_band_row_128_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_129", @@ -44213,14 +45646,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44235,7 +45672,7 @@ "target_label": "TY2026-27 ird taxable income total by band $119,001 - $120,000 (parked)" }, "filter": "taxable_income_band_row_129_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_130", @@ -44265,14 +45702,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44287,7 +45728,7 @@ "target_label": "TY2026-27 ird taxable income total by band $120,001 - $121,000 (parked)" }, "filter": "taxable_income_band_row_130_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_131", @@ -44317,14 +45758,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44339,7 +45784,7 @@ "target_label": "TY2026-27 ird taxable income total by band $121,001 - $122,000 (parked)" }, "filter": "taxable_income_band_row_131_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_132", @@ -44369,14 +45814,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44391,7 +45840,7 @@ "target_label": "TY2026-27 ird taxable income total by band $122,001 - $123,000 (parked)" }, "filter": "taxable_income_band_row_132_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_133", @@ -44421,14 +45870,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44443,7 +45896,7 @@ "target_label": "TY2026-27 ird taxable income total by band $123,001 - $124,000 (parked)" }, "filter": "taxable_income_band_row_133_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_134", @@ -44473,14 +45926,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44495,7 +45952,7 @@ "target_label": "TY2026-27 ird taxable income total by band $124,001 - $125,000 (parked)" }, "filter": "taxable_income_band_row_134_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_135", @@ -44525,14 +45982,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44547,7 +46008,7 @@ "target_label": "TY2026-27 ird taxable income total by band $125,001 - $126,000 (parked)" }, "filter": "taxable_income_band_row_135_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_136", @@ -44577,14 +46038,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44599,7 +46064,7 @@ "target_label": "TY2026-27 ird taxable income total by band $126,001 - $127,000 (parked)" }, "filter": "taxable_income_band_row_136_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_137", @@ -44629,14 +46094,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44651,7 +46120,7 @@ "target_label": "TY2026-27 ird taxable income total by band $127,001 - $128,000 (parked)" }, "filter": "taxable_income_band_row_137_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_138", @@ -44681,14 +46150,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44703,7 +46176,7 @@ "target_label": "TY2026-27 ird taxable income total by band $128,001 - $129,000 (parked)" }, "filter": "taxable_income_band_row_138_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_139", @@ -44733,14 +46206,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44755,7 +46232,7 @@ "target_label": "TY2026-27 ird taxable income total by band $129,001 - $130,000 (parked)" }, "filter": "taxable_income_band_row_139_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_140", @@ -44785,14 +46262,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44807,7 +46288,7 @@ "target_label": "TY2026-27 ird taxable income total by band $130,001 - $131,000 (parked)" }, "filter": "taxable_income_band_row_140_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_141", @@ -44837,14 +46318,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44859,7 +46344,7 @@ "target_label": "TY2026-27 ird taxable income total by band $131,001 - $132,000 (parked)" }, "filter": "taxable_income_band_row_141_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_142", @@ -44889,14 +46374,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44911,7 +46400,7 @@ "target_label": "TY2026-27 ird taxable income total by band $132,001 - $133,000 (parked)" }, "filter": "taxable_income_band_row_142_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_143", @@ -44941,14 +46430,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -44963,7 +46456,7 @@ "target_label": "TY2026-27 ird taxable income total by band $133,001 - $134,000 (parked)" }, "filter": "taxable_income_band_row_143_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_144", @@ -44993,14 +46486,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45015,7 +46512,7 @@ "target_label": "TY2026-27 ird taxable income total by band $134,001 - $135,000 (parked)" }, "filter": "taxable_income_band_row_144_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_145", @@ -45045,14 +46542,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45067,7 +46568,7 @@ "target_label": "TY2026-27 ird taxable income total by band $135,001 - $136,000 (parked)" }, "filter": "taxable_income_band_row_145_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_146", @@ -45097,14 +46598,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45119,7 +46624,7 @@ "target_label": "TY2026-27 ird taxable income total by band $136,001 - $137,000 (parked)" }, "filter": "taxable_income_band_row_146_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_147", @@ -45149,14 +46654,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45171,7 +46680,7 @@ "target_label": "TY2026-27 ird taxable income total by band $137,001 - $138,000 (parked)" }, "filter": "taxable_income_band_row_147_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_148", @@ -45201,14 +46710,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45223,7 +46736,7 @@ "target_label": "TY2026-27 ird taxable income total by band $138,001 - $139,000 (parked)" }, "filter": "taxable_income_band_row_148_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_149", @@ -45253,14 +46766,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45275,7 +46792,7 @@ "target_label": "TY2026-27 ird taxable income total by band $139,001 - $140,000 (parked)" }, "filter": "taxable_income_band_row_149_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_150", @@ -45305,14 +46822,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45327,7 +46848,7 @@ "target_label": "TY2026-27 ird taxable income total by band $140,001 - $141,000 (parked)" }, "filter": "taxable_income_band_row_150_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_151", @@ -45357,14 +46878,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45379,7 +46904,7 @@ "target_label": "TY2026-27 ird taxable income total by band $141,001 - $142,000 (parked)" }, "filter": "taxable_income_band_row_151_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_152", @@ -45409,14 +46934,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45431,7 +46960,7 @@ "target_label": "TY2026-27 ird taxable income total by band $142,001 - $143,000 (parked)" }, "filter": "taxable_income_band_row_152_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_153", @@ -45461,14 +46990,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45483,7 +47016,7 @@ "target_label": "TY2026-27 ird taxable income total by band $143,001 - $144,000 (parked)" }, "filter": "taxable_income_band_row_153_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_154", @@ -45513,14 +47046,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45535,7 +47072,7 @@ "target_label": "TY2026-27 ird taxable income total by band $144,001 - $145,000 (parked)" }, "filter": "taxable_income_band_row_154_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_155", @@ -45565,14 +47102,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45587,7 +47128,7 @@ "target_label": "TY2026-27 ird taxable income total by band $145,001 - $146,000 (parked)" }, "filter": "taxable_income_band_row_155_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_156", @@ -45617,14 +47158,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45639,7 +47184,7 @@ "target_label": "TY2026-27 ird taxable income total by band $146,001 - $147,000 (parked)" }, "filter": "taxable_income_band_row_156_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_157", @@ -45669,14 +47214,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45691,7 +47240,7 @@ "target_label": "TY2026-27 ird taxable income total by band $147,001 - $148,000 (parked)" }, "filter": "taxable_income_band_row_157_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_158", @@ -45721,14 +47270,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45743,7 +47296,7 @@ "target_label": "TY2026-27 ird taxable income total by band $148,001 - $149,000 (parked)" }, "filter": "taxable_income_band_row_158_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_159", @@ -45773,14 +47326,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45795,7 +47352,7 @@ "target_label": "TY2026-27 ird taxable income total by band $149,001 - $150,000 (parked)" }, "filter": "taxable_income_band_row_159_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_160", @@ -45825,14 +47382,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45847,7 +47408,7 @@ "target_label": "TY2026-27 ird taxable income total by band $150,001 - $151,000 (parked)" }, "filter": "taxable_income_band_row_160_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_161", @@ -45877,14 +47438,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45899,7 +47464,7 @@ "target_label": "TY2026-27 ird taxable income total by band $151,001 - $152,000 (parked)" }, "filter": "taxable_income_band_row_161_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_162", @@ -45929,14 +47494,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -45951,7 +47520,7 @@ "target_label": "TY2026-27 ird taxable income total by band $152,001 - $153,000 (parked)" }, "filter": "taxable_income_band_row_162_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_163", @@ -45981,14 +47550,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46003,7 +47576,7 @@ "target_label": "TY2026-27 ird taxable income total by band $153,001 - $154,000 (parked)" }, "filter": "taxable_income_band_row_163_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_164", @@ -46033,14 +47606,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46055,7 +47632,7 @@ "target_label": "TY2026-27 ird taxable income total by band $154,001 - $155,000 (parked)" }, "filter": "taxable_income_band_row_164_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_165", @@ -46085,14 +47662,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46107,7 +47688,7 @@ "target_label": "TY2026-27 ird taxable income total by band $155,001 - $156,000 (parked)" }, "filter": "taxable_income_band_row_165_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_166", @@ -46137,14 +47718,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46159,7 +47744,7 @@ "target_label": "TY2026-27 ird taxable income total by band $156,001 - $157,000 (parked)" }, "filter": "taxable_income_band_row_166_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_167", @@ -46189,14 +47774,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46211,7 +47800,7 @@ "target_label": "TY2026-27 ird taxable income total by band $157,001 - $158,000 (parked)" }, "filter": "taxable_income_band_row_167_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_168", @@ -46241,14 +47830,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46263,7 +47856,7 @@ "target_label": "TY2026-27 ird taxable income total by band $158,001 - $159,000 (parked)" }, "filter": "taxable_income_band_row_168_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_169", @@ -46293,14 +47886,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46315,7 +47912,7 @@ "target_label": "TY2026-27 ird taxable income total by band $159,001 - $160,000 (parked)" }, "filter": "taxable_income_band_row_169_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_170", @@ -46345,14 +47942,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46367,7 +47968,7 @@ "target_label": "TY2026-27 ird taxable income total by band $160,001 - $161,000 (parked)" }, "filter": "taxable_income_band_row_170_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_171", @@ -46397,14 +47998,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46419,7 +48024,7 @@ "target_label": "TY2026-27 ird taxable income total by band $161,001 - $162,000 (parked)" }, "filter": "taxable_income_band_row_171_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_172", @@ -46449,14 +48054,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46471,7 +48080,7 @@ "target_label": "TY2026-27 ird taxable income total by band $162,001 - $163,000 (parked)" }, "filter": "taxable_income_band_row_172_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_173", @@ -46501,14 +48110,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46523,7 +48136,7 @@ "target_label": "TY2026-27 ird taxable income total by band $163,001 - $164,000 (parked)" }, "filter": "taxable_income_band_row_173_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_174", @@ -46553,14 +48166,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46575,7 +48192,7 @@ "target_label": "TY2026-27 ird taxable income total by band $164,001 - $165,000 (parked)" }, "filter": "taxable_income_band_row_174_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_175", @@ -46605,14 +48222,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46627,7 +48248,7 @@ "target_label": "TY2026-27 ird taxable income total by band $165,001 - $166,000 (parked)" }, "filter": "taxable_income_band_row_175_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_176", @@ -46657,14 +48278,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46679,7 +48304,7 @@ "target_label": "TY2026-27 ird taxable income total by band $166,001 - $167,000 (parked)" }, "filter": "taxable_income_band_row_176_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_177", @@ -46709,14 +48334,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46731,7 +48360,7 @@ "target_label": "TY2026-27 ird taxable income total by band $167,001 - $168,000 (parked)" }, "filter": "taxable_income_band_row_177_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_178", @@ -46761,14 +48390,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46783,7 +48416,7 @@ "target_label": "TY2026-27 ird taxable income total by band $168,001 - $169,000 (parked)" }, "filter": "taxable_income_band_row_178_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_179", @@ -46813,14 +48446,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46835,7 +48472,7 @@ "target_label": "TY2026-27 ird taxable income total by band $169,001 - $170,000 (parked)" }, "filter": "taxable_income_band_row_179_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_180", @@ -46865,14 +48502,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46887,7 +48528,7 @@ "target_label": "TY2026-27 ird taxable income total by band $170,001 - $171,000 (parked)" }, "filter": "taxable_income_band_row_180_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_181", @@ -46917,14 +48558,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46939,7 +48584,7 @@ "target_label": "TY2026-27 ird taxable income total by band $171,001 - $172,000 (parked)" }, "filter": "taxable_income_band_row_181_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_182", @@ -46969,14 +48614,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -46991,7 +48640,7 @@ "target_label": "TY2026-27 ird taxable income total by band $172,001 - $173,000 (parked)" }, "filter": "taxable_income_band_row_182_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_183", @@ -47021,14 +48670,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47043,7 +48696,7 @@ "target_label": "TY2026-27 ird taxable income total by band $173,001 - $174,000 (parked)" }, "filter": "taxable_income_band_row_183_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_184", @@ -47073,14 +48726,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47095,7 +48752,7 @@ "target_label": "TY2026-27 ird taxable income total by band $174,001 - $175,000 (parked)" }, "filter": "taxable_income_band_row_184_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_185", @@ -47125,14 +48782,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47147,7 +48808,7 @@ "target_label": "TY2026-27 ird taxable income total by band $175,001 - $176,000 (parked)" }, "filter": "taxable_income_band_row_185_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_186", @@ -47177,14 +48838,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47199,7 +48864,7 @@ "target_label": "TY2026-27 ird taxable income total by band $176,001 - $177,000 (parked)" }, "filter": "taxable_income_band_row_186_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_187", @@ -47229,14 +48894,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47251,7 +48920,7 @@ "target_label": "TY2026-27 ird taxable income total by band $177,001 - $178,000 (parked)" }, "filter": "taxable_income_band_row_187_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_188", @@ -47281,14 +48950,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47303,7 +48976,7 @@ "target_label": "TY2026-27 ird taxable income total by band $178,001 - $179,000 (parked)" }, "filter": "taxable_income_band_row_188_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_189", @@ -47333,14 +49006,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47355,7 +49032,7 @@ "target_label": "TY2026-27 ird taxable income total by band $179,001 - $180,000 (parked)" }, "filter": "taxable_income_band_row_189_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_190", @@ -47385,14 +49062,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47407,7 +49088,7 @@ "target_label": "TY2026-27 ird taxable income total by band $180,001 - $181,000 (parked)" }, "filter": "taxable_income_band_row_190_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_191", @@ -47437,14 +49118,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47459,7 +49144,7 @@ "target_label": "TY2026-27 ird taxable income total by band $181,001 - $182,000 (parked)" }, "filter": "taxable_income_band_row_191_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_192", @@ -47489,14 +49174,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47511,7 +49200,7 @@ "target_label": "TY2026-27 ird taxable income total by band $182,001 - $183,000 (parked)" }, "filter": "taxable_income_band_row_192_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_193", @@ -47541,14 +49230,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47563,7 +49256,7 @@ "target_label": "TY2026-27 ird taxable income total by band $183,001 - $184,000 (parked)" }, "filter": "taxable_income_band_row_193_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_194", @@ -47593,14 +49286,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47615,7 +49312,7 @@ "target_label": "TY2026-27 ird taxable income total by band $184,001 - $185,000 (parked)" }, "filter": "taxable_income_band_row_194_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_195", @@ -47645,14 +49342,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47667,7 +49368,7 @@ "target_label": "TY2026-27 ird taxable income total by band $185,001 - $186,000 (parked)" }, "filter": "taxable_income_band_row_195_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_196", @@ -47697,14 +49398,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47719,7 +49424,7 @@ "target_label": "TY2026-27 ird taxable income total by band $186,001 - $187,000 (parked)" }, "filter": "taxable_income_band_row_196_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_197", @@ -47749,14 +49454,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47771,7 +49480,7 @@ "target_label": "TY2026-27 ird taxable income total by band $187,001 - $188,000 (parked)" }, "filter": "taxable_income_band_row_197_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_198", @@ -47801,14 +49510,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47823,7 +49536,7 @@ "target_label": "TY2026-27 ird taxable income total by band $188,001 - $189,000 (parked)" }, "filter": "taxable_income_band_row_198_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_199", @@ -47853,14 +49566,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47875,7 +49592,7 @@ "target_label": "TY2026-27 ird taxable income total by band $189,001 - $190,000 (parked)" }, "filter": "taxable_income_band_row_199_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_200", @@ -47905,14 +49622,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47927,7 +49648,7 @@ "target_label": "TY2026-27 ird taxable income total by band $190,001 - $191,000 (parked)" }, "filter": "taxable_income_band_row_200_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_201", @@ -47957,14 +49678,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -47979,7 +49704,7 @@ "target_label": "TY2026-27 ird taxable income total by band $191,001 - $192,000 (parked)" }, "filter": "taxable_income_band_row_201_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_202", @@ -48009,14 +49734,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48031,7 +49760,7 @@ "target_label": "TY2026-27 ird taxable income total by band $192,001 - $193,000 (parked)" }, "filter": "taxable_income_band_row_202_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_203", @@ -48061,14 +49790,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48083,7 +49816,7 @@ "target_label": "TY2026-27 ird taxable income total by band $193,001 - $194,000 (parked)" }, "filter": "taxable_income_band_row_203_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_204", @@ -48113,14 +49846,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48135,7 +49872,7 @@ "target_label": "TY2026-27 ird taxable income total by band $194,001 - $195,000 (parked)" }, "filter": "taxable_income_band_row_204_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_205", @@ -48165,14 +49902,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48187,7 +49928,7 @@ "target_label": "TY2026-27 ird taxable income total by band $195,001 - $196,000 (parked)" }, "filter": "taxable_income_band_row_205_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_206", @@ -48217,14 +49958,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48239,7 +49984,7 @@ "target_label": "TY2026-27 ird taxable income total by band $196,001 - $197,000 (parked)" }, "filter": "taxable_income_band_row_206_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_207", @@ -48269,14 +50014,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48291,7 +50040,7 @@ "target_label": "TY2026-27 ird taxable income total by band $197,001 - $198,000 (parked)" }, "filter": "taxable_income_band_row_207_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_208", @@ -48321,14 +50070,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48343,7 +50096,7 @@ "target_label": "TY2026-27 ird taxable income total by band $198,001 - $199,000 (parked)" }, "filter": "taxable_income_band_row_208_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_209", @@ -48373,14 +50126,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48395,7 +50152,7 @@ "target_label": "TY2026-27 ird taxable income total by band $199,001 - $200,000 (parked)" }, "filter": "taxable_income_band_row_209_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_210", @@ -48425,14 +50182,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48447,7 +50208,7 @@ "target_label": "TY2026-27 ird taxable income total by band $200,001 - $205,000 (parked)" }, "filter": "taxable_income_band_row_210_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_211", @@ -48477,14 +50238,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48499,7 +50264,7 @@ "target_label": "TY2026-27 ird taxable income total by band $205,001 - $210,000 (parked)" }, "filter": "taxable_income_band_row_211_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_212", @@ -48529,14 +50294,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48551,7 +50320,7 @@ "target_label": "TY2026-27 ird taxable income total by band $210,001 - $215,000 (parked)" }, "filter": "taxable_income_band_row_212_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_213", @@ -48581,14 +50350,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48603,7 +50376,7 @@ "target_label": "TY2026-27 ird taxable income total by band $215,001 - $220,000 (parked)" }, "filter": "taxable_income_band_row_213_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_214", @@ -48633,14 +50406,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48655,7 +50432,7 @@ "target_label": "TY2026-27 ird taxable income total by band $220,001 - $225,000 (parked)" }, "filter": "taxable_income_band_row_214_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_215", @@ -48685,14 +50462,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48707,7 +50488,7 @@ "target_label": "TY2026-27 ird taxable income total by band $225,001 - $230,000 (parked)" }, "filter": "taxable_income_band_row_215_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_216", @@ -48737,14 +50518,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48759,7 +50544,7 @@ "target_label": "TY2026-27 ird taxable income total by band $230,001 - $235,000 (parked)" }, "filter": "taxable_income_band_row_216_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_217", @@ -48789,14 +50574,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48811,7 +50600,7 @@ "target_label": "TY2026-27 ird taxable income total by band $235,001 - $240,000 (parked)" }, "filter": "taxable_income_band_row_217_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_218", @@ -48841,14 +50630,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48863,7 +50656,7 @@ "target_label": "TY2026-27 ird taxable income total by band $240,001 - $245,000 (parked)" }, "filter": "taxable_income_band_row_218_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_219", @@ -48893,14 +50686,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48915,7 +50712,7 @@ "target_label": "TY2026-27 ird taxable income total by band $245,001 - $250,000 (parked)" }, "filter": "taxable_income_band_row_219_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_220", @@ -48945,14 +50742,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -48967,7 +50768,7 @@ "target_label": "TY2026-27 ird taxable income total by band $250,001 - $255,000 (parked)" }, "filter": "taxable_income_band_row_220_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_221", @@ -48997,14 +50798,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49019,7 +50824,7 @@ "target_label": "TY2026-27 ird taxable income total by band $255,001 - $260,000 (parked)" }, "filter": "taxable_income_band_row_221_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_222", @@ -49049,14 +50854,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49071,7 +50880,7 @@ "target_label": "TY2026-27 ird taxable income total by band $260,001 - $265,000 (parked)" }, "filter": "taxable_income_band_row_222_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_223", @@ -49101,14 +50910,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49123,7 +50936,7 @@ "target_label": "TY2026-27 ird taxable income total by band $265,001 - $270,000 (parked)" }, "filter": "taxable_income_band_row_223_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_224", @@ -49153,14 +50966,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49175,7 +50992,7 @@ "target_label": "TY2026-27 ird taxable income total by band $270,001 - $275,000 (parked)" }, "filter": "taxable_income_band_row_224_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_225", @@ -49205,14 +51022,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49227,7 +51048,7 @@ "target_label": "TY2026-27 ird taxable income total by band $275,001 - $280,000 (parked)" }, "filter": "taxable_income_band_row_225_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_226", @@ -49257,14 +51078,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49279,7 +51104,7 @@ "target_label": "TY2026-27 ird taxable income total by band $280,001 - $285,000 (parked)" }, "filter": "taxable_income_band_row_226_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_227", @@ -49309,14 +51134,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49331,7 +51160,7 @@ "target_label": "TY2026-27 ird taxable income total by band $285,001 - $290,000 (parked)" }, "filter": "taxable_income_band_row_227_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_228", @@ -49361,14 +51190,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49383,7 +51216,7 @@ "target_label": "TY2026-27 ird taxable income total by band $290,001 - $295,000 (parked)" }, "filter": "taxable_income_band_row_228_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_229", @@ -49413,14 +51246,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49435,7 +51272,7 @@ "target_label": "TY2026-27 ird taxable income total by band $295,001 - $300,000 (parked)" }, "filter": "taxable_income_band_row_229_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_230", @@ -49465,14 +51302,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49487,7 +51328,7 @@ "target_label": "TY2026-27 ird taxable income total by band $300,000 - $350,000 (parked)" }, "filter": "taxable_income_band_row_230_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_231", @@ -49517,14 +51358,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49539,7 +51384,7 @@ "target_label": "TY2026-27 ird taxable income total by band $350,001 - $400,000 (parked)" }, "filter": "taxable_income_band_row_231_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_232", @@ -49569,14 +51414,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49591,7 +51440,7 @@ "target_label": "TY2026-27 ird taxable income total by band $400,001 - $450,000 (parked)" }, "filter": "taxable_income_band_row_232_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_233", @@ -49621,14 +51470,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49643,7 +51496,7 @@ "target_label": "TY2026-27 ird taxable income total by band $450,001 - $500,000 (parked)" }, "filter": "taxable_income_band_row_233_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_234", @@ -49673,14 +51526,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49695,7 +51552,7 @@ "target_label": "TY2026-27 ird taxable income total by band $500,001 - $550,000 (parked)" }, "filter": "taxable_income_band_row_234_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_235", @@ -49725,14 +51582,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49747,7 +51608,7 @@ "target_label": "TY2026-27 ird taxable income total by band $550,001 - $600,000 (parked)" }, "filter": "taxable_income_band_row_235_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_236", @@ -49777,14 +51638,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49799,7 +51664,7 @@ "target_label": "TY2026-27 ird taxable income total by band $600,001 - $650,000 (parked)" }, "filter": "taxable_income_band_row_236_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_237", @@ -49829,14 +51694,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49851,7 +51720,7 @@ "target_label": "TY2026-27 ird taxable income total by band $650,001 - $700,000 (parked)" }, "filter": "taxable_income_band_row_237_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_238", @@ -49881,14 +51750,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49903,7 +51776,7 @@ "target_label": "TY2026-27 ird taxable income total by band $700,001 - $750,000 (parked)" }, "filter": "taxable_income_band_row_238_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_239", @@ -49933,14 +51806,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -49955,7 +51832,7 @@ "target_label": "TY2026-27 ird taxable income total by band $750,001 - $800,000 (parked)" }, "filter": "taxable_income_band_row_239_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_240", @@ -49985,14 +51862,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -50007,7 +51888,7 @@ "target_label": "TY2026-27 ird taxable income total by band $800,001 - $850,000 (parked)" }, "filter": "taxable_income_band_row_240_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_241", @@ -50037,14 +51918,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -50059,7 +51944,7 @@ "target_label": "TY2026-27 ird taxable income total by band $850,001 - $900,000 (parked)" }, "filter": "taxable_income_band_row_241_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_242", @@ -50089,14 +51974,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -50111,7 +52000,7 @@ "target_label": "TY2026-27 ird taxable income total by band $900,001 - $950,000 (parked)" }, "filter": "taxable_income_band_row_242_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_243", @@ -50141,14 +52030,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -50163,7 +52056,7 @@ "target_label": "TY2026-27 ird taxable income total by band $950,001 - $1,000,000 (parked)" }, "filter": "taxable_income_band_row_243_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "ird_taxable_income_total_by_band__row_244", @@ -50193,14 +52086,18 @@ "assertion_policy": "observed_only", "metadata": { "contract_target_id": "ird_taxable_income_total_by_band", - "activation_status": "requires_g8r2_taxable_income_contract_intervals_and_ageing", + "activation_status": "requires_prerequisites", "criticality": "release_blocking", "measure_kind": "prepared_column", "publisher": "Inland Revenue", "target_role": "calibration", "reference_set": "calibration", "method_card_row": "MC5", - "parking_reason": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "parking_reason": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement.", + "reference_prerequisites": "[\"reference_profile:aging_index\",\"measurement:ird_taxable_income_ty2027_v1\"]", + "required_reference_profile": "aging_index", + "required_measurement_binding": "ird_taxable_income_ty2027_v1", + "reference_value_kind": "money" }, "hierarchy": { "provider": { @@ -50215,7 +52112,7 @@ "target_label": "TY2026-27 ird taxable income total by band Over $1,000,000 (parked)" }, "filter": "taxable_income_band_row_244_indicator", - "notes": "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." + "notes": "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." }, { "name": "msd_jobseeker_support_recipients__age_18_24", diff --git a/packages/microcosm-build/src/microcosm/build/reference_factors.py b/packages/microcosm-build/src/microcosm/build/reference_factors.py new file mode 100644 index 0000000000..b8ad41911f --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/reference_factors.py @@ -0,0 +1,711 @@ +"""Closed, declaration-driven factor calculations with exact feed operands. + +The operational rational is rounded once. Irrational roots remain certified +intervals in the evidence; they are never represented as exact rationals. +Composition checks declared evidence; compilation must replay it against the +facts returned by the authenticated artifact loader. +""" + +from __future__ import annotations + +import hashlib +from collections.abc import Iterable, Mapping +from datetime import date, timedelta +from decimal import Decimal, InvalidOperation +from fractions import Fraction + +from microcosm.build.ledger_artifact import LexicalFloat, chronicle_feed_identity +from microcosm.build.ledger_targets import ( + ALLOWED_ASSERTION_POLICIES, + fact_matches_selector, + selector_field_is_supported, +) +from microcosm.graph.canonical import canonical_json + +OPERATION = "projected_period_average_ratio" +OPERATION_VERSION = 1 +_DECLARATION_FIELDS = frozenset( + { + "schema_version", + "id", + "operation", + "operation_version", + "purpose", + "feed_identity", + "source_period", + "target_period", + "source_schedule", + "target_schedule", + "growth", + "subperiods_per_year", + "projection_policy", + "rounding", + "expected_operational_factor", + "validity", + "evidence", + "decision_references", + } +) +_VALIDATION_FIELDS = frozenset( + { + "unit", + "source_sha256", + "source_vintage", + "entity_role", + "provenance_class", + "assertion", + "period_coverage", + "source_column_id", + } +) + + +def factor_document_sha256(document: object) -> str: + """Hash canonical declaration/evidence bytes without a registry identity.""" + return hashlib.sha256(canonical_json(document)).hexdigest() + + +def _mapping(value: object, label: str) -> dict: + if not isinstance(value, Mapping): + raise ValueError(f"{label} must be an object.") + return dict(value) + + +def _closed(value: object, fields: set | frozenset, label: str) -> dict: + result = _mapping(value, label) + unknown = result.keys() - fields + if unknown: + raise ValueError(f"Unknown {label} fields: {sorted(unknown)}.") + return result + + +def _closed_feed_identity(value: object, label: str) -> dict: + identity = _mapping(value, label) + normalized = chronicle_feed_identity(identity) + unknown = identity.keys() - normalized.keys() + if unknown: + raise ValueError(f"Unknown {label} fields: {sorted(unknown)}.") + return normalized + + +def _list(value: object, label: str) -> list: + if not isinstance(value, (list, tuple)) or not value: + raise ValueError(f"{label} must be a nonempty list.") + return list(value) + + +def _decimal(value: object, label: str) -> Fraction: + if isinstance(value, bool) or not isinstance(value, (str, int, Decimal)): + raise ValueError(f"{label} requires a finite lexical decimal, never a float.") + try: + result = Decimal(value) + except (InvalidOperation, ValueError) as exc: + raise ValueError(f"{label} requires a finite decimal.") from exc + if not result.is_finite(): + raise ValueError(f"{label} requires a finite decimal.") + return Fraction(result) + + +def _rational(value: Fraction) -> dict: + return {"numerator": value.numerator, "denominator": value.denominator} + + +def _read_rational(value: object, label: str) -> Fraction: + row = _closed(value, {"numerator", "denominator"}, label) + numerator, denominator = row.get("numerator"), row.get("denominator") + if type(numerator) is not int or type(denominator) is not int or denominator <= 0: + raise ValueError( + f"{label} requires integer numerator and positive denominator." + ) + return Fraction(numerator, denominator) + + +def _integer_root(value: int, degree: int) -> int: + lower, upper = 0, 1 << ((value.bit_length() + degree - 1) // degree) + while lower < upper: + middle = (lower + upper + 1) // 2 + if middle**degree <= value: + lower = middle + else: + upper = middle - 1 + return lower + + +def certified_nth_root_bounds( + value: Fraction, degree: int, decimal_places: int +) -> tuple[Fraction, Fraction, bool]: + """Enclose a positive root on an integer grid; mark only exact roots exact.""" + if value <= 0 or type(degree) is not int or degree <= 0: + raise ValueError("Root radicand and degree must be positive.") + if type(decimal_places) is not int or not 0 <= decimal_places <= 4096: + raise ValueError("Root precision must be between 0 and 4096.") + numerator_root = _integer_root(value.numerator, degree) + denominator_root = _integer_root(value.denominator, degree) + if ( + numerator_root**degree == value.numerator + and denominator_root**degree == value.denominator + ): + exact = Fraction(numerator_root, denominator_root) + return exact, exact, True + scale = 10**decimal_places + floor = _integer_root(value.numerator * scale**degree // value.denominator, degree) + return Fraction(floor, scale), Fraction(floor + 1, scale), False + + +def _round_nearest(value: Fraction, digits: int) -> int: + scaled = value * 10**digits + quotient, remainder = divmod(scaled.numerator, scaled.denominator) + twice = 2 * remainder + return quotient + ( + twice > scaled.denominator + or (twice == scaled.denominator and quotient % 2 == 1) + ) + + +def _declaration(declaration: object) -> dict: + row = _closed(declaration, _DECLARATION_FIELDS, "factor declaration") + missing = _DECLARATION_FIELDS - row.keys() + if missing: + raise ValueError(f"Factor declaration missing fields: {sorted(missing)}.") + if type(row["schema_version"]) is not int or row["schema_version"] != 1: + raise ValueError("Factor declaration requires schema_version 1.") + if ( + row["operation"] != OPERATION + or type(row["operation_version"]) is not int + or row["operation_version"] != OPERATION_VERSION + ): + raise ValueError("Unknown factor operation or operation version.") + if not isinstance(row["id"], str) or not row["id"]: + raise ValueError("Factor id must be nonempty text.") + if row["purpose"] not in {"profile_input", "diagnostic"}: + raise ValueError("Unknown factor purpose.") + for field in ("source_period", "target_period"): + label = row[field] + if type(label) not in {str, int} or isinstance(label, str) and not label: + raise ValueError("Factor period labels require nonempty text or integers.") + if row["projection_policy"] != "observed_preferred_latest_contiguous": + raise ValueError("Unknown factor projection policy.") + frequency = row["subperiods_per_year"] + if type(frequency) is not int or not 1 <= frequency <= 366: + raise ValueError("subperiods_per_year must be a declared positive integer.") + rounding = _closed(row["rounding"], {"digits", "mode"}, "factor rounding") + if type(rounding.get("digits")) is not int or not 0 <= rounding["digits"] <= 100: + raise ValueError("Factor rounding digits must be an integer from 0 to 100.") + if rounding.get("mode") != "nearest_half_even": + raise ValueError("Factor rounding must be nearest_half_even.") + expected = _read_rational(row["expected_operational_factor"], "expected factor") + if ( + expected <= 0 + or row["expected_operational_factor"]["denominator"] != 10 ** rounding["digits"] + ): + raise ValueError("Expected operational factor must be positive p / 10**digits.") + validity = _closed( + row["validity"], + {"declared_on", "valid_from", "valid_until", "as_of"}, + "factor validity", + ) + try: + dates = { + key: date.fromisoformat(validity[key]) + for key in ("declared_on", "valid_from", "valid_until", "as_of") + } + except (KeyError, TypeError, ValueError) as exc: + raise ValueError("Factor validity requires explicit ISO dates.") from exc + if ( + not dates["declared_on"] <= dates["as_of"] + or not dates["valid_from"] <= dates["as_of"] <= dates["valid_until"] + ): + raise ValueError( + "Factor declaration is expired or not yet valid at its declared as_of." + ) + if not dates["valid_from"] <= date.today() <= dates["valid_until"]: + raise ValueError("Factor declaration is expired or not yet valid today.") + for key in ("evidence", "decision_references"): + if any(not isinstance(item, str) or not item for item in _list(row[key], key)): + raise ValueError(f"{key} must contain nonempty text.") + row["feed_identity"] = _closed_feed_identity( + row["feed_identity"], "factor declaration feed identity" + ) + return row + + +def _schedule(value: object, frequency: int, *, target: bool) -> list[dict]: + rows = _list(value, "factor schedule") + if len(rows) != frequency: + raise ValueError("Factor schedule must contain every declared subperiod once.") + result, previous_end, periods = [], None, set() + for index, raw in enumerate(rows): + fields = {"selector", "validation", "weight", "sequence"} + if target: + fields.add("projection_offset") + row = _closed(raw, fields, "factor schedule slot") + if type(row.get("sequence")) is not int or row["sequence"] != index: + raise ValueError("Factor schedule is misordered or noncontiguous.") + if target and ( + type(row.get("projection_offset")) is not int + or row["projection_offset"] != index + ): + raise ValueError("Invalid projection offsets.") + selector = _mapping(row.get("selector"), "factor selector") + if not selector or any( + not selector_field_is_supported(key) for key in selector + ): + raise ValueError( + "Unknown or empty factor selector; use the closed selector vocabulary." + ) + if "period_value" not in selector or isinstance( + selector["period_value"], (list, tuple) + ): + raise ValueError("Each schedule slot must select one explicit period.") + period = str(selector["period_value"]) + if period in periods: + raise ValueError("Duplicate factor schedule period.") + periods.add(period) + validation = _validation(row.get("validation")) + coverage = validation["period_coverage"] + try: + start, end = ( + date.fromisoformat(coverage["start_date"]), + date.fromisoformat(coverage["end_date"]), + ) + except (KeyError, TypeError, ValueError) as exc: + raise ValueError("Factor schedules require ISO period coverage.") from exc + if start > end or ( + previous_end is not None and start != previous_end + timedelta(days=1) + ): + raise ValueError("Factor schedule coverage is misordered or noncontiguous.") + previous_end = end + if _decimal(row.get("weight"), "schedule weight") <= 0: + raise ValueError("Averaging weights must be positive.") + result.append(row) + return result + + +def _validation(value: object) -> dict: + result = _closed(value, _VALIDATION_FIELDS, "factor operand validation") + required = _VALIDATION_FIELDS - {"source_column_id"} + if required - result.keys(): + raise ValueError( + "Factor operands require unit, source hash/vintage, role, assertion, provenance and coverage." + ) + if result["assertion"] not in {"observation", "source_projection"}: + raise ValueError("Unknown factor assertion.") + coverage = _closed( + result["period_coverage"], + {"start_date", "end_date", "basis", "source_period_label", "notes"}, + "factor operand coverage", + ) + if not {"start_date", "end_date"} <= coverage.keys(): + raise ValueError("Factor operand coverage requires both endpoints.") + for key in required - {"period_coverage"}: + if not isinstance(result[key], str) or not result[key]: + raise ValueError("Factor operand validations require nonempty text.") + source_hash = result["source_sha256"] + if len(source_hash) != 64 or any( + character not in "0123456789abcdef" for character in source_hash + ): + raise ValueError("Factor operand source hash must be a lowercase SHA-256.") + return result + + +def _operand( + slot: dict, + facts: tuple, + *, + optional: bool = False, + assertion_policy: str = "observed_only", +) -> tuple[Fraction, dict] | None: + selector = slot["selector"] + # Exact keys do not make duplicate same-period source vintages unambiguous. + broad = { + key: value + for key, value in selector.items() + if key + not in { + "aggregate_fact_key", + "semantic_fact_key", + "legacy_fact_key", + "source_record_id", + "record_set_id", + "layout_record_set_id", + "record_set_spec_id", + "layout_record_set_spec_id", + } + } + if ( + "period_value" in broad + and sum(fact_matches_selector(fact, broad) for fact in facts) > 1 + ): + raise ValueError("Duplicate factor period across source vintages or facts.") + matches = [fact for fact in facts if fact_matches_selector(fact, selector)] + if not matches and optional: + return None + if len(matches) != 1: + raise ValueError( + f"Factor selector must resolve exactly once; found {len(matches)}." + ) + fact = matches[0] + validation = _validation(slot["validation"]) + actual = { + "unit": fact.get("observed_measure", {}).get("unit"), + "source_sha256": fact.get("source", {}).get("source_sha256"), + "source_vintage": fact.get("source", {}).get("vintage"), + "entity_role": fact.get("entity", {}).get("role"), + "provenance_class": fact.get("provenance_class"), + "assertion": fact.get("assertion", "observation"), + "period_coverage": fact.get("period_coverage", {}), + "source_column_id": fact.get("layout", {}).get("source_column_id"), + } + for key, expected in validation.items(): + if key == "period_coverage": + if any(actual[key].get(field) != item for field, item in expected.items()): + raise ValueError("Factor operand period coverage mismatch.") + elif actual[key] != expected: + raise ValueError(f"Factor operand {key} mismatch.") + # Reuse the existing target assertion-policy vocabulary after all match paths. + if ( + actual["assertion"] == "source_projection" + and assertion_policy != "allow_source_projection" + ): + raise ValueError("Source projections require allow_source_projection.") + value = fact.get("value") + if isinstance(value, bool): + raise ValueError("Boolean factor operand is not numeric.") + if isinstance(value, LexicalFloat): + token = value.lexical_token + recovered = str(float(value)) + if _decimal(token, "feed numeric token") != _decimal( + recovered, "float decimal recovery" + ): + raise ValueError( + "Float conversion does not reproduce the feed lexical numeric token." + ) + proof = { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": token, + "recovered_decimal": recovered, + "decimal_values_equal": True, + } + elif type(value) is int: + token = str(value) + proof = { + "numeric_representation": "exact_integer", + "lexical_token": token, + "recovered_decimal": token, + "decimal_values_equal": True, + } + elif isinstance(value, Decimal): + token = str(value) + proof = { + "numeric_representation": "exact_decimal", + "lexical_token": token, + "recovered_decimal": token, + "decimal_values_equal": True, + } + else: + raise ValueError("Factor operand lacks an authenticated lexical numeric token.") + numeric = _decimal(token, "feed numeric token") + return numeric, { + "selector": selector, + "aggregate_fact_key": fact.get("aggregate_fact_key"), + "decimal_operand": token, + "numeric_token_proof": proof, + "validation": validation, + "period": fact.get("period"), + "source": fact.get("source"), + "unit": actual["unit"], + "assertion": actual["assertion"], + "provenance_class": actual["provenance_class"], + "entity_role": actual["entity_role"], + "period_coverage": actual["period_coverage"], + } + + +def resolve_reference_factor( + declaration: Mapping, facts: Iterable, feed_identity: Mapping +) -> tuple[dict, dict]: + """Resolve one closed operation, returning its operational rational and proof.""" + row = _declaration(declaration) + feed_identity = chronicle_feed_identity( + _mapping(feed_identity, "factor feed identity") + ) + if canonical_json(row["feed_identity"]) != canonical_json(feed_identity): + raise ValueError("Factor feed identity mismatch; re-declaration is required.") + fact_rows = tuple(facts) + frequency = row["subperiods_per_year"] + source = _schedule(row["source_schedule"], frequency, target=False) + target = _schedule(row["target_schedule"], frequency, target=True) + source_values, source_evidence = [], [] + for slot in source: + if slot["validation"]["assertion"] != "observation": + raise ValueError("Source schedule requires observations.") + value, evidence = _operand(slot, fact_rows) + if value <= 0: + raise ValueError("Factor denominator operands must be positive.") + source_values.append((value, _decimal(slot["weight"], "source weight"))) + evidence.update({"weight": slot["weight"], "sequence": slot["sequence"]}) + source_evidence.append(evidence) + denominator = sum(value * weight for value, weight in source_values) / sum( + weight for _, weight in source_values + ) + growth = row["growth"] + growth_evidence, effective_growth = None, Fraction(0) + if growth is not None: + growth = _closed( + growth, + { + "selector", + "validation", + "unit_multiplier", + "scenario_delta", + "sensitivity_provenance", + "assertion_policy", + }, + "factor growth", + ) + _validation(growth.get("validation")) + selector = _mapping(growth.get("selector"), "growth selector") + if not selector or any( + not selector_field_is_supported(key) for key in selector + ): + raise ValueError("Unknown growth selector field.") + policy = growth.get("assertion_policy") + if policy not in ALLOWED_ASSERTION_POLICIES: + raise ValueError("Unknown growth assertion policy.") + growth_value, growth_evidence = _operand( + growth, fact_rows, assertion_policy=policy + ) + multiplier = _decimal(growth.get("unit_multiplier"), "growth unit multiplier") + delta = _decimal(growth.get("scenario_delta"), "scenario delta") + if multiplier <= 0: + raise ValueError("Growth unit multiplier must be positive.") + if any( + not isinstance(item, str) or not item + for item in _list( + growth.get("sensitivity_provenance"), "sensitivity provenance" + ) + ): + raise ValueError("Missing sensitivity provenance.") + effective_growth = (growth_value + delta) * multiplier + growth_evidence.update( + { + "unit_multiplier": growth["unit_multiplier"], + "scenario_delta": growth["scenario_delta"], + "sensitivity_provenance": growth["sensitivity_provenance"], + "effective_growth": _rational(effective_growth), + } + ) + if 1 + effective_growth <= 0: + raise ValueError("Effective annual growth must have positive 1 + g.") + observations, target_evidence, gap = [], [], False + for slot in target: + if slot["validation"]["assertion"] != "observation": + raise ValueError("Target schedules prefer observations only.") + resolved = _operand(slot, fact_rows, optional=slot["sequence"] != 0) + if resolved is None: + gap = True + observations.append(None) + target_evidence.append( + { + "selector": slot["selector"], + "validation": slot["validation"], + "status": "projected", + } + ) + else: + if gap: + raise ValueError( + "Observed target subperiods must be contiguous from the anchor." + ) + value, evidence = resolved + if value <= 0: + raise ValueError("Observed target anchors must be positive.") + observations.append(value) + target_evidence.append({**evidence, "status": "observed"}) + if gap and growth is None: + raise ValueError("Projected target periods require a declared growth operand.") + last_observed = max( + index for index, value in enumerate(observations) if value is not None + ) + anchor = observations[last_observed] + target_weights = [_decimal(slot["weight"], "target weight") for slot in target] + + def numerator_at(root: Fraction) -> Fraction: + return sum( + (value if value is not None else anchor * root ** (index - last_observed)) + * target_weights[index] + for index, value in enumerate(observations) + ) / sum(target_weights) + + digits = row["rounding"]["digits"] + precision = digits + 8 + while precision <= 4096: + lower, upper, exact = certified_nth_root_bounds( + 1 + effective_growth, frequency, precision + ) + numerator_lower, numerator_upper = numerator_at(lower), numerator_at(upper) + factor_lower, factor_upper = ( + numerator_lower / denominator, + numerator_upper / denominator, + ) + rounded_lower, rounded_upper = ( + _round_nearest(factor_lower, digits), + _round_nearest(factor_upper, digits), + ) + if rounded_lower == rounded_upper: + break + precision *= 2 + else: + raise ValueError("Factor rounding cannot be certified unambiguously.") + factor = {"numerator": rounded_lower, "denominator": 10**digits} + if rounded_lower <= 0: + raise ValueError("Operational factor must be positive.") + if factor != row["expected_operational_factor"]: + raise ValueError( + f"Declared expected factor mismatch: computed {factor}; re-declaration is required." + ) + for index, evidence in enumerate(target_evidence): + evidence.update( + { + "sequence": index, + "weight": target[index]["weight"], + "projection_offset": 0 + if observations[index] is not None + else index - last_observed, + } + ) + if observations[index] is None: + evidence["projection_anchor"] = { + "aggregate_fact_key": target_evidence[last_observed][ + "aggregate_fact_key" + ] + } + receipt = { + "schema_version": 1, + "operation": OPERATION, + "operation_version": OPERATION_VERSION, + "factor_id": row["id"], + "declaration_sha256": factor_document_sha256(row), + "feed_identity": dict(feed_identity), + "source_period": row["source_period"], + "target_period": row["target_period"], + "source_schedule": source_evidence, + "target_schedule": target_evidence, + "subperiods_per_year": frequency, + "projection_policy": row["projection_policy"], + "denominator_mean": _rational(denominator), + "growth": growth_evidence, + "root_bounds": { + "lower": _rational(lower), + "upper": _rational(upper), + "exact": exact, + "decimal_places": precision, + "degree": frequency, + "radicand": _rational(1 + effective_growth), + }, + "numerator_mean_bounds": { + "lower": _rational(numerator_lower), + "upper": _rational(numerator_upper), + }, + "unrounded_factor_bounds": { + "lower": _rational(factor_lower), + "upper": _rational(factor_upper), + }, + "rounding": row["rounding"], + "operational_factor": factor, + "validity": row["validity"], + "evidence": row["evidence"], + "decision_references": row["decision_references"], + } + receipt["receipt_sha256"] = factor_document_sha256(receipt) + return factor, receipt + + +def validate_factor_context( + context: Mapping, selected_ids: Iterable[str] | None = None +) -> dict[str, dict]: + """Check selected declared evidence without claiming source authentication. + + Only selected declarations/evidence are validated or returned. Independent + profile edits therefore cannot change a branch's identity or availability. + """ + document = _closed( + context, + {"schema_version", "factors", "country", "feed_identity"}, + "factor context", + ) + if ( + type(document.get("schema_version")) is not int + or document["schema_version"] != 1 + ): + raise ValueError("Factor context requires schema_version 1.") + if "feed_identity" in document: + document["feed_identity"] = _closed_feed_identity( + document["feed_identity"], "factor context feed identity" + ) + entries = _list(document.get("factors"), "factor context entries") + by_id = {} + for raw in entries: + entry = _mapping(raw, "factor context entry") + declaration = _mapping(entry.get("declaration"), "factor declaration") + factor_id = declaration.get("id") + if not isinstance(factor_id, str) or not factor_id or factor_id in by_id: + raise ValueError("Factor ids must be unique nonempty text.") + by_id[factor_id] = entry + selected = list(by_id) if selected_ids is None else list(selected_ids) + result = {} + for factor_id in selected: + if factor_id not in by_id: + raise ValueError(f"Missing selected factor {factor_id!r}.") + entry = _closed( + by_id[factor_id], + {"declaration", "operational_factor", "receipt"}, + "factor context entry", + ) + declaration = _declaration(entry["declaration"]) + if ( + "feed_identity" in document + and document["feed_identity"] != declaration["feed_identity"] + ): + raise ValueError( + "Factor context feed identity is incompatible with the declaration." + ) + factor = entry.get("operational_factor") + _read_rational(factor, "declared operational factor") + if factor != declaration["expected_operational_factor"]: + raise ValueError( + "Declared operational factor differs from its expectation." + ) + receipt = _mapping(entry.get("receipt"), "factor receipt") + body = {key: value for key, value in receipt.items() if key != "receipt_sha256"} + if receipt.get("receipt_sha256") != factor_document_sha256(body): + raise ValueError("Factor receipt hash mismatch.") + if ( + type(receipt.get("schema_version")) is not int + or receipt.get("schema_version") != 1 + or receipt.get("operation") != declaration["operation"] + or type(receipt.get("operation_version")) is not int + or receipt.get("operation_version") != declaration["operation_version"] + or receipt.get("factor_id") != factor_id + or receipt.get("declaration_sha256") != factor_document_sha256(declaration) + or receipt.get("operational_factor") != factor + or receipt.get("feed_identity") != declaration["feed_identity"] + ): + raise ValueError("Factor declaration and receipt are incompatible.") + result[factor_id] = entry + return result + + +def replay_reference_factor( + declaration: Mapping, + facts: Iterable, + feed_identity: Mapping, + operational_factor: Mapping, + receipt: Mapping, +) -> None: + """Authenticate evidence by recomputing it from the loaded feed facts.""" + factor, recomputed = resolve_reference_factor(declaration, facts, feed_identity) + if factor != operational_factor or canonical_json(recomputed) != canonical_json( + receipt + ): + raise ValueError("Factor replay differs from declared result or evidence.") diff --git a/packages/microcosm-build/src/microcosm/build/reference_profiles.py b/packages/microcosm-build/src/microcosm/build/reference_profiles.py index 9a11ac22af..881fdbf496 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_profiles.py +++ b/packages/microcosm-build/src/microcosm/build/reference_profiles.py @@ -19,7 +19,13 @@ from microcosm.graph.canonical import canonical_json REFERENCE_PROFILE_RESOLVER_VERSION = "reference-profiles-v1" +FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION = "reference-profiles-v2" +ALLOWED_REFERENCE_PROFILE_RESOLVER_VERSIONS = frozenset( + {REFERENCE_PROFILE_RESOLVER_VERSION, FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION} +) +SCALE_MONEY_AND_INTERVALS = "scale_money_and_intervals" REQUIRES_REFERENCE_PROFILE_RESOLUTION = "requires_reference_profile_resolution" +REQUIRES_PREREQUISITES = "requires_prerequisites" REFERENCE_DOCUMENT_KEYS = frozenset( {"country", "schema_version", "hierarchy", "target_references"} ) @@ -47,7 +53,7 @@ def _sequence(value: object, context: str) -> list: def _selection_identity(receipt: Mapping) -> dict: - return { + identity = { key: receipt[key] for key in ( "resolver_version", @@ -57,6 +63,161 @@ def _selection_identity(receipt: Mapping) -> dict: "selection", ) } + if receipt.get("resolver_version") == FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION: + identity["selected_factor_identities"] = receipt["selected_factor_identities"] + return identity + + +def validate_reference_factor_evidence(receipt: Mapping) -> dict: + """Bind selected declarations and receipts without claiming feed authenticity.""" + from microcosm.build.reference_factors import validate_factor_context + + if receipt.get("resolver_version") == REFERENCE_PROFILE_RESOLVER_VERSION: + if "selected_factors" in receipt or "selected_factor_identities" in receipt: + raise ValueError("Legacy resolution cannot carry factor evidence.") + return {} + factors = _mapping(receipt.get("selected_factors"), "selected factors") + if not factors: + raise ValueError("Factor resolution needs selected factor evidence.") + validated = validate_factor_context( + {"schema_version": 1, "factors": list(factors.values())}, list(factors) + ) + if validated != factors: + raise ValueError("Selected factor identities do not match their declarations.") + identities = { + factor_id: { + "declaration_sha256": reference_document_sha256(entry["declaration"]), + "receipt_sha256": entry["receipt"]["receipt_sha256"], + } + for factor_id, entry in sorted(factors.items()) + } + if identities != receipt.get("selected_factor_identities"): + raise ValueError("Selected factor evidence identity mismatch.") + return validated + + +def _profile_metadata(transform: Mapping) -> dict: + metadata = _mapping(transform.get("metadata", {}), "profile metadata") + if any( + not isinstance(key, str) or not isinstance(value, str) or not value + for key, value in metadata.items() + ): + raise ValueError("Profile metadata requires nonempty strings.") + if set(metadata) & { + "activation_status", + "activation_reason", + "parking_reason", + "required_reference_profile", + "required_measurement_binding", + "reference_value_kind", + "reference_prerequisites", + "reference_prerequisites_remaining", + "reference_selection_sha256", + "effective_intervals_sha256", + "reference_profiles_resolved", + }: + raise ValueError("A profile cannot override resolution identities.") + return metadata + + +def _explicit_names(transform: Mapping, field: str) -> list[str]: + names = _sequence(transform.get(field), field) + if ( + not names + or any(not isinstance(name, str) or not name for name in names) + or len(set(names)) != len(names) + ): + raise ValueError("A transformation needs unique explicit reference names.") + return names + + +def _companion_key(row: Mapping, *, scope: bool = False) -> bytes: + selector = _mapping(row.get("ledger_selector"), "companion selector") + excluded = {"aggregate_fact_key", "source_record_id"} + if not scope: + excluded.update({"source_measure_id", "source_concept"}) + else: + excluded.add("dimension_values") + payload = { + "selector": { + key: value for key, value in selector.items() if key not in excluded + }, + "entity": row.get("entity"), + "period": row.get("period"), + "reference_set": row.get("metadata", {}).get("reference_set"), + } + if not scope: + payload["filter"] = row.get("filter") + return canonical_json(payload) + + +def _validate_companions(transform: Mapping, by_name: Mapping) -> tuple[list, list]: + money = _explicit_names(transform, "reference_names") + counts = _explicit_names(transform, "count_reference_names") + if set(money) & set(counts) or len(money) != len(counts): + raise ValueError("Money and count rosters need disjoint complete companions.") + for kind, names in (("money", money), ("count", counts)): + if set(names) - set(by_name): + raise ValueError("A profile names missing companion references.") + if any( + by_name[name].get("metadata", {}).get("reference_value_kind") != kind + for name in names + ): + raise ValueError( + "Money and count rosters require matching declared value kinds." + ) + scopes = {_companion_key(by_name[name], scope=True) for name in names} + complete = { + name + for name, row in by_name.items() + if isinstance(row.get("ledger_selector"), Mapping) + and _companion_key(row, scope=True) in scopes + } + if complete != set(names): + raise ValueError("Money and count rosters are incomplete companions.") + money_keys = [_companion_key(by_name[name]) for name in money] + count_keys = [_companion_key(by_name[name]) for name in counts] + if len(set(money_keys)) != len(money) or set(money_keys) != set(count_keys): + raise ValueError("Money and count rosters must match one-to-one companions.") + if {_companion_key(by_name[name], scope=True) for name in money} & { + _companion_key(by_name[name], scope=True) for name in counts + }: + raise ValueError("Money and count companions must select distinct measures.") + return money, counts + + +def _satisfy_factor_prerequisite(row: dict, dimension: str, binding: str) -> list: + metadata = row.setdefault("metadata", {}) + if metadata.get("activation_status") != REQUIRES_PREREQUISITES: + raise ValueError( + "Money scaling requires the explicit prerequisite parking status." + ) + if ( + metadata.get("required_reference_profile") != dimension + or metadata.get("required_measurement_binding") != binding + ): + raise ValueError("Money scaling has incompatible reference prerequisites.") + try: + prerequisites = json.loads(metadata.get("reference_prerequisites", "")) + except (TypeError, ValueError) as error: + raise ValueError( + "Reference prerequisites must be an explicit JSON list." + ) from error + required = {f"reference_profile:{dimension}", f"measurement:{binding}"} + if ( + not isinstance(prerequisites, list) + or any(not isinstance(item, str) or not item for item in prerequisites) + or len(set(prerequisites)) != len(prerequisites) + or set(prerequisites) != required + ): + raise ValueError( + "Reference prerequisites must name the profile and measurement." + ) + remaining = [ + item for item in prerequisites if item != f"reference_profile:{dimension}" + ] + metadata["reference_prerequisites_remaining"] = canonical_json(remaining).decode() + return remaining def resolve_reference_profiles( @@ -64,13 +225,16 @@ def resolve_reference_profiles( profile_declarations: Mapping, selection: Mapping, interval_document: Mapping | None = None, + *, + factor_context: Mapping | None = None, ) -> tuple[dict, dict | None, dict]: """Return effective references, effective intervals and a bound receipt. Only selected declarations enter selection identity. An unavailable profile refuses; an explicitly deferred dimension is reported without claiming its - transformations ran. Interval transformations are intentionally unsupported - until a consumer declares their complete transformation contract. + transformations ran. Money scaling consumes declared factor evidence; + compilation authenticates it against the feed. Interval scaling is reserved + for the subsequent interval implementation. Resource headers are bound into the base identity; effective references use the compiler's closed document shape. """ @@ -120,6 +284,22 @@ def resolve_reference_profiles( deferred.append(dimension) chosen[dimension] = {"name": name, "declaration": profile} resolved_selection[dimension] = name + factor_ids = set() + for choice in chosen.values(): + for raw_transform in choice["declaration"].get("transformations", []): + transform = _mapping(raw_transform, "reference transformation") + if transform.get("operation") == SCALE_MONEY_AND_INTERVALS: + if _sequence(transform.get("interval_table_ids"), "interval table ids"): + raise ValueError("interval scaling lands in r2b") + factor_id = transform.get("factor_id") + if not isinstance(factor_id, str) or not factor_id: + raise ValueError("Money scaling needs a declared factor id.") + factor_ids.add(factor_id) + selected_factors = {} + if factor_ids: + from microcosm.build.reference_factors import validate_factor_context + + selected_factors = validate_factor_context(factor_context, sorted(factor_ids)) receipt = { "resolver_version": REFERENCE_PROFILE_RESOLVER_VERSION, "base_references_sha256": reference_document_sha256(base), @@ -129,12 +309,27 @@ def resolve_reference_profiles( "selected_declarations_sha256": reference_document_sha256(chosen), "selection": resolved_selection, } + if selected_factors: + receipt.update( + resolver_version=FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION, + selected_factors=_copy(selected_factors), + selected_factor_identities={ + factor_id: { + "declaration_sha256": reference_document_sha256( + entry["declaration"] + ), + "receipt_sha256": entry["receipt"]["receipt_sha256"], + } + for factor_id, entry in sorted(selected_factors.items()) + }, + ) selection_hash = reference_document_sha256(_selection_identity(receipt)) interval_hash = None if intervals is None else reference_document_sha256(intervals) transformed, policies = {}, [] for dimension, choice in chosen.items(): for raw_transform in choice["declaration"].get("transformations", []): transform = _mapping(raw_transform, "reference transformation") + operation = transform.get("operation") allowed = { "reference_names", "operation", @@ -143,30 +338,113 @@ def resolve_reference_profiles( "notes", "target_label", } + if operation == SCALE_MONEY_AND_INTERVALS: + allowed = { + "reference_names", + "count_reference_names", + "operation", + "factor_id", + "interval_table_ids", + "required_measurement_binding", + "metadata", + } if set(transform) - allowed: raise ValueError("Unknown reference transformation fields.") - if transform.get("operation") != ALLOCATED_RESIDUAL_BY_RATIO: + if operation not in { + ALLOCATED_RESIDUAL_BY_RATIO, + SCALE_MONEY_AND_INTERVALS, + }: raise ValueError("Unsupported reference profile transformation.") + metadata = _profile_metadata(transform) + if _carried_value_keys(transform): + raise ValueError("Reference transformations carry observed values.") + if operation == SCALE_MONEY_AND_INTERVALS: + tables = _sequence( + transform.get("interval_table_ids"), "interval table ids" + ) + if tables: + raise ValueError("interval scaling lands in r2b") + binding = transform.get("required_measurement_binding") + if not isinstance(binding, str) or not binding: + raise ValueError( + "Money scaling needs a required measurement binding." + ) + money, counts = _validate_companions(transform, by_name) + factor_id = transform["factor_id"] + factor = selected_factors[factor_id] + declaration = factor["declaration"] + if declaration["purpose"] != "profile_input": + raise ValueError("A diagnostic factor cannot be a profile input.") + rational = factor["operational_factor"] + weight = rational["numerator"] / rational["denominator"] + for name in [*money, *counts]: + if name in transformed: + raise ValueError( + f"Duplicate or incompatible transformation: {name!r}." + ) + row = by_name[name] + if ( + row.get("ledger_selector", {}).get("period_value") + != declaration["source_period"] + or row.get("period") != declaration["target_period"] + ): + raise ValueError( + "Factor and reference source/target periods are incompatible." + ) + remaining = _satisfy_factor_prerequisite(row, dimension, binding) + if name in money: + if row.get( + "value_operation", "identity" + ) != "identity" or row.get("value_operands", []): + raise ValueError( + "Money scaling requires an untransformed source reference." + ) + selector = _mapping( + row.get("ledger_selector"), "money selector" + ) + key = selector.get("aggregate_fact_key") + if not isinstance(key, str) or not key: + raise ValueError( + "Money scaling needs a singleton source fact key." + ) + row["value_operation"] = "linear_combination" + row["value_operands"] = [ + { + "aggregate_fact_key": key, + "expected_member_count": 1, + "weight": weight, + } + ] + row_metadata = row.setdefault("metadata", {}) + row_metadata.update(metadata) + row_metadata["reference_selection_sha256"] = selection_hash + row_metadata["reference_profiles_resolved"] = "1" + if interval_hash is not None: + row_metadata["effective_intervals_sha256"] = interval_hash + transformed[name] = { + "dimension": dimension, + "profile": choice["name"], + "operation": "linear_combination" + if name in money + else "identity", + "factor_id": factor_id, + "operational_factor": _copy(rational), + "metadata": metadata, + "operand_selectors": _copy(row.get("value_operands", [])), + "source_period": row.get("ledger_selector", {}).get( + "period_value" + ), + "target_period": row.get("period"), + "unresolved_prerequisites": remaining, + } + policies.append( + {"dimension": dimension, "profile": choice["name"], **metadata} + ) + continue names = _sequence(transform.get("reference_names"), "transformed names") if not names or any(not isinstance(name, str) for name in names): raise ValueError("A transformation needs explicit reference names.") operands = _sequence(transform.get("value_operands"), "value operands") - metadata = _mapping(transform.get("metadata", {}), "profile metadata") - if any( - not isinstance(key, str) or not isinstance(value, str) or not value - for key, value in metadata.items() - ): - raise ValueError("Profile metadata requires nonempty strings.") - if set(metadata) & { - "activation_status", - "required_reference_profile", - "reference_selection_sha256", - "effective_intervals_sha256", - "reference_profiles_resolved", - }: - raise ValueError("A profile cannot override resolution identities.") - if _carried_value_keys(transform): - raise ValueError("Reference transformations carry observed values.") for name in names: if name not in by_name: raise ValueError(f"Profile names missing reference {name!r}.") @@ -242,12 +520,16 @@ def validate_reference_resolution( ) -> dict: """Refuse stale effective documents, receipts or interval companions.""" resolution = _copy(_mapping(receipt, "reference resolution receipt")) - if resolution.get("resolver_version") != REFERENCE_PROFILE_RESOLVER_VERSION: + if ( + resolution.get("resolver_version") + not in ALLOWED_REFERENCE_PROFILE_RESOLVER_VERSIONS + ): raise ValueError("Unknown reference resolver version.") claimed_receipt_hash = resolution.pop("receipt_sha256", None) if claimed_receipt_hash != reference_document_sha256(resolution): raise ValueError("Reference resolution receipt hash mismatch.") resolution["receipt_sha256"] = claimed_receipt_hash + factors = validate_reference_factor_evidence(resolution) actual = reference_document_sha256(document) if actual != resolution.get("effective_references_sha256") or ( references_sha256 is not None and actual != references_sha256 @@ -263,7 +545,7 @@ def validate_reference_resolution( interval_document ) != resolution.get("effective_intervals_sha256"): raise ValueError("Effective interval document hash mismatch.") - names = [] + names, used_factors = [], set() for row in document.get("target_references", ()): metadata = row.get("metadata", {}) if metadata.get("reference_profiles_resolved"): @@ -273,6 +555,44 @@ def validate_reference_resolution( != resolution.get("effective_intervals_sha256") ): raise ValueError("Effective reference profile identity mismatch.") + action = resolution.get("transformations", {}).get(row["name"], {}) + if "factor_id" in action: + factor_id = action["factor_id"] + if factor_id not in factors: + raise ValueError( + "A transformed reference has missing factor evidence." + ) + used_factors.add(factor_id) + entry = factors[factor_id] + declaration = entry["declaration"] + rational = entry["operational_factor"] + if ( + action.get("operational_factor") != rational + or action.get("source_period") != declaration["source_period"] + or action.get("target_period") != declaration["target_period"] + ): + raise ValueError("Effective reference factor identity mismatch.") + if action.get("operation") == "linear_combination": + expected = [ + { + "aggregate_fact_key": row.get("ledger_selector", {}).get( + "aggregate_fact_key" + ), + "expected_member_count": 1, + "weight": rational["numerator"] / rational["denominator"], + } + ] + if ( + row.get("value_operation") != "linear_combination" + or row.get("value_operands") != expected + ): + raise ValueError( + "Effective money factor must be applied exactly once." + ) + elif action.get("operation") != "identity": + raise ValueError("Unsupported factor transformation action.") if sorted(names) != resolution.get("transformed_names"): raise ValueError("Resolution receipt transformed names mismatch.") + if used_factors != set(factors): + raise ValueError("Resolution receipt has unused selected factor evidence.") return resolution diff --git a/packages/microcosm-build/src/microcosm/build/transport/compose.py b/packages/microcosm-build/src/microcosm/build/transport/compose.py index 211cf380a9..82740818d2 100644 --- a/packages/microcosm-build/src/microcosm/build/transport/compose.py +++ b/packages/microcosm-build/src/microcosm/build/transport/compose.py @@ -68,7 +68,10 @@ ATOMIC_GEOGRAPHY_VALIDATION_TYPE, ATOMIC_SUPPORT_TYPE, ) -from microcosm.build.ledger_artifact import CHRONICLE_FEED_RESOURCE +from microcosm.build.ledger_artifact import ( + CHRONICLE_FEED_RESOURCE, + chronicle_feed_identity, +) from microcosm.build.reference_profiles import resolve_reference_profiles from microcosm.calibrate.ordered_kernels import OUTPUT_TYPES from microcosm.graph import ( @@ -386,14 +389,28 @@ def reference_profile_view( else {name: value for name, value in selection.items() if name in dimensions} ) intervals = declarations.get("interval_resource") - return resolve_reference_profiles( + factor_context_resource = declarations.get("factor_context_resource") + view = resolve_reference_profiles( _raw_transport_resource(spec, resource), declarations, selected, interval_document=None if intervals is None else _raw_transport_resource(spec, intervals), + factor_context=None + if factor_context_resource is None + else _raw_transport_resource(spec, factor_context_resource), ) + if _has_resource(spec, CHRONICLE_FEED_RESOURCE): + feed_pin = _raw_transport_resource(spec, CHRONICLE_FEED_RESOURCE) + for entry in view[2].get("selected_factors", {}).values(): + if entry["declaration"]["feed_identity"] != chronicle_feed_identity( + feed_pin + ): + raise ValueError( + "Selected factor context is incompatible with the declared feed." + ) + return view def transport_resource( @@ -536,6 +553,16 @@ def validate_transport_activation(spec: Mapping[str, object]) -> None: missing = [] # Resolve first so activation never inspects an executable profile's raw rows. reference_profile_view(spec) + if _has_resource(spec, "reference_profiles") and _has_resource(spec, "scenarios"): + checked_selections = {canonical_json({})} + for scenario in _sequence( + _raw_transport_resource(spec, "scenarios").get("scenarios"), "scenarios" + ): + knobs = _mapping(_mapping(scenario, "scenario").get("knobs", {}), "knobs") + identity = canonical_json(knobs) + if identity not in checked_selections: + reference_profile_view(spec, knobs) + checked_selections.add(identity) selections = ( tuple(_declared_resource_selections(transport_resource(spec, GRAPH_RESOURCE))) if _has_resource(spec, GRAPH_RESOURCE) diff --git a/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py b/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py index 2752a924a0..8e3c14221a 100644 --- a/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py +++ b/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py @@ -53,6 +53,7 @@ import microcosm.build.country_spec as country_spec_module import microcosm.build.ledger_artifact as ledger_artifact_module import microcosm.build.ledger_targets as ledger_targets_module +import microcosm.build.reference_factors as reference_factors_module import microcosm.build.reference_profiles as reference_profiles_module import microcosm.calibrate.artifacts as calibrate_artifacts_module import microcosm.calibrate.hierarchy as hierarchy_module @@ -71,7 +72,9 @@ compile_ledger_target_references, ) from microcosm.build.reference_profiles import ( + ALLOWED_REFERENCE_PROFILE_RESOLVER_VERSIONS, REFERENCE_DOCUMENT_KEYS, + validate_reference_factor_evidence, validate_reference_resolution, ) from microcosm.calibrate import TargetRegistry, TargetSpec @@ -274,8 +277,7 @@ def _surface_resolution(document: Mapping, registry: TargetRegistry) -> Mapping body = dict(resolution) claimed = body.pop("receipt_sha256", None) if ( - body.get("resolver_version") - != reference_profiles_module.REFERENCE_PROFILE_RESOLVER_VERSION + body.get("resolver_version") not in ALLOWED_REFERENCE_PROFILE_RESOLVER_VERSIONS or claimed != reference_profiles_module.reference_document_sha256(body) ): raise ValueError("Surface reference resolution receipt hash mismatch.") @@ -291,6 +293,7 @@ def _surface_resolution(document: Mapping, registry: TargetRegistry) -> Mapping ) from error if selection != resolution.get("reference_selection_sha256"): raise ValueError("Surface reference selection identity mismatch.") + validate_reference_factor_evidence(resolution) for spec in resolved: if spec.metadata.get( "reference_selection_sha256" @@ -398,6 +401,30 @@ def compile_target_surface( artifact = load_ledger_consumer_artifact( facts_path, expected_facts_sha256=expected_facts_sha256, feed_pin=feed_pin ) + if reference_resolution is not None: + for entry in reference_resolution.get("selected_factors", {}).values(): + factor_feed_identity = ledger_artifact_module.chronicle_feed_identity( + feed_pin + if feed_pin is not None + else entry["declaration"]["feed_identity"] + ) + if feed_pin is None: + ledger_artifact_module.validate_chronicle_feed_pin( + artifact, factor_feed_identity + ) + if (artifact.manifest or {}).get( + "source_commit" + ) != factor_feed_identity["source_commit"]: + raise ValueError( + "Factor source commit cannot be authenticated without a feed pin." + ) + reference_factors_module.replay_reference_factor( + entry["declaration"], + artifact.facts, + factor_feed_identity, + entry["operational_factor"], + entry["receipt"], + ) registry = compile_ledger_target_references( artifact.facts, references, country=country ) @@ -489,6 +516,7 @@ def _optional_float(value: float) -> float | None: ledger_targets_module, ledger_artifact_module, chronicle_epoch_module, + reference_factors_module, reference_profiles_module, registry_module, target_module, diff --git a/packages/microcosm-build/tests/engine_free/shared/test_calibration_columns.py b/packages/microcosm-build/tests/engine_free/shared/test_calibration_columns.py index c3eda2039d..283c146181 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_calibration_columns.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_calibration_columns.py @@ -182,10 +182,14 @@ def test_receipt_age_indicators_retain_the_published_strata_boundaries(): def test_all_active_calibration_bindings_enter_the_small_frame_matrix(): frame = _frame(prepare_calibration_columns(_tables(), _bindings())) root = paths_for("microcosm-build").package / "src/microcosm/build/nz" + profiles = json.loads((root / "reference_profiles.json").read_text()) effective, _, _ = resolve_reference_profiles( json.loads((root / "target_references.json").read_text()), - json.loads((root / "reference_profiles.json").read_text()), + profiles, {}, + factor_context=json.loads( + (root / profiles["factor_context_resource"]).read_text() + ), ) references = [ ref diff --git a/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py b/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py index 1307e09d06..557e6216da 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py @@ -5,8 +5,10 @@ import hashlib import json import os +import pickle import runpy from argparse import ArgumentParser, Namespace +from copy import deepcopy from dataclasses import replace from pathlib import Path @@ -18,6 +20,7 @@ CONSUMER_ARTIFACT_SCHEMA_VERSION, ChronicleFeedPinMismatchError, LedgerConsumerArtifact, + LexicalFloat, add_ledger_artifact_args, load_ledger_consumer_artifact, resolve_ledger_artifact, @@ -87,6 +90,65 @@ def test_loads_bare_consumer_facts_file(tmp_path): assert provenance["schema_version"] is None +def test_authenticated_float_retains_lexical_token_without_changing_json(tmp_path): + facts_path = tmp_path / "consumer_facts.jsonl" + original = '{"aggregate_fact_key":"decimal","value":1.2500e2}\n' + facts_path.write_text(original) + facts_sha = hashlib.sha256(original.encode()).hexdigest() + artifact = load_ledger_consumer_artifact( + facts_path, expected_facts_sha256=facts_sha + ) + value = artifact.facts[0]["value"] + assert isinstance(value, LexicalFloat) + assert not hasattr(value, "__dict__") + assert value.lexical_token == "1.2500e2" + assert value == 125.0 + assert hash(value) == hash(125.0) + assert json.dumps(value).encode() == json.dumps(125.0).encode() + assert json.dumps(artifact.facts[0], sort_keys=True) == json.dumps( + json.loads(original), sort_keys=True + ) + assert artifact.facts_sha256 == facts_sha + + +@pytest.mark.parametrize("protocol", range(pickle.HIGHEST_PROTOCOL + 1)) +def test_authenticated_float_pickle_preserves_lexical_token(tmp_path, protocol): + facts_path = tmp_path / "consumer_facts.jsonl" + facts_path.write_text('{"aggregate_fact_key":"decimal","value":1.2500e2}\n') + value = load_ledger_consumer_artifact(facts_path).facts[0]["value"] + + restored = pickle.loads(pickle.dumps(value, protocol=protocol)) + + assert isinstance(restored, LexicalFloat) + assert restored.lexical_token == "1.2500e2" + assert restored == value + assert not hasattr(restored, "__dict__") + + +def test_authenticated_float_deepcopy_preserves_lexical_token(tmp_path): + facts_path = tmp_path / "consumer_facts.jsonl" + facts_path.write_text('{"aggregate_fact_key":"decimal","value":1.2500e2}\n') + value = load_ledger_consumer_artifact(facts_path).facts[0]["value"] + + restored = deepcopy(value) + + assert isinstance(restored, LexicalFloat) + assert restored.lexical_token == "1.2500e2" + assert restored == value + assert not hasattr(restored, "__dict__") + + +@pytest.mark.parametrize("token", ["125", "9007199254740993", str(10**100 + 1)]) +def test_authenticated_integer_tokens_stay_exact_integers(tmp_path, token): + facts_path = tmp_path / "consumer_facts.jsonl" + facts_path.write_text('{"aggregate_fact_key":"integer","value":' + token + "}\n") + + value = load_ledger_consumer_artifact(facts_path).facts[0]["value"] + + assert type(value) is int + assert value == int(token) + + def test_loads_artifact_directory_and_records_provenance(tmp_path): rows = [_fact_row(), _fact_row(assertion="source_projection")] artifact_dir = _write_artifact_dir(tmp_path, rows) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py new file mode 100644 index 0000000000..448085b354 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py @@ -0,0 +1,256 @@ +"""NZ feed operands, reviewed factors, and the observed-quarter re-declaration.""" + +from __future__ import annotations + +import copy +import json +import os +from decimal import Decimal, localcontext +from fractions import Fraction +from pathlib import Path + +import pytest + +from microcosm.build.ledger_artifact import ( + LexicalFloat, + load_ledger_consumer_artifact, + validate_chronicle_feed_pin, +) +from microcosm.build.ledger_targets import fact_matches_selector +from microcosm.build.reference_factors import ( + replay_reference_factor, + resolve_reference_factor, + validate_factor_context, +) +from test_support.paths import paths_for +from tools.generate_nz_reference_aging import ( + _OPERANDS, + build_reference_aging, +) + +_PATHS = paths_for("microcosm-build") +_SPEC = _PATHS.package / "src/microcosm/build/nz" +_EXPECTED = { + "ird_ty2024_to_ty2027_low": 1115056, + "ird_ty2024_to_ty2027_central": 1117109, + "ird_ty2024_to_ty2027_high": 1119158, + "p1_ty2026_to_ty2027_low": 1026690, + "p1_ty2026_to_ty2027_central": 1028580, + "p1_ty2026_to_ty2027_high": 1030467, + "observed_ty2026_over_ty2024": 1086069, +} + + +def _document(): + return json.loads((_SPEC / "reference_aging.json").read_text()) + + +def _entry(factor_id="ird_ty2024_to_ty2027_central"): + return next( + entry + for entry in _document()["factors"] + if entry["declaration"]["id"] == factor_id + ) + + +def _fraction(rational): + return Fraction(rational["numerator"], rational["denominator"]) + + +@pytest.fixture(scope="module") +def artifact(): + root = os.environ.get("NZ_CHRONICLE_ARTIFACT") + if not root: + pytest.skip("NZ_CHRONICLE_ARTIFACT is not set") + loaded = load_ledger_consumer_artifact(Path(root)) + validate_chronicle_feed_pin(loaded, _document()["feed_identity"]) + return loaded + + +@pytest.fixture(scope="module") +def operand_facts(artifact): + keys = {f"ledger.aggregate_fact.v2:{suffix}" for _, _, suffix, _ in _OPERANDS} + keys.add("ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25") + return tuple(fact for fact in artifact.facts if fact["aggregate_fact_key"] in keys) + + +def test_generated_aging_resource_reproduces_pinned_feed_and_all_receipts(artifact): + assert build_reference_aging(artifact) == _document() + assert set(validate_factor_context(_document())) == set(_EXPECTED) + identity = _document()["feed_identity"] + assert set(identity) == { + "source_commit", + "facts_sha256", + "manifest_sha256", + "artifact_schema_version", + "consumer_fact_schema_versions", + "consumer_fact_schema_sha256", + "fact_row_count", + } + for entry in _document()["factors"]: + assert entry["declaration"]["feed_identity"] == identity + assert entry["receipt"]["feed_identity"] == identity + + +@pytest.mark.parametrize("factor_id", list(_EXPECTED)) +def test_all_six_factors_and_observed_diagnostic_are_exact(factor_id, operand_facts): + entry = _entry(factor_id) + declaration = entry["declaration"] + expected = {"numerator": _EXPECTED[factor_id], "denominator": 1000000} + factor, receipt = resolve_reference_factor( + declaration, operand_facts, _document()["feed_identity"] + ) + assert factor == expected == declaration["expected_operational_factor"] + assert receipt == entry["receipt"] + assert receipt["operation"] == "projected_period_average_ratio" + assert receipt["operation_version"] == 1 + assert receipt["subperiods_per_year"] == 4 + assert _fraction(receipt["denominator_mean"]) == ( + Fraction("1670.0725") if factor_id.startswith("p1_") else Fraction("1537.7225") + ) + assert declaration["purpose"] == ( + "diagnostic" if factor_id.startswith("observed_") else "profile_input" + ) + replay_reference_factor( + declaration, operand_facts, _document()["feed_identity"], factor, receipt + ) + + +def test_each_reviewed_operand_resolves_once_with_exact_lexical_evidence(artifact): + for line, period, suffix, expected in _OPERANDS: + fact = artifact.facts[line - 1] + assert fact["aggregate_fact_key"] == f"ledger.aggregate_fact.v2:{suffix}" + assert fact["period"]["value"] == period + assert fact["value"].lexical_token == expected + checked = set() + for entry in _document()["factors"]: + declaration = entry["declaration"] + slots = [*declaration["source_schedule"], *declaration["target_schedule"]] + if declaration["growth"]: + slots.append(declaration["growth"]) + for slot in slots: + identity = json.dumps( + {"selector": slot["selector"], "validation": slot["validation"]}, + sort_keys=True, + ) + if identity in checked: + continue + checked.add(identity) + matches = [ + fact + for fact in artifact.facts + if fact_matches_selector(fact, slot["selector"]) + ] + if not matches: + assert slot in declaration["target_schedule"] + assert slot["projection_offset"] > 0 + continue + (fact,) = matches + validation = slot["validation"] + assert fact["observed_measure"]["unit"] == validation["unit"] + assert fact["source"]["source_sha256"] == validation["source_sha256"] + assert fact["source"]["vintage"] == validation["source_vintage"] + assert fact["entity"]["role"] == validation["entity_role"] + assert fact["assertion"] == validation["assertion"] + assert fact["provenance_class"] == validation["provenance_class"] + for key in ("start_date", "end_date"): + assert ( + fact["period_coverage"][key] == validation["period_coverage"][key] + ) + + +def test_treasury_fy2027_source_column_uses_chronicle_2026_and_2027_refuses( + operand_facts, +): + declaration = _entry()["declaration"] + assert declaration["growth"]["selector"]["period_value"] == 2026 + assert declaration["growth"]["validation"]["source_column_id"] == ( + "year_ending_30_june_2027" + ) + declaration["growth"]["selector"]["period_value"] = 2027 + with pytest.raises(ValueError, match="resolve exactly once"): + resolve_reference_factor( + declaration, operand_facts, _document()["feed_identity"] + ) + + +def test_p1_high_rounds_once_to_1030467_and_old_truncation_refuses(operand_facts): + declaration = _entry("p1_ty2026_to_ty2027_high")["declaration"] + assert declaration["source_period"] == 2026 + assert [ + row["selector"]["period_value"] for row in declaration["source_schedule"] + ] == ["2025-Q2", "2025-Q3", "2025-Q4", "2026-Q1"] + declaration["expected_operational_factor"]["numerator"] = 1030466 + with pytest.raises(ValueError, match="expected factor mismatch"): + resolve_reference_factor( + declaration, operand_facts, _document()["feed_identity"] + ) + + +def test_root_enclosure_certifies_no_rounded_quarters_and_irrational_root(): + for factor_id in list(_EXPECTED)[:6]: + entry = _entry(factor_id) + receipt = entry["receipt"] + delta = Fraction(entry["declaration"]["growth"]["scenario_delta"]) + radicand = 1 + (Fraction("2.7") + delta) / 100 + lower = _fraction(receipt["root_bounds"]["lower"]) + upper = _fraction(receipt["root_bounds"]["upper"]) + assert lower**4 < radicand < upper**4 + assert receipt["root_bounds"]["exact"] is False + denominator = _fraction(receipt["denominator_mean"]) + assert _fraction(receipt["numerator_mean_bounds"]["lower"]) == ( + Fraction("1700.68") * sum(lower**i for i in range(4)) / 4 + ) + for bound in ("lower", "upper"): + value = _fraction(receipt["unrounded_factor_bounds"][bound]) + assert ( + value + == _fraction(receipt["numerator_mean_bounds"][bound]) / denominator + ) + assert round(value * 1000000) == _EXPECTED[factor_id] + + +def test_september_observation_reanchors_and_requires_reviewed_redeclaration( + operand_facts, +): + declaration = _entry()["declaration"] + anchor = next( + fact for fact in operand_facts if fact["period"]["value"] == "2026-Q2" + ) + september = copy.deepcopy(anchor) + september["aggregate_fact_key"] = "ledger.aggregate_fact.v2:synthetic_september" + september["period"]["value"] = "2026-Q3" + september["layout"]["record_set_id"] = "stats_nz.qes.awe.2026q3" + september["period_coverage"].update( + {"start_date": "2026-07-01", "end_date": "2026-09-30"} + ) + september["value"] = LexicalFloat("1750.00") + declaration["feed_identity"]["facts_sha256"] = "9" * 64 + facts = (*operand_facts, september) + with pytest.raises(ValueError, match="expected factor mismatch.*re-declaration"): + resolve_reference_factor(declaration, facts, declaration["feed_identity"]) + with localcontext() as context: + context.prec = 80 + q = (Decimal("1.027").sqrt()).sqrt() + numerator = (Decimal("1700.68") + Decimal(1750) * (1 + q + q * q)) / 4 + expected = round(numerator / Decimal("1537.7225") * 1000000) + declaration["expected_operational_factor"]["numerator"] = expected + factor, receipt = resolve_reference_factor( + declaration, facts, declaration["feed_identity"] + ) + assert factor["numerator"] == expected + assert [slot["status"] for slot in receipt["target_schedule"]] == [ + "observed", + "observed", + "projected", + "projected", + ] + lower = _fraction(receipt["root_bounds"]["lower"]) + assert ( + _fraction(receipt["numerator_mean_bounds"]["lower"]) + == (Fraction("1700.68") + 1750 * (1 + lower + lower**2)) / 4 + ) + for slot in receipt["target_schedule"][2:]: + assert slot["projection_anchor"] == { + "aggregate_fact_key": september["aggregate_fact_key"] + } diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py index 7e9fba0e58..3a561ac84c 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py @@ -158,7 +158,11 @@ from hypothesis import assume, given, settings from hypothesis import strategies as st +from microcosm.build.chronicle_epoch import ( + is_accepted_consumer_artifact_schema_version, +) from microcosm.build.country_spec import load_country_spec +from microcosm.build.ledger_artifact import chronicle_feed_identity from microcosm.build.ledger_targets import ( LedgerTargetReference, compile_ledger_target_references, @@ -305,7 +309,8 @@ def rulespec_commit_mentions(value: object) -> set[str]: "rulespec" in any case); - the value, at any depth, of a key that contains "commit" in any case, unless the key's mapping is a foreign record (its repository - attribution lacks "rulespec") and neither the key nor an enclosing + attribution lacks "rulespec", or a complete Chronicle identity below + ``feed_identity``) and neither the key nor an enclosing key contains "rulespec". A foreign record cancels the context it sits in, except that its commit @@ -316,7 +321,13 @@ def rulespec_commit_mentions(value: object) -> set[str]: found: set[str] = set() - def visit(node: object, *, rulespec_context: bool, commit_value: bool) -> None: + def visit( + node: object, + *, + rulespec_context: bool, + commit_value: bool, + feed_identity_record: bool = False, + ) -> None: if isinstance(node, Mapping): repositories = [ repository @@ -327,7 +338,17 @@ def visit(node: object, *, rulespec_context: bool, commit_value: bool) -> None: rulespec_record = any( "rulespec" in repository.lower() for repository in repositories ) - foreign = named and not rulespec_record + artifact_identity = False + if feed_identity_record and is_accepted_consumer_artifact_schema_version( + node.get("artifact_schema_version") + ): + try: + chronicle_feed_identity(node) + except ValueError: + pass + else: + artifact_identity = True + foreign = (named or artifact_identity) and not rulespec_record if rulespec_record: commit_value = True elif foreign: @@ -344,6 +365,7 @@ def visit(node: object, *, rulespec_context: bool, commit_value: bool) -> None: child, rulespec_context=rulespec_context or "rulespec" in name, commit_value=commit_value or commit_key or "rulespec" in name, + feed_identity_record=name == "feed_identity", ) elif isinstance(node, list): for child in node: @@ -1193,7 +1215,12 @@ def test_each_set_is_a_self_identifying_nz_reference_resource( assert document["country"] == "nz" assert document["reference_set"] == reference_set expected_operations = ( - ["identity", "rolled_forward_by_ratio", "allocated_residual_by_ratio"] + [ + "identity", + "rolled_forward_by_ratio", + "allocated_residual_by_ratio", + "linear_combination", + ] if reference_set == "calibration" else ["identity"] ) @@ -1452,6 +1479,43 @@ def test_gate_profile_requires_exactly_the_calibration_families(self) -> None: class TestRulespecPin: + @pytest.mark.parametrize( + "case", + [ + "canonical", + "unattributed", + "incomplete", + "explicit_commit", + "prose", + "rulespec_context", + "wrong_schema", + ], + ) + def test_chronicle_identity_scope_preserves_rulespec_mentions(self, case) -> None: + identity = _load("reference_aging.json")["feed_identity"] + commit = identity["source_commit"] + payload = {"feed_identity": identity} + expected = set() + if case == "unattributed": + payload = {"other": identity} + expected = {commit} + elif case == "incomplete": + identity.pop("manifest_sha256") + expected = {commit} + elif case == "explicit_commit": + identity["rulespec_nz_commit"] = "c0ffee1" + expected = {"c0ffee1"} + elif case == "prose": + identity["notes"] = "RuleSpec-nz deadbee" + expected = {"deadbee"} + elif case == "rulespec_context": + payload = {"rulespec": payload} + expected = {commit} + elif case == "wrong_schema": + identity["artifact_schema_version"] = "unknown" + expected = {commit} + assert rulespec_commit_mentions(payload) == expected + def test_every_rulespec_commit_named_anywhere_was_reviewed_on_main(self) -> None: pin = _load("axiom_rules_bindings.json")["rulespec"] mentions = rulespec_commit_mentions(_package_payloads()) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_target_references.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_target_references.py index 004785b9e9..3c6ebed1c1 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_target_references.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_target_references.py @@ -111,6 +111,7 @@ def _effective_rows(profile="mar"): _document("target_references.json"), _document("reference_profiles.json"), {"census_residual_allocation": profile, "aging_index": "central"}, + factor_context=_document("reference_aging.json"), ) return document["target_references"] @@ -202,6 +203,11 @@ def test_residual_profiles_have_exact_recipient_rosters_and_preserve_other_targe if "households_by_size" in row["name"] } == {*REGIONS, "99"} for before, after in zip(raw, effective, strict=True): + if before["family"] == "income": + assert ( + after["metadata"]["activation_status"] == "requires_prerequisites" + ) + continue if ( before["metadata"]["activation_status"] != "requires_reference_profile_resolution" @@ -261,6 +267,7 @@ def test_full_nz_resource_resolves_directly_to_the_strict_compiler_document(prof raw, _document("reference_profiles.json"), {"census_residual_allocation": profile, "aging_index": "central"}, + factor_context=_document("reference_aging.json"), ) assert intervals is None assert set(effective) == set(raw) & REFERENCE_DOCUMENT_KEYS @@ -333,6 +340,85 @@ def test_v4_changes_only_the_residual_knob_and_prior_variants_keep_their_meaning assert knobs["census_residual_allocation"] == ( "small_households" if scenario["id"] == "V4" else "mar" ) + assert knobs["aging_index"] == {"V1": "low", "V2": "high"}.get( + scenario["id"], "central" + ) + + +@pytest.mark.parametrize("profile", ["low", "central", "high"]) +def test_ageing_profiles_have_237_explicit_companions_and_keep_b4_parked(profile): + profiles = _document("reference_profiles.json") + (transformation,) = profiles["dimensions"]["aging_index"]["profiles"][profile][ + "transformations" + ] + expected_counts = [ + f"ird_taxable_income_people_by_band__row_{row}" for row in range(8, 245) + ] + expected_money = [ + f"ird_taxable_income_total_by_band__row_{row}" for row in range(8, 245) + ] + assert transformation["count_reference_names"] == expected_counts + assert transformation["reference_names"] == expected_money + assert transformation["interval_table_ids"] == [] + assert transformation["factor_id"] == f"ird_ty2024_to_ty2027_{profile}" + assert not any("246" in name for name in expected_counts + expected_money) + base = _document("target_references.json") + effective, _, receipt = resolve_reference_profiles( + base, + profiles, + {"census_residual_allocation": "mar", "aging_index": profile}, + factor_context=_document("reference_aging.json"), + ) + before = {row["name"]: row for row in base["target_references"]} + after = {row["name"]: row for row in effective["target_references"]} + factor = {"low": 1.115056, "central": 1.117109, "high": 1.119158}[profile] + for count_name, money_name in zip(expected_counts, expected_money, strict=True): + for field in ("ledger_selector", "measure", "filter", "period"): + assert after[count_name][field] == before[count_name][field] + assert after[count_name].get("value_operation") == before[count_name].get( + "value_operation" + ) + assert after[count_name].get("value_operands") == before[count_name].get( + "value_operands" + ) + assert after[money_name]["value_operation"] == "linear_combination" + assert after[money_name]["value_operands"] == [ + { + "aggregate_fact_key": before[money_name]["ledger_selector"][ + "aggregate_fact_key" + ], + "expected_member_count": 1, + "weight": factor, + } + ] + for name in (count_name, money_name): + metadata = after[name]["metadata"] + assert metadata["activation_status"] == "requires_prerequisites" + assert json.loads(metadata["reference_prerequisites_remaining"]) == [ + "measurement:ird_taxable_income_ty2027_v1" + ] + assert receipt["selection"]["aging_index"] == profile + + +def test_resolved_money_uses_the_verified_factor_once_and_count_values_are_unchanged( + artifact, facts_by_key +): + rows = [row for row in _effective_rows() if row["family"] == "income"] + # This numerical operation check supplies activation only to its copies; + # the committed and resolved declarations remain parked on B4. + executable = copy.deepcopy(rows) + for row in executable: + row["metadata"]["activation_status"] = "active" + registry = compile_ledger_target_references( + artifact.facts, _parsed(executable), country="nz" + ) + assert len(registry.specs) == 474 + for row, target in zip(rows, registry.specs, strict=True): + source = facts_by_key[row["ledger_selector"]["aggregate_fact_key"]]["value"] + if row["metadata"]["reference_value_kind"] == "count": + assert target.value == source + else: + assert target.value == pytest.approx(source * 1.117109, rel=1e-12) @pytest.mark.parametrize("profile", ["mar", "small_households"]) @@ -555,7 +641,12 @@ def test_grouped_tenure_family_multiplicities_and_parked_definitions(): == "requires_reference_profile_resolution" ) if row["family"] == "income": - assert row["metadata"]["activation_status"].startswith("requires_g8r2") + assert row["metadata"]["activation_status"] == "requires_prerequisites" + assert json.loads(row["metadata"]["reference_prerequisites"]) == [ + "reference_profile:aging_index", + "measurement:ird_taxable_income_ty2027_v1", + ] + assert row["metadata"]["parking_reason"].startswith("B4:") def test_receipt_snapshots_are_split_and_stratified_inputs_stay_parked(): diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py new file mode 100644 index 0000000000..73f3a1c0ae --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py @@ -0,0 +1,535 @@ +"""Exact factor arithmetic, evidence and replay without country assumptions.""" + +from copy import deepcopy +from decimal import Decimal +from fractions import Fraction + +import pytest +from hypothesis import given, settings +from hypothesis import strategies as st +from microcosm_build.reference_factors import factor_context_fixture, factor_fixture + +from microcosm.build.ledger_artifact import LexicalFloat +from microcosm.build.reference_factors import ( + certified_nth_root_bounds, + factor_document_sha256, + replay_reference_factor, + resolve_reference_factor, + validate_factor_context, +) + + +def _fraction(row): + return Fraction(row["numerator"], row["denominator"]) + + +def _oracle_root(radicand, degree, places=50): + """Independent integer bisection oracle; no production arithmetic helpers.""" + denominator = 10**places + low, high = ( + 0, + max(2, (radicand.numerator // radicand.denominator + 2)) * denominator, + ) + while high - low > 1: + middle = (low + high) // 2 + if ( + middle**degree * radicand.denominator + <= radicand.numerator * denominator**degree + ): + low = middle + else: + high = middle + return Fraction(low, denominator), Fraction(high, denominator) + + +def _oracle_round(number, digits): + scaled = number * 10**digits + quotient, remainder = divmod(scaled.numerator, scaled.denominator) + if remainder * 2 > scaled.denominator or ( + remainder * 2 == scaled.denominator and quotient % 2 + ): + quotient += 1 + return quotient + + +def _oracle_factor(source, anchor, growth, frequency, digits): + low, high = _oracle_root(1 + Fraction(growth) / 100, frequency) + lower = ( + Fraction(anchor) + / Fraction(source) + * sum(low**index for index in range(frequency)) + / frequency + ) + upper = ( + Fraction(anchor) + / Fraction(source) + * sum(high**index for index in range(frequency)) + / frequency + ) + assert _oracle_round(lower, digits) == _oracle_round(upper, digits) + return _oracle_round(lower, digits), (low, high) + + +def test_factor_resolves_exact_operands_once_and_replays(): + context, facts, identity = factor_context_fixture() + entry = context["factors"][0] + receipt = entry["receipt"] + assert entry["operational_factor"] == {"numerator": 1100000, "denominator": 1000000} + assert _fraction(receipt["denominator_mean"]) == 100 + assert receipt["root_bounds"]["exact"] is True + assert [slot["status"] for slot in receipt["target_schedule"]] == [ + "observed", + "projected", + ] + assert all( + slot["numeric_token_proof"]["decimal_values_equal"] + for slot in receipt["source_schedule"] + ) + replay_reference_factor( + entry["declaration"], facts, identity, entry["operational_factor"], receipt + ) + assert validate_factor_context(context, ["toy_factor"]) == {"toy_factor": entry} + + +def test_factor_resolution_and_replay_ignore_caller_feed_pin_prose(): + declaration, facts, identity = factor_fixture() + factor, receipt = resolve_reference_factor(declaration, facts, identity) + pin = { + **identity, + "build": "Reviewed prose edit", + "source_repo": "Reviewed repository description", + } + + revised_factor, revised_receipt = resolve_reference_factor(declaration, facts, pin) + + assert revised_factor == factor + assert revised_receipt == receipt + assert revised_receipt["feed_identity"] == identity + assert declaration["feed_identity"] == identity + replay_reference_factor(declaration, facts, pin, factor, receipt) + + +@pytest.mark.parametrize("container", ["declaration", "context"]) +@pytest.mark.parametrize( + "field", + [ + "source_commit", + "facts_sha256", + "manifest_sha256", + "artifact_schema_version", + "consumer_fact_schema_versions", + "consumer_fact_schema_sha256", + "fact_row_count", + ], +) +def test_factor_identity_requires_every_authenticated_field(container, field): + context, facts, identity = factor_context_fixture() + declaration = context["factors"][0]["declaration"] + document = declaration if container == "declaration" else context + document["feed_identity"] = { + key: value for key, value in document["feed_identity"].items() if key != field + } + + with pytest.raises(ValueError, match="missing fields"): + if container == "declaration": + resolve_reference_factor(declaration, facts, identity) + else: + validate_factor_context(context) + + +@pytest.mark.parametrize("container", ["declaration", "context"]) +@pytest.mark.parametrize("field", ["build", "source_repo"]) +def test_factor_declared_identity_refuses_prose_fields(container, field): + context, facts, identity = factor_context_fixture() + declaration = context["factors"][0]["declaration"] + document = declaration if container == "declaration" else context + document["feed_identity"] = {**document["feed_identity"], field: "Prose"} + + with pytest.raises(ValueError, match="Unknown factor .*feed identity fields"): + if container == "declaration": + resolve_reference_factor(declaration, facts, identity) + else: + validate_factor_context(context) + + +def test_irrational_root_is_an_enclosure_never_an_exact_rational(): + expected, _ = _oracle_factor("100", "110", "3", 4, 6) + declaration, facts, identity = factor_fixture( + frequency=4, growth="3", expected_numerator=expected + ) + _, receipt = resolve_reference_factor(declaration, facts, identity) + bounds = receipt["root_bounds"] + lower, upper = _fraction(bounds["lower"]), _fraction(bounds["upper"]) + assert bounds["exact"] is False + assert lower < upper + assert lower**4 < Fraction(103, 100) < upper**4 + factor_bounds = receipt["unrounded_factor_bounds"] + assert _oracle_round(_fraction(factor_bounds["lower"]), 6) == expected + assert _oracle_round(_fraction(factor_bounds["upper"]), 6) == expected + + +def test_exact_root_is_recognized_without_false_irrationality(): + lower, upper, exact = certified_nth_root_bounds(Fraction(121, 100), 2, 8) + assert lower == upper == Fraction(11, 10) + assert exact is True + + +@pytest.mark.parametrize( + "anchor,expected", [("2469135", 1234568), ("2469133", 1234566)] +) +def test_single_final_rounding_uses_nearest_half_even(anchor, expected): + declaration, facts, identity = factor_fixture( + frequency=1, + source_level="2000000", + anchor_level=anchor, + expected_numerator=expected, + ) + factor, _ = resolve_reference_factor(declaration, facts, identity) + assert factor["numerator"] == expected + + +def test_observed_only_diagnostic_needs_no_projection_operand(): + declaration, facts, identity = factor_fixture() + observed = deepcopy(facts[-2]) + observed["aggregate_fact_key"] = "target-1" + observed["period"]["value"] = declaration["target_schedule"][1]["selector"][ + "period_value" + ] + observed["period_coverage"] = declaration["target_schedule"][1]["validation"][ + "period_coverage" + ] + facts.append(observed) + declaration["purpose"] = "diagnostic" + declaration["growth"] = None + factor, receipt = resolve_reference_factor(declaration, facts, identity) + assert factor["numerator"] == 1100000 + assert receipt["growth"] is None + assert all(slot["status"] == "observed" for slot in receipt["target_schedule"]) + + +@pytest.mark.parametrize( + "field,mutation,message", + [ + ("operation", "expression_eval", "operation"), + ("operation_version", 2, "operation"), + ("schema_version", 2, "schema_version"), + ("unknown", "field", "Unknown"), + ("subperiods_per_year", True, "subperiods_per_year"), + ("subperiods_per_year", 0, "subperiods_per_year"), + ("projection_policy", "june_anchor", "projection policy"), + ("purpose", "execute", "purpose"), + ("source_period", True, "period labels"), + ("target_period", None, "period labels"), + ("source_period", "", "period labels"), + ], +) +def test_closed_declaration_guards(field, mutation, message): + declaration, facts, identity = factor_fixture() + declaration[field] = mutation + with pytest.raises(ValueError, match=message): + resolve_reference_factor(declaration, facts, identity) + + +@pytest.mark.parametrize( + "mutation,message", + [ + ("missing", "exactly once"), + ("duplicate", "Duplicate"), + ("unit", "unit mismatch"), + ("source_sha256", "source_sha256 mismatch"), + ("source_vintage", "source_vintage mismatch"), + ("entity_role", "entity_role mismatch"), + ("coverage", "coverage mismatch"), + ("boolean", "Boolean"), + ("nan", "finite"), + ("float_without_token", "lexical numeric token"), + ("lossy_float", "does not reproduce"), + ("negative", "positive"), + ], +) +def test_operand_guards(mutation, message): + declaration, facts, identity = factor_fixture() + if mutation == "missing": + facts.pop(0) + elif mutation == "duplicate": + duplicate = deepcopy(facts[0]) + duplicate["aggregate_fact_key"] += "-duplicate" + facts.append(duplicate) + elif mutation == "unit": + facts[0]["observed_measure"]["unit"] = "other" + elif mutation == "source_sha256": + facts[0]["source"]["source_sha256"] = "b" * 64 + elif mutation == "source_vintage": + facts[0]["source"]["vintage"] = "revised" + elif mutation == "entity_role": + facts[0]["entity"]["role"] = "other" + elif mutation == "coverage": + facts[0]["period_coverage"]["end_date"] = "2001-02-01" + # The fixture shares this dictionary with its declaration; keep the pin. + declaration["source_schedule"][0]["validation"]["period_coverage"][ + "end_date" + ] = "2001-01-01" + facts[0]["period_coverage"] = { + "start_date": "2001-01-01", + "end_date": "2001-02-01", + } + elif mutation == "boolean": + facts[0]["value"] = True + elif mutation == "nan": + facts[0]["value"] = Decimal("NaN") + elif mutation == "float_without_token": + facts[0]["value"] = 100.0 + elif mutation == "lossy_float": + facts[0]["value"] = LexicalFloat("100.000000000000000001") + elif mutation == "negative": + facts[0]["value"] = Decimal("-1") + with pytest.raises(ValueError, match=message): + resolve_reference_factor(declaration, facts, identity) + + +def test_lexical_float_conversion_is_proved_and_used_exactly(): + declaration, facts, identity = factor_fixture( + source_level="100.25", anchor_level="110.275", expected_numerator=1100000 + ) + for fact in facts: + fact["value"] = LexicalFloat(str(fact["value"])) + _, receipt = resolve_reference_factor(declaration, facts, identity) + proof = receipt["source_schedule"][0]["numeric_token_proof"] + assert proof == { + "numeric_representation": "binary_float_with_lexical_token", + "lexical_token": "100.25", + "recovered_decimal": "100.25", + "decimal_values_equal": True, + } + assert _fraction(receipt["denominator_mean"]) == Fraction(401, 4) + + +def test_integer_operands_are_exact_beyond_binary_float_precision(): + source = 10**80 + 10 + anchor = source * 11 // 10 + declaration, facts, identity = factor_fixture( + source_level=str(source), + anchor_level=str(anchor), + expected_numerator=1100000, + ) + for fact in facts: + fact["value"] = int(fact["value"]) + + factor, receipt = resolve_reference_factor(declaration, facts, identity) + + assert factor == {"numerator": 1100000, "denominator": 1000000} + assert _fraction(receipt["denominator_mean"]) == source + assert _fraction(receipt["numerator_mean_bounds"]["lower"]) == anchor + assert _fraction(receipt["numerator_mean_bounds"]["upper"]) == anchor + operands = [ + *receipt["source_schedule"], + *(slot for slot in receipt["target_schedule"] if slot["status"] == "observed"), + receipt["growth"], + ] + for operand in operands: + token = operand["decimal_operand"] + assert operand["numeric_token_proof"] == { + "numeric_representation": "exact_integer", + "lexical_token": token, + "recovered_decimal": token, + "decimal_values_equal": True, + } + assert receipt["source_schedule"][0]["decimal_operand"] == str(source) + assert receipt["target_schedule"][0]["decimal_operand"] == str(anchor) + + +def test_source_projection_requires_existing_allow_guard_even_with_exact_key(): + declaration, facts, identity = factor_fixture() + declaration["growth"]["assertion_policy"] = "observed_only" + with pytest.raises(ValueError, match="allow_source_projection"): + resolve_reference_factor(declaration, facts, identity) + + +@pytest.mark.parametrize( + "mutation,message", + [ + ("schedule_order", "misordered"), + ("duplicate_period", "Duplicate"), + ("schedule_gap", "noncontiguous"), + ("negative_weight", "positive"), + ("offset", "projection offsets"), + ("unknown_selector", "selector"), + ("growth_floor", "positive 1"), + ("sensitivity", "sensitivity provenance"), + ("expired", "expired"), + ("wrong_expected", "expected factor mismatch"), + ("wrong_feed", "feed identity"), + ("wrong_growth_period", "exactly once"), + ("source_column", "source_column_id mismatch"), + ], +) +def test_numeric_and_schedule_guards(mutation, message): + declaration, facts, identity = factor_fixture() + if mutation == "schedule_order": + declaration["source_schedule"].reverse() + elif mutation == "duplicate_period": + declaration["source_schedule"][1]["selector"]["period_value"] = "2001-01-01" + elif mutation == "schedule_gap": + declaration["source_schedule"][1]["validation"]["period_coverage"][ + "start_date" + ] = "2001-01-04" + elif mutation == "negative_weight": + declaration["source_schedule"][0]["weight"] = "-1" + elif mutation == "offset": + declaration["target_schedule"][1]["projection_offset"] = 0 + elif mutation == "unknown_selector": + declaration["source_schedule"][0]["selector"]["unit"] = "money_per_week" + elif mutation == "growth_floor": + facts[-1]["value"] = Decimal("-100") + elif mutation == "sensitivity": + declaration["growth"]["sensitivity_provenance"] = [] + elif mutation == "expired": + declaration["validity"]["valid_until"] = "2005-01-01" + elif mutation == "wrong_expected": + declaration["expected_operational_factor"]["numerator"] += 1 + elif mutation == "wrong_feed": + identity = {**identity, "facts_sha256": "wrong"} + elif mutation == "wrong_growth_period": + declaration["growth"]["selector"]["period_value"] = "2003" + elif mutation == "source_column": + declaration["growth"]["validation"]["source_column_id"] = "wrong" + with pytest.raises(ValueError, match=message): + resolve_reference_factor(declaration, facts, identity) + + +def test_observed_preferred_requires_redeclaration_and_reanchors_projection(): + declaration, facts, identity = factor_fixture(frequency=4) + observed = deepcopy(facts[-2]) + observed["aggregate_fact_key"] = "target-1" + observed["value"] = Decimal("120") + observed["period"]["value"] = declaration["target_schedule"][1]["selector"][ + "period_value" + ] + observed["period_coverage"] = declaration["target_schedule"][1]["validation"][ + "period_coverage" + ] + facts.append(observed) + with pytest.raises(ValueError, match="expected factor mismatch"): + resolve_reference_factor(declaration, facts, identity) + # Growth zero makes the latest-anchor formula transparent: (110+120+120+120)/4. + declaration["expected_operational_factor"]["numerator"] = 1175000 + _, receipt = resolve_reference_factor(declaration, facts, identity) + assert _fraction(receipt["numerator_mean_bounds"]["lower"]) == Fraction(470, 4) + assert [slot["projection_offset"] for slot in receipt["target_schedule"]] == [ + 0, + 0, + 1, + 2, + ] + assert receipt["target_schedule"][2]["projection_anchor"] == { + "aggregate_fact_key": "target-1" + } + + +def test_observed_gap_refuses_instead_of_guessing_anchor(): + declaration, facts, identity = factor_fixture(frequency=4) + observed = deepcopy(facts[-2]) + observed["period"]["value"] = declaration["target_schedule"][2]["selector"][ + "period_value" + ] + observed["period_coverage"] = declaration["target_schedule"][2]["validation"][ + "period_coverage" + ] + facts.append(observed) + with pytest.raises(ValueError, match="contiguous from the anchor"): + resolve_reference_factor(declaration, facts, identity) + + +def test_self_consistent_receipt_cannot_replace_compile_replay(): + context, facts, identity = factor_context_fixture() + entry = context["factors"][0] + entry["declaration"]["expected_operational_factor"]["numerator"] = 1200000 + entry["operational_factor"]["numerator"] = 1200000 + entry["receipt"]["operational_factor"]["numerator"] = 1200000 + entry["receipt"]["declaration_sha256"] = factor_document_sha256( + entry["declaration"] + ) + entry["receipt"]["receipt_sha256"] = factor_document_sha256( + { + key: value + for key, value in entry["receipt"].items() + if key != "receipt_sha256" + } + ) + assert validate_factor_context(context, ["toy_factor"]) + with pytest.raises(ValueError, match="expected factor mismatch"): + replay_reference_factor( + entry["declaration"], + facts, + identity, + entry["operational_factor"], + entry["receipt"], + ) + + +def test_receipt_tampering_refuses_and_unselected_edits_are_local(): + context, _, _ = factor_context_fixture() + other = deepcopy(context["factors"][0]) + other["declaration"]["id"] = "unused" + other["receipt"]["receipt_sha256"] = "invalid" + context["factors"].append(other) + assert list(validate_factor_context(context, ["toy_factor"])) == ["toy_factor"] + with pytest.raises(ValueError, match="hash mismatch"): + validate_factor_context(context, ["unused"]) + + +@settings(max_examples=70, deadline=None) +@given( + source=st.integers(1, 10**9), + anchor=st.integers(1, 10**9), + growth=st.integers(-49, 49), + frequency=st.sampled_from([1, 2, 4, 12]), + digits=st.sampled_from([4, 6, 8]), +) +def test_certified_rounding_and_root_bounds_match_independent_fraction_oracle( + source, anchor, growth, frequency, digits +): + source_text, anchor_text = str(Decimal(source) / 100), str(Decimal(anchor) / 100) + expected, oracle_bounds = _oracle_factor( + source_text, anchor_text, str(growth), frequency, digits + ) + declaration, facts, identity = factor_fixture( + source_level=source_text, + anchor_level=anchor_text, + growth=str(growth), + frequency=frequency, + digits=digits, + expected_numerator=expected, + ) + if expected == 0: + with pytest.raises( + ValueError, match="Expected operational factor must be positive" + ): + resolve_reference_factor(declaration, facts, identity) + return + factor, receipt = resolve_reference_factor(declaration, facts, identity) + assert factor["numerator"] == expected + lower, upper = ( + _fraction(receipt["root_bounds"]["lower"]), + _fraction(receipt["root_bounds"]["upper"]), + ) + radicand = 1 + Fraction(growth, 100) + assert lower**frequency <= radicand <= upper**frequency + assert lower <= oracle_bounds[1] and upper >= oracle_bounds[0] + if receipt["root_bounds"]["exact"]: + assert lower == upper and lower**frequency == radicand + else: + assert lower < upper + + +def test_very_large_integer_cross_products_do_not_overflow(): + huge = 10**200 + declaration, facts, identity = factor_fixture( + source_level=str(huge), + anchor_level=str(3 * huge), + frequency=12, + expected_numerator=3000000, + ) + factor, receipt = resolve_reference_factor(declaration, facts, identity) + assert factor["numerator"] == 3000000 + assert _fraction(receipt["denominator_mean"]) == huge diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index c7324e58d7..c803dc5bb9 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -3,8 +3,12 @@ from __future__ import annotations import copy +import json import pytest +from hypothesis import given, settings +from hypothesis import strategies as st +from microcosm_build.reference_factors import factor_context_fixture from microcosm.build.reference_profiles import ( REFERENCE_DOCUMENT_KEYS, @@ -291,3 +295,316 @@ def test_effective_document_projects_resource_headers_and_binds_full_base(): effective ) assert validate_reference_resolution(effective, receipt) == receipt + + +def _scaling_inputs(pair_count=2, anchor_level="110"): + context, _, _ = factor_context_fixture(anchor_level=anchor_level) + references = {"country": "toy", "target_references": []} + money, counts = [], [] + for kind, names in (("count", counts), ("money", money)): + for index in range(pair_count): + name = f"{kind}_{index}" + names.append(name) + selector = _selector(f"{kind}-fact-{index}", index) + selector.update( + source_measure_id=kind, + source_concept=f"households.{kind}", + period_value=2001, + ) + row = { + "name": name, + "entity": "household", + "measure": f"prepared_{kind}", + "filter": f"band_{index}", + "period": 2002, + "ledger_selector": selector, + "metadata": { + "activation_status": "requires_prerequisites", + "reference_value_kind": kind, + "required_reference_profile": "aging_index", + "required_measurement_binding": "reviewed_income", + "reference_prerequisites": json.dumps( + ["reference_profile:aging_index", "measurement:reviewed_income"] + ), + "parking_reason": "Reviewed measurement remains unavailable.", + }, + } + if kind == "count": + row.update(value_operation="identity", value_operands=[]) + references["target_references"].append(row) + transformation = { + "operation": "scale_money_and_intervals", + "factor_id": "toy_factor", + "reference_names": money, + "count_reference_names": counts, + "interval_table_ids": [], + "required_measurement_binding": "reviewed_income", + } + declarations = { + "schema_version": 1, + "dimensions": { + "aging_index": { + "default": "central", + "profiles": { + name: {"transformations": [copy.deepcopy(transformation)]} + for name in ("low", "central", "high") + }, + } + }, + } + return references, declarations, context + + +def test_factor_scales_money_once_keeps_counts_and_measurement_prerequisite(): + references, declarations, context = _scaling_inputs() + original = copy.deepcopy((references, declarations, context)) + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + assert (references, declarations, context) == original + assert receipt["resolver_version"] == "reference-profiles-v2" + assert set(receipt["selected_factors"]) == {"toy_factor"} + for source, row in zip( + references["target_references"], effective["target_references"], strict=True + ): + metadata = row["metadata"] + assert metadata["activation_status"] == "requires_prerequisites" + assert metadata["parking_reason"] == source["metadata"]["parking_reason"] + assert json.loads(metadata["reference_prerequisites_remaining"]) == [ + "measurement:reviewed_income" + ] + assert row["ledger_selector"] == source["ledger_selector"] + if row["measure"] == "prepared_count": + assert {key: value for key, value in row.items() if key != "metadata"} == { + key: value for key, value in source.items() if key != "metadata" + } + assert receipt["transformations"][row["name"]]["operation"] == "identity" + else: + assert row["value_operation"] == "linear_combination" + assert row["value_operands"] == [ + { + "aggregate_fact_key": source["ledger_selector"][ + "aggregate_fact_key" + ], + "expected_member_count": 1, + "weight": 1.1, + } + ] + assert validate_reference_resolution(effective, receipt) == receipt + with pytest.raises(ValueError, match="already been resolved"): + resolve_reference_profiles(effective, declarations, {}, factor_context=context) + + +@given( + pair_count=st.integers(min_value=1, max_value=16), + anchor=st.integers(min_value=1, max_value=500), +) +@settings(max_examples=16, database=None, deadline=None) +def test_counts_are_invariant_and_every_money_row_uses_one_common_factor( + pair_count, anchor +): + references, declarations, context = _scaling_inputs(pair_count, str(anchor)) + effective, _, _ = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + counts = references["target_references"][:pair_count] + effective_counts = effective["target_references"][:pair_count] + for before, after in zip(counts, effective_counts, strict=True): + assert before["ledger_selector"] == after["ledger_selector"] + assert before["value_operation"] == after["value_operation"] + assert before["value_operands"] == after["value_operands"] + weights = [ + row["value_operands"] for row in effective["target_references"][pair_count:] + ] + assert all(len(operands) == 1 for operands in weights) + rational = context["factors"][0]["operational_factor"] + assert {operands[0]["weight"] for operands in weights} == { + rational["numerator"] / rational["denominator"] + } + with pytest.raises(ValueError, match="already been resolved"): + resolve_reference_profiles(effective, declarations, {}, factor_context=context) + + +@pytest.mark.parametrize( + "mutation", + [ + "missing_count", + "swapped_roles", + "missing_both", + "mismatched_filter", + "overlap", + "duplicate", + "source_period", + "target_period", + "diagnostic_factor", + "money_already_scaled", + "arbitrary_parking", + "missing_prerequisites", + "wrong_measurement", + "override_prerequisites", + "override_measurement", + "missing_context", + "wrong_factor", + "wrong_receipt", + "wrong_profile_factor", + ], +) +def test_invalid_factor_profiles_and_companions_refuse(mutation): + references, declarations, context = _scaling_inputs() + transform = declarations["dimensions"]["aging_index"]["profiles"]["central"][ + "transformations" + ][0] + if mutation == "missing_count": + transform["count_reference_names"].pop() + elif mutation == "swapped_roles": + transform["count_reference_names"], transform["reference_names"] = ( + transform["reference_names"], + transform["count_reference_names"], + ) + elif mutation == "missing_both": + transform["count_reference_names"].pop() + transform["reference_names"].pop() + elif mutation == "mismatched_filter": + references["target_references"][0]["filter"] = "wrong_band" + elif mutation == "overlap": + declarations["dimensions"]["another"] = copy.deepcopy( + declarations["dimensions"]["aging_index"] + ) + elif mutation == "duplicate": + transform["reference_names"].append(transform["reference_names"][0]) + elif mutation in {"source_period", "target_period"}: + key = "ledger_selector" if mutation == "source_period" else "period" + for row in references["target_references"]: + if key == "ledger_selector": + row[key]["period_value"] = 1999 + else: + row[key] = 1999 + elif mutation == "diagnostic_factor": + entry = context["factors"][0] + entry["declaration"]["purpose"] = "diagnostic" + from microcosm.build.reference_factors import factor_document_sha256 + + entry["receipt"]["declaration_sha256"] = factor_document_sha256( + entry["declaration"] + ) + body = { + key: value + for key, value in entry["receipt"].items() + if key != "receipt_sha256" + } + entry["receipt"]["receipt_sha256"] = factor_document_sha256(body) + elif mutation == "money_already_scaled": + row = references["target_references"][-1] + row["value_operation"] = "linear_combination" + row["value_operands"] = [ + { + "aggregate_fact_key": row["ledger_selector"]["aggregate_fact_key"], + "expected_member_count": 1, + "weight": 1.1, + } + ] + elif mutation == "arbitrary_parking": + references["target_references"][0]["metadata"]["activation_status"] = ( + "requires_arbitrary_evidence" + ) + elif mutation == "missing_prerequisites": + references["target_references"][0]["metadata"].pop("reference_prerequisites") + elif mutation == "wrong_measurement": + references["target_references"][0]["metadata"][ + "required_measurement_binding" + ] = "other" + elif mutation in {"override_prerequisites", "override_measurement"}: + key = ( + "reference_prerequisites" + if mutation == "override_prerequisites" + else "required_measurement_binding" + ) + transform["metadata"] = {key: "forged"} + elif mutation == "missing_context": + context = None + elif mutation == "wrong_factor": + context["factors"][0]["operational_factor"]["numerator"] += 1 + elif mutation == "wrong_receipt": + context["factors"][0]["receipt"]["receipt_sha256"] = "0" * 64 + elif mutation == "wrong_profile_factor": + transform["factor_id"] = "missing" + with pytest.raises(ValueError): + resolve_reference_profiles(references, declarations, {}, factor_context=context) + + +def test_nonempty_interval_roster_refuses_until_interval_implementation(): + references, declarations, _ = _scaling_inputs() + transform = declarations["dimensions"]["aging_index"]["profiles"]["central"][ + "transformations" + ][0] + transform["interval_table_ids"] = ["reviewed_table"] + with pytest.raises(ValueError, match="interval scaling lands in r2b"): + resolve_reference_profiles(references, declarations, {}) + + +def test_factor_evidence_and_unselected_profile_locality(): + references, declarations, context = _scaling_inputs() + low = resolve_reference_profiles( + references, declarations, {"aging_index": "low"}, factor_context=context + ) + central = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + declarations["dimensions"]["aging_index"]["profiles"]["high"]["notes"] = ( + "edited unselected declaration" + ) + unselected = copy.deepcopy(context["factors"][0]) + unselected["declaration"]["id"] = "unselected_invalid_factor" + context["factors"].append(unselected) + assert ( + resolve_reference_profiles( + references, declarations, {"aging_index": "low"}, factor_context=context + ) + == low + ) + assert ( + resolve_reference_profiles(references, declarations, {}, factor_context=context) + == central + ) + # Factor evidence is part of selection identity, not merely an opaque attachment. + receipt = copy.deepcopy(central[2]) + receipt["selected_factor_identities"]["toy_factor"]["receipt_sha256"] = "0" * 64 + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="factor evidence identity"): + validate_reference_resolution(central[0], receipt) + + +def test_legacy_receipt_remains_version_one_without_factor_fields(): + references, declarations = _inputs() + _, _, receipt = resolve_reference_profiles(references, declarations, {}) + assert receipt["resolver_version"] == "reference-profiles-v1" + assert "selected_factors" not in receipt + assert "selected_factor_identities" not in receipt + + +def test_unrelated_direct_fact_references_are_outside_companion_rosters(): + references, declarations, context = _scaling_inputs() + direct = { + "name": "other_direct_fact", + "ledger_fact_key": "other", + "entity": "household", + } + references["target_references"].append(direct) + effective, _, _ = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + assert effective["target_references"][-1] == direct + + +def test_self_consistent_effective_money_tampering_still_refuses(): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + effective["target_references"][-1]["value_operands"][0]["weight"] *= 1.1 + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="must be applied exactly once"): + validate_reference_resolution(effective, receipt) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_country_bundles.py b/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_country_bundles.py index b61bccc13e..981c214de6 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_country_bundles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_country_bundles.py @@ -233,6 +233,7 @@ def test_nz_generation_zero_views_come_from_the_country_spec_seam() -> None: "geography_spine.json", "holdout_references.json", "precal_references.json", + "reference_aging.json", "reference_inventory.json", "reference_profiles.json", "release_contract.json", diff --git a/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py b/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py index 051e1c4cb7..5d6ee3a416 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py @@ -94,6 +94,9 @@ from microcosm.graph.canonical import canonical_json from microcosm.graph.keys import node_key, source_content_key from test_support.microcosm_build.chronicle_feed import write_pinned_artifact +from test_support.microcosm_build.reference_factor_transport import ( + factor_transport_fixture, +) from test_support.microcosm_build.transport_composed import ( FAMILY_INPUTS, PROGRAMS, @@ -964,6 +967,143 @@ def test_preflight_checks_the_selected_variant_reference_status(composed): validate_transport_activation(spec) +def test_factor_context_is_read_without_composition_feed_io(tmp_path, monkeypatch): + _, pin, _, _, spec = factor_transport_fixture(tmp_path) + spec["resources"]["chronicle_feed"] = pin + + def no_feed_io(*args, **kwargs): + raise AssertionError("Composition must not load the consumer artifact.") + + monkeypatch.setattr( + "microcosm.build.ledger_artifact.load_ledger_consumer_artifact", no_feed_io + ) + view = compose_module.reference_profile_view(spec) + assert view[2]["selected_factors"]["toy_factor"]["operational_factor"] == { + "numerator": 1100000, + "denominator": 1000000, + } + assert all( + row["metadata"]["activation_status"] == "requires_prerequisites" + for row in view[0]["target_references"] + ) + assert compose_module.transport_resource(spec, "target_references") == view[0] + + +def test_factor_context_ignores_feed_pin_prose(tmp_path): + _, pin, _, _, spec = factor_transport_fixture(tmp_path) + spec["resources"]["chronicle_feed"] = pin + before = compose_module.reference_profile_view(spec) + pin["build"] = "Reviewed prose edit" + pin["source_repo"] = "Reviewed repository description" + assert compose_module.reference_profile_view(spec) == before + + +@pytest.mark.parametrize( + "defect", + ["missing", "wrong_feed", "wrong_commit", "wrong_manifest", "wrong_factor"], +) +def test_preflight_refuses_missing_or_incompatible_default_factor_context( + tmp_path, defect +): + _, pin, _, _, spec = factor_transport_fixture(tmp_path) + spec["resources"]["chronicle_feed"] = pin + if defect == "missing": + spec["resources"].pop("factor_context") + elif defect == "wrong_feed": + spec["resources"]["chronicle_feed"] = {**pin, "facts_sha256": "0" * 64} + elif defect == "wrong_commit": + pin["source_commit"] = "d" * 40 + elif defect == "wrong_manifest": + pin["manifest_sha256"] = "0" * 64 + else: + spec["resources"]["factor_context"]["factors"][0]["operational_factor"][ + "numerator" + ] += 1 + with pytest.raises( + ValueError, match="missing resource|incompatible|factor differs" + ): + validate_transport_activation(spec) + + +def test_preflight_resolves_empty_knobs_only_once(tmp_path, monkeypatch): + _, _, _, _, spec = factor_transport_fixture(tmp_path) + original = compose_module.reference_profile_view + selections = [] + + def recording_view(spec, selection=None): + selections.append(selection) + return original(spec, selection) + + monkeypatch.setattr(compose_module, "reference_profile_view", recording_view) + with pytest.raises(ValueError, match="Transport spec is not activated"): + validate_transport_activation(spec) + assert selections + assert all(selection is None for selection in selections) + + +def test_preflight_validates_scenario_factor_context_before_activation(tmp_path): + _, _, _, _, spec = factor_transport_fixture(tmp_path) + profiles = spec["resources"]["reference_profiles"]["dimensions"]["index"][ + "profiles" + ] + profiles["low"]["transformations"][0]["factor_id"] = "missing-scenario-factor" + assert compose_module.reference_profile_view(spec)[2]["selection"] == { + "index": "central" + } + spec["resources"]["scenarios"]["scenarios"].append( + {"id": "variant", "knobs": {"index": "low"}} + ) + with pytest.raises(ValueError, match="Missing selected factor"): + validate_transport_activation(spec) + + +def test_declared_ageing_scenarios_bind_selected_evidence_and_preserve_locality(): + spec = load_transport_spec("nz") + profiles = spec["resources"]["reference_profiles"] + receipts = {} + for scenario in spec["resources"]["scenarios"]["scenarios"]: + receipt = compose_module.reference_profile_view(spec, scenario["knobs"])[2] + receipts[scenario["id"]] = receipt + profile = {"V1": "low", "V2": "high"}.get(scenario["id"], "central") + factor_id = f"ird_ty2024_to_ty2027_{profile}" + assert receipt["selection"] == { + "aging_index": profile, + "census_residual_allocation": ( + "small_households" if scenario["id"] == "V4" else "mar" + ), + } + assert set(receipt["selected_factors"]) == {factor_id} + entry = next( + entry + for entry in spec["resources"]["reference_aging"]["factors"] + if entry["declaration"]["id"] == factor_id + ) + assert receipt["selected_factors"][factor_id] == entry + chosen = { + dimension: { + "name": name, + "declaration": profiles["dimensions"][dimension]["profiles"][name], + } + for dimension, name in receipt["selection"].items() + } + assert ( + receipt["selected_declarations_sha256"] + == hashlib.sha256(canonical_json(chosen)).hexdigest() + ) + profiles["dimensions"]["aging_index"]["profiles"]["high"]["notes"] = ( + "Reviewed edit confined to the unselected high profile." + ) + for scenario in spec["resources"]["scenarios"]["scenarios"]: + revised = compose_module.reference_profile_view(spec, scenario["knobs"])[2] + if scenario["id"] == "V2": + assert ( + revised["reference_selection_sha256"] + != receipts["V2"]["reference_selection_sha256"] + ) + else: + assert revised == receipts[scenario["id"]] + + class _IllegalOwner(KernelBase): ref = "test.illegal_owner@1" capabilities = Capabilities(Determinism.DETERMINISTIC) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py b/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py index 9550f1ccaf..426c3d88ab 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py @@ -21,6 +21,7 @@ import json from dataclasses import replace +from pathlib import Path import numpy as np import pandas as pd @@ -28,6 +29,8 @@ from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st +import microcosm.build.reference_factors as reference_factors_module +import microcosm.build.reference_profiles as reference_profiles_module from microcosm.build.ledger_artifact import ChronicleFeedPinMismatchError from microcosm.build.reference_profiles import ( reference_document_sha256, @@ -62,6 +65,9 @@ ) from microcosm.graph.canonical import canonical_json from test_support.microcosm_build.chronicle_feed import write_pinned_artifact +from test_support.microcosm_build.reference_factor_transport import ( + factor_transport_fixture, +) from test_support.microcosm_build.transport_graph import ( CALIBRATION_TARGETS, COUNTRY, @@ -167,6 +173,150 @@ def test_kernels_declare_honest_country_neutral_contracts() -> None: ) +@pytest.mark.parametrize( + "kernel", [TARGETS_COMPILE, TAKEUP_COMPARE], ids=lambda k: k.ref +) +def test_factor_verifier_source_changes_compilation_identity( + tmp_path, monkeypatch, kernel +): + before = kernel.implementation_hash() + source = Path(reference_factors_module.__file__) + changed = tmp_path / source.name + changed.write_bytes(source.read_bytes() + b"\n# verifier implementation mutation\n") + monkeypatch.setattr(reference_factors_module, "__file__", str(changed)) + assert kernel.implementation_hash() != before + + +def test_compiler_replays_factor_and_applies_one_common_money_weight(tmp_path): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + payload, registry = compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + assert registry.specs[0].value == 3 + assert registry.specs[1].value == pytest.approx(110) + assert decode_target_surface(payload).reference_resolution == receipt + + +def test_compile_replay_refuses_self_consistent_forged_factor(tmp_path): + path, pin, document, receipt, _ = factor_transport_fixture( + tmp_path, forged=True, activate=True + ) + # Composition has accepted all declaration/receipt hashes; only feed replay + # can distinguish this forged level from the authenticated source operand. + with pytest.raises(ValueError, match="expected factor mismatch"): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + + +def test_compile_replays_correct_factor_without_pin_when_manifest_binds_commit( + tmp_path, +): + path, _, document, receipt, _ = factor_transport_fixture( + tmp_path, activate=True, manifest_commit=True + ) + _, registry = compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + reference_resolution=receipt, + ) + assert registry.specs[1].value == pytest.approx(110) + + +@pytest.mark.parametrize("manifest_commit", [False, True]) +def test_compile_without_pin_refuses_unauthenticated_or_different_feed( + tmp_path, manifest_commit +): + path, _, document, receipt, _ = factor_transport_fixture( + tmp_path, activate=True, manifest_commit=manifest_commit + ) + if manifest_commit: + # The declaration still has a valid receipt for its original artifact. + manifest_path = path / "manifest.json" + manifest = json.loads(manifest_path.read_text()) + manifest["source_commit"] = "d" * 40 + manifest_path.write_text(json.dumps(manifest)) + with pytest.raises(ValueError, match="cannot be authenticated|manifest_sha256"): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + reference_resolution=receipt, + ) + + +def test_compile_factor_ignores_pin_prose(tmp_path): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + arguments = dict( + country=COUNTRY, + references_sha256=reference_document_sha256(document), + reference_resolution=receipt, + ) + before, _ = compile_target_surface(path, document, feed_pin=pin, **arguments) + after, _ = compile_target_surface( + path, document, feed_pin={**pin, "build": "Reviewed prose edit"}, **arguments + ) + assert before == after + + +@pytest.mark.parametrize("field", ["source_commit", "facts_sha256", "manifest_sha256"]) +def test_compile_factor_refuses_changed_pin_identity(tmp_path, field): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + pin[field] = "d" * len(pin[field]) + with pytest.raises(ValueError, match="feed identity mismatch|pin mismatch"): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + + +def test_compile_replay_refuses_tampered_evidence_with_recomputed_hashes(tmp_path): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + factor_receipt = receipt["selected_factors"]["toy_factor"]["receipt"] + factor_receipt["source_schedule"][0]["decimal_operand"] = "99" + factor_receipt.pop("receipt_sha256") + factor_receipt["receipt_sha256"] = reference_document_sha256(factor_receipt) + receipt["selected_factor_identities"]["toy_factor"]["receipt_sha256"] = ( + factor_receipt["receipt_sha256"] + ) + receipt["reference_selection_sha256"] = reference_document_sha256( + reference_profiles_module._selection_identity(receipt) + ) + for row in document["target_references"]: + row["metadata"]["reference_selection_sha256"] = receipt[ + "reference_selection_sha256" + ] + receipt["effective_references_sha256"] = reference_document_sha256(document) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="Factor replay differs"): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + + def test_compile_emits_a_traced_surface_bound_to_facts_not_paths(tmp_path) -> None: payload = _surface(tmp_path) surface = decode_target_surface(payload) diff --git a/packages/microcosm-build/tests/golden/nz_country_spec.json b/packages/microcosm-build/tests/golden/nz_country_spec.json index 975b622934..056f151afc 100644 --- a/packages/microcosm-build/tests/golden/nz_country_spec.json +++ b/packages/microcosm-build/tests/golden/nz_country_spec.json @@ -1,6 +1,6 @@ { "country": "nz", - "fingerprint": "d970b6e900b7f5d455a86158718703444ac91c15d49b2203720fc2bdf2baba7d", + "fingerprint": "be277bbabfb0c40601a9719aa5f3adeb5b51c10e8adcc9dfad36475b7f35d425", "gate_ids": [ "calibration_per_family_fit", "demography_per_family_fit", @@ -45,15 +45,16 @@ "benefit_unit_rule.json": "a9e8cbfd38a64d2f8db0002fe8c31bb5a18fb34dbe59fa943336487ce95e2ca8", "calibration_bindings.json": "2293672e396407a24caaa5788638e7a1e7fc962575bc2551f500fbc309c3fe32", "chronicle_feed.json": "60a80dd0042838b0412baf9dd0985c961b4253a6876d16bcdbb8a2c6c03de0c7", - "country_package.json": "5ab555a9ffa6f55598314b0886670c1446dde557c8e434eb6fd84857ec69a513", + "country_package.json": "a4f71abaf97cda60c0eedf329dcd3da47fe8167898a94184be2a9a88c55e5a7b", "currency_bridge.json": "aa6a4b286a6a1a015088f32ac013148553422c3d45eeef7d7a15af08388857ca", "export_contract.json": "2c7414fefe395c4f5822643dcd3bb3544ebb2040259aa007b828a99bd01ae210", "gates.json": "fa08b508ce1c93ef7627ca06f3a9e808f8fa6ea6f23ce24fa54c58241bbb9f7f", "geography_spine.json": "799bb85e0e4ef943b9f14c6223e2b6168d587e09d1fbf8c7ea2e1aaa0eaee17d", "holdout_references.json": "52b5a2360502156da1392a68350e4e7f61b5fd420fa74428819b65886a9f8655", "precal_references.json": "420361e424405df2312bd21808d6b6f4c3428b6fe90c44c37ab156ce197aa25d", - "reference_inventory.json": "a1356d3c7f91f4025a31a1edc68e2fe78017ec7a5eeb497d91031d4166e3765e", - "reference_profiles.json": "b0f23587f707c4af71eedfc450eae9175886f92e77d732a0e24758df83ec505d", + "reference_aging.json": "4987106611ce14b227e483016b384f6c8103e28311c60384df6adbdfba4ca75d", + "reference_inventory.json": "d16ac4e95f5427c7bb1382ff6ae90e93d4b48344d810755fcc1dc6514430244a", + "reference_profiles.json": "323896a354467a4ade5c52c97c2f80acbd62809072e652c801bd209caa667c54", "release_contract.json": "6cd5e3a4a2bf30e4025e04e964c393b24040937d13db7e6a07b3966a55f3b114", "reporting_classifiers.json": "2700a8dab0bcc186a0ce354a09c7cab127e8b07589b15fb7d63c7f1581041ad8", "scenarios.json": "3f1b5e40d283d7a1baf1a6990f2ca08a0ca39151a8cff028a49455f95e82e9c7", @@ -64,7 +65,7 @@ "spec/sources.yaml": "ee015a35820e4688c7325d24bf0dac0ad090226d15401d2e3b83bde4413561be", "spec/spine.yaml": "b3e6a2832ff7671777cae113b7fc45f5e3492bb519526f229118d0851083533e", "spec/vintages.yaml": "1ecc1a3f952bd25b834c394314e8c933ddb5b095fd64ba492dddb03e3cdd803e", - "target_references.json": "39c40fbd2277d68304b141dedd8e01800fd93f58d1950ad7cce8e103e4daeeca" + "target_references.json": "72b2d3b667c782b81b33cc850cd7f8b4014fc4d9fd50e74cb98c29dae1d46a46" }, "resources": [ "spec/bundle.yaml", @@ -86,6 +87,7 @@ "geography_spine.json", "holdout_references.json", "precal_references.json", + "reference_aging.json", "reference_inventory.json", "reference_profiles.json", "release_contract.json", diff --git a/test_support/microcosm_build/reference_factor_transport.py b/test_support/microcosm_build/reference_factor_transport.py new file mode 100644 index 0000000000..f3d539b864 --- /dev/null +++ b/test_support/microcosm_build/reference_factor_transport.py @@ -0,0 +1,169 @@ +"""Authenticated toy feed and companion references for transport factor checks.""" + +import json +from copy import deepcopy + +from microcosm.build.ledger_artifact import ( + chronicle_feed_identity, + load_ledger_consumer_artifact, +) +from microcosm.build.reference_factors import resolve_reference_factor +from microcosm.build.reference_profiles import ( + reference_document_sha256, + resolve_reference_profiles, +) +from test_support.microcosm_build.chronicle_feed import write_pinned_artifact +from test_support.microcosm_build.reference_factors import factor_fixture +from test_support.microcosm_build.transport_graph import reference_document + + +def factor_transport_fixture( + tmp_path, *, forged=False, activate=False, manifest_commit=False +): + """Build evidence from loaded lexical tokens; optionally forge its source claim.""" + _, facts, _ = factor_fixture() + references = [] + for kind, value in (("count", 3), ("money", 100)): + key = f"toy-{kind}" + selector = { + "aggregate_fact_key": key, + "source_name": "toy_office", + "source_measure_id": kind, + "source_concept": f"toy.{kind}", + "entity_name": "person", + "period_type": "year", + "period_value": 2001, + "dimensions": ["band"], + "dimension_values": {"band": "one"}, + } + facts.append( + { + "aggregate_fact_key": key, + "label": f"Toy published {kind}", + "value": value, + "assertion": "observation", + "period": {"type": "year", "value": 2001}, + "geography": { + "level": "country", + "id": "XX", + "name": "Toy country", + "vintage": "toy", + }, + "entity": {"name": "person"}, + "dimensions": {"band": "one"}, + "dimension_labels": {"band": "Band"}, + "dimension_value_labels": {"band": {"one": "One"}}, + "aggregation": {"method": "sum"}, + "source": {"source_name": "toy_office"}, + "observed_measure": { + "source_measure_id": kind, + "source_concept": f"toy.{kind}", + "unit": kind, + }, + } + ) + references.append( + { + "name": key, + "entity": "person", + "measure": "people" if kind == "count" else "employment_income", + "family": "toy", + "category_id": "toy.population", + "period": 2002, + "period_match_policy": "latest_not_after", + "ledger_selector": selector, + "metadata": { + "contract_target_id": key, + "reference_value_kind": kind, + "activation_status": "requires_prerequisites", + "required_reference_profile": "index", + "required_measurement_binding": "reviewed_measurement", + "reference_prerequisites": json.dumps( + ["reference_profile:index", "measurement:reviewed_measurement"] + ), + "parking_reason": "Reviewed measurement is required.", + }, + } + ) + path, pin = write_pinned_artifact( + tmp_path / "factor-artifact", json.loads(json.dumps(facts, default=float)) + ) + pin["source_commit"] = "c" * 40 + if manifest_commit: + import hashlib + + manifest_path = path / "manifest.json" + manifest = json.loads(manifest_path.read_text()) + manifest["source_commit"] = pin["source_commit"] + manifest_path.write_text(json.dumps(manifest, sort_keys=True) + "\n") + pin["manifest_sha256"] = hashlib.sha256(manifest_path.read_bytes()).hexdigest() + artifact = load_ledger_consumer_artifact(path, feed_pin=pin) + identity = chronicle_feed_identity(pin) + declaration, _, _ = factor_fixture(feed_identity=identity) + evidence_facts = artifact.facts + if forged: + # This evidence is internally consistent but falsely claims the original pin. + evidence_facts = deepcopy(artifact.facts) + next(row for row in evidence_facts if row["aggregate_fact_key"] == "target-0")[ + "value" + ] = 120 + declaration["expected_operational_factor"]["numerator"] = 1200000 + factor, receipt = resolve_reference_factor(declaration, evidence_facts, identity) + context = { + "schema_version": 1, + "feed_identity": identity, + "factors": [ + { + "declaration": declaration, + "operational_factor": factor, + "receipt": receipt, + } + ], + } + transformation = { + "operation": "scale_money_and_intervals", + "factor_id": declaration["id"], + "reference_names": ["toy-money"], + "count_reference_names": ["toy-count"], + "interval_table_ids": [], + "required_measurement_binding": "reviewed_measurement", + } + profiles = { + "schema_version": 1, + "reference_resource": "target_references", + "factor_context_resource": "factor_context", + "dimensions": { + "index": { + "default": "central", + "profiles": { + name: {"transformations": [deepcopy(transformation)]} + for name in ("low", "central", "high") + }, + } + }, + } + base = reference_document(references) + base["hierarchy"]["target_labels"] = { + row["name"]: f"Aged toy {row['name']}" for row in references + } + document, _, resolution = resolve_reference_profiles( + base, profiles, {}, factor_context=context + ) + if activate: + # Test-only future measurement closure lets the compiler test its own replay + # and arithmetic independently of this lane's parked country declarations. + for row in document["target_references"]: + row["metadata"]["activation_status"] = "active" + resolution["effective_references_sha256"] = reference_document_sha256(document) + resolution.pop("receipt_sha256") + resolution["receipt_sha256"] = reference_document_sha256(resolution) + spec = { + "country": "xx", + "resources": { + "target_references": base, + "reference_profiles": profiles, + "factor_context": context, + "scenarios": {"scenarios": [{"id": "base", "knobs": {}}]}, + }, + } + return path, pin, document, resolution, spec diff --git a/test_support/microcosm_build/reference_factors.py b/test_support/microcosm_build/reference_factors.py new file mode 100644 index 0000000000..ca962f70ab --- /dev/null +++ b/test_support/microcosm_build/reference_factors.py @@ -0,0 +1,185 @@ +"""Small engine-free declarations for exercising public factor interfaces.""" + +from __future__ import annotations + +from copy import deepcopy +from datetime import date, timedelta +from decimal import Decimal + +from microcosm.build.ledger_artifact import CONSUMER_ARTIFACT_SCHEMA_VERSION +from microcosm.build.reference_factors import resolve_reference_factor + + +def factor_fixture( + *, + feed_identity=None, + frequency=2, + source_level="100", + anchor_level="110", + growth="0", + digits=6, + expected_numerator=None, +): + """Return a declaration, exact numeric facts and a matching feed identity. + + Slots are single days: period coverage, rather than calendar conventions, + establishes contiguity. Callers may serialize facts into their toy artifact. + """ + identity = ( + { + "source_commit": "c" * 40, + "facts_sha256": "a" * 64, + "manifest_sha256": "b" * 64, + "artifact_schema_version": CONSUMER_ARTIFACT_SCHEMA_VERSION, + "consumer_fact_schema_versions": ["chronicle.consumer_fact.v4"], + "consumer_fact_schema_sha256": "d" * 64, + "fact_row_count": frequency + 2, + } + if feed_identity is None + else deepcopy(feed_identity) + ) + facts, source, target = [], [], [] + validation = { + "unit": "money_per_week", + "source_sha256": "a" * 64, + "source_vintage": "reviewed", + "entity_role": "employee", + "provenance_class": "survey_aggregate", + "assertion": "observation", + } + for schedule, start, prefix, level in ( + (source, date(2001, 1, 1), "source", source_level), + (target, date(2002, 1, 1), "target", anchor_level), + ): + for index in range(frequency): + period = (start + timedelta(days=index)).isoformat() + coverage = {"start_date": period, "end_date": period} + selector = { + "source_name": "toy_office", + "source_measure_id": "weekly_pay", + "entity_name": "person", + "period_type": "day", + "period_value": period, + "assertion": "observation", + "dimensions": [], + } + slot = { + "selector": selector, + "validation": {**validation, "period_coverage": coverage}, + "weight": "1", + "sequence": index, + } + if schedule is target: + slot["projection_offset"] = index + schedule.append(slot) + if schedule is source or index == 0: + facts.append( + { + "aggregate_fact_key": f"{prefix}-{index}", + "value": Decimal(level), + "assertion": "observation", + "provenance_class": "survey_aggregate", + "period": {"type": "day", "value": period}, + "period_coverage": coverage, + "entity": {"name": "person", "role": "employee"}, + "dimensions": {}, + "source": { + "source_name": "toy_office", + "source_sha256": "a" * 64, + "vintage": "reviewed", + }, + "observed_measure": { + "source_measure_id": "weekly_pay", + "unit": "money_per_week", + }, + } + ) + growth_period = "2002" + growth_validation = { + **validation, + "unit": "percent", + "assertion": "source_projection", + "provenance_class": "model_output", + "period_coverage": {"start_date": "2002-01-01", "end_date": "2002-12-31"}, + "source_column_id": "annual_projection", + } + facts.append( + { + "aggregate_fact_key": "growth", + "value": Decimal(growth), + "assertion": "source_projection", + "provenance_class": "model_output", + "period": {"type": "year", "value": growth_period}, + "period_coverage": growth_validation["period_coverage"], + "entity": {"name": "person", "role": "employee"}, + "dimensions": {}, + "source": { + "source_name": "toy_office", + "source_sha256": "a" * 64, + "vintage": "reviewed", + }, + "observed_measure": {"source_measure_id": "growth", "unit": "percent"}, + "layout": {"source_column_id": "annual_projection"}, + } + ) + if expected_numerator is None: + expected_numerator = int( + Decimal(anchor_level) / Decimal(source_level) * 10**digits + ) + declaration = { + "schema_version": 1, + "id": "toy_factor", + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": identity, + "source_period": 2001, + "target_period": 2002, + "source_schedule": source, + "target_schedule": target, + "growth": { + "selector": {"aggregate_fact_key": "growth", "period_value": growth_period}, + "validation": growth_validation, + "unit_multiplier": "0.01", + "scenario_delta": "0", + "sensitivity_provenance": ["toy reviewed sensitivity"], + "assertion_policy": "allow_source_projection", + }, + "subperiods_per_year": frequency, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": {"digits": digits, "mode": "nearest_half_even"}, + "expected_operational_factor": { + "numerator": expected_numerator, + "denominator": 10**digits, + }, + "validity": { + "declared_on": "2000-01-01", + "valid_from": "2000-01-01", + "valid_until": "2099-12-31", + "as_of": "2002-01-01", + }, + "evidence": ["toy published levels"], + "decision_references": ["toy reviewed decision"], + } + return declaration, facts, identity + + +def factor_context_fixture(**kwargs): + """Return a context with a factor genuinely resolved through the public API.""" + declaration, facts, identity = factor_fixture(**kwargs) + factor, receipt = resolve_reference_factor(declaration, facts, identity) + return ( + { + "schema_version": 1, + "feed_identity": identity, + "factors": [ + { + "declaration": declaration, + "operational_factor": factor, + "receipt": receipt, + } + ], + }, + facts, + identity, + ) diff --git a/tools/generate_nz_reference_aging.py b/tools/generate_nz_reference_aging.py new file mode 100644 index 0000000000..e40961b972 --- /dev/null +++ b/tools/generate_nz_reference_aging.py @@ -0,0 +1,241 @@ +"""Generate NZ's reviewed ageing declarations and authenticated factor receipts. + +Run with ``NZ_CHRONICLE_ARTIFACT`` or ``--artifact``. The six operational +expectations are assertions of the feed calculation, never arithmetic inputs. +The observed-only ratio is diagnostic and is not available to profiles. +""" + +from __future__ import annotations + +import argparse +import copy +import json +import os +from pathlib import Path + +from microcosm.build.ledger_artifact import ( + chronicle_feed_identity, + load_ledger_consumer_artifact, + validate_chronicle_feed_pin, +) +from microcosm.build.reference_factors import resolve_reference_factor +from tools.generate_nz_target_references import SPEC, _selector + +_QES_2025_HASH = "25053dcbd343320cad72e2896475eaebaf5f5bb0b5965ca788506ca15efcea30" +_QES_2026_HASH = "1af2e7e37f1c108a2656842cf1f519c903e1a982bcdc03ee02d0ad888ebc3a97" +_TREASURY_HASH = "e2486375dde515d0722f8c3022f481804bb014beb83c81b8bfc99bc9426544d9" +_OPERANDS = ( + (12028, "2023-Q2", "cfbce1343aa646fce0411631", "1502.27"), + (12030, "2023-Q3", "f9f4f127d080fe2f06617947", "1528.92"), + (12032, "2023-Q4", "fb5938810b7b37ae8534e5f7", "1556.16"), + (12034, "2024-Q1", "854e91ec1dd95e396659ad8e", "1563.54"), + (12044, "2025-Q2", "86ce22ba42a6e2a36b889f9b", "1652.72"), + (12046, "2025-Q3", "434e7b2736b4b16589034c72", "1661.12"), + (12048, "2025-Q4", "bc87e53157eaf53c846879dc", "1681.06"), + (12050, "2026-Q1", "78e735569814069f8066ba9f", "1685.39"), + (12052, "2026-Q2", "91583e3f39d11b8b4b2923d2", "1700.68"), +) +_TY2024 = ("2023-Q2", "2023-Q3", "2023-Q4", "2024-Q1") +_TY2026 = ("2025-Q2", "2025-Q3", "2025-Q4", "2026-Q1") +_TARGET = ("2026-Q2", "2026-Q3", "2026-Q4", "2027-Q1") +_EXPECTED = { + "ird_ty2024_to_ty2027_low": 1115056, + "ird_ty2024_to_ty2027_central": 1117109, + "ird_ty2024_to_ty2027_high": 1119158, + "p1_ty2026_to_ty2027_low": 1026690, + "p1_ty2026_to_ty2027_central": 1028580, + "p1_ty2026_to_ty2027_high": 1030467, + "observed_ty2026_over_ty2024": 1086069, +} +_DECISIONS = [ + "d1599; IRD band ageing factors, 22 October 2026", + "G8-r2 hub rulings 3, 23 October 2026, sections 1–2", +] + + +def _coverage(period): + year, quarter = period.split("-Q") + year, quarter = int(year), int(quarter) + start_month = 3 * quarter - 2 + end_day = (31, 30, 30, 31)[quarter - 1] + return { + "start_date": f"{year:04d}-{start_month:02d}-01", + "end_date": f"{year:04d}-{start_month + 2:02d}-{end_day}", + } + + +def _validation(fact): + return { + "unit": fact["observed_measure"]["unit"], + "source_sha256": fact["source"]["source_sha256"], + "source_vintage": fact["source"]["vintage"], + "entity_role": fact["entity"]["role"], + "provenance_class": fact["provenance_class"], + "assertion": fact["assertion"], + "period_coverage": { + key: fact["period_coverage"][key] for key in ("start_date", "end_date") + }, + "source_column_id": fact["layout"]["source_column_id"], + } + + +def build_aging_declarations(artifact, *, package_dir=SPEC): + """Author the reviewed fixed selectors, refusing a changed operand or pin.""" + feed_pin = json.loads((package_dir / "chronicle_feed.json").read_text()) + validate_chronicle_feed_pin(artifact, feed_pin) + feed_pin = chronicle_feed_identity(feed_pin) + facts_by_key = {fact["aggregate_fact_key"]: fact for fact in artifact.facts} + qes = {} + for _line, period, suffix, expected in _OPERANDS: + fact = facts_by_key[f"ledger.aggregate_fact.v2:{suffix}"] + if str(fact["value"]) != expected or fact["period"]["value"] != period: + raise ValueError(f"Reviewed QES operand changed for {period}") + historical = period in _TY2024 + expected_hash = _QES_2025_HASH if historical else _QES_2026_HASH + if ( + fact["source"]["source_sha256"] != expected_hash + or fact["observed_measure"]["source_measure_id"] != "SBSZ9A" + or fact["observed_measure"]["unit"] != "nzd_per_week" + or fact["assertion"] != "observation" + ): + raise ValueError(f"Reviewed QES evidence changed for {period}") + qes[period] = fact + treasury = facts_by_key["ledger.aggregate_fact.v2:aba7d3d54489b068116e6a25"] + if ( + str(treasury["value"]) != "2.7" + or treasury["period"]["value"] != 2026 + or treasury["source"]["source_sha256"] != _TREASURY_HASH + or treasury["layout"]["source_column_id"] != "year_ending_30_june_2027" + ): + raise ValueError("Reviewed PREFU operand changed") + + def schedule(periods, *, target=False): + result = [] + for index, period in enumerate(periods): + fact = qes.get(period, qes["2026-Q2"]) + selector = _selector(fact, pin_key=period in qes) + selector["assertion"] = "observation" + selector["period_value"] = period + selector["record_set_id"] = ( + f"stats_nz.qes.awe.{period.lower().replace('-', '')}" + ) + validation = _validation(fact) + validation["period_coverage"] = _coverage(period) + slot = { + "selector": selector, + "validation": validation, + "weight": "1", + "sequence": index, + } + if target: + slot["projection_offset"] = index + result.append(slot) + return result + + growth_selector = _selector(treasury) + growth_selector["assertion"] = "source_projection" + growth_selector["source_table"] = treasury["observed_measure"]["source_table"] + declarations = [] + for prefix, periods, source_period in ( + ("ird_ty2024", _TY2024, 2024), + ("p1_ty2026", _TY2026, 2026), + ): + for profile, delta in (("low", "-0.5"), ("central", "0"), ("high", "0.5")): + factor_id = f"{prefix}_to_ty2027_{profile}" + declarations.append( + { + "schema_version": 1, + "id": factor_id, + "operation": "projected_period_average_ratio", + "operation_version": 1, + "purpose": "profile_input", + "feed_identity": copy.deepcopy(feed_pin), + "source_period": source_period, + "target_period": 2027, + "source_schedule": schedule(periods), + "target_schedule": schedule(_TARGET, target=True), + "growth": { + "selector": copy.deepcopy(growth_selector), + "validation": _validation(treasury), + "unit_multiplier": "0.01", + "scenario_delta": delta, + "assertion_policy": "allow_source_projection", + "sensitivity_provenance": [ + "d1599: symmetric ±0.5 percentage-point Microcosm sensitivity; high is not a Treasury forecast path" + ], + }, + "subperiods_per_year": 4, + "projection_policy": "observed_preferred_latest_contiguous", + "rounding": {"digits": 6, "mode": "nearest_half_even"}, + "expected_operational_factor": { + "numerator": _EXPECTED[factor_id], + "denominator": 1000000, + }, + "validity": { + "declared_on": "2026-10-23", + "valid_from": "2026-10-23", + "valid_until": "2026-11-03", + "as_of": "2026-10-23", + }, + "evidence": [ + "Stats NZ QES Table 7; QEMQ.SBSZ9A; ordinary-time FTE, all sectors, actual", + "Treasury PREFU 2026 Table 4.1; year ending 30 June 2027; Chronicle period 2026", + ], + "decision_references": list(_DECISIONS), + } + ) + diagnostic = copy.deepcopy(declarations[1]) + diagnostic.update( + { + "id": "observed_ty2026_over_ty2024", + "purpose": "diagnostic", + "target_period": 2026, + "target_schedule": schedule(_TY2026, target=True), + "growth": None, + "expected_operational_factor": { + "numerator": _EXPECTED["observed_ty2026_over_ty2024"], + "denominator": 1000000, + }, + } + ) + declarations.append(diagnostic) + return feed_pin, declarations + + +def build_reference_aging(artifact, *, package_dir=SPEC): + feed_pin, declarations = build_aging_declarations(artifact, package_dir=package_dir) + records = [] + for declaration in declarations: + factor, receipt = resolve_reference_factor( + declaration, artifact.facts, feed_pin + ) + records.append( + { + "declaration": declaration, + "operational_factor": factor, + "receipt": receipt, + } + ) + return {"schema_version": 1, "feed_identity": feed_pin, "factors": records} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--artifact", default=os.environ.get("NZ_CHRONICLE_ARTIFACT")) + parser.add_argument("--out", type=Path, default=SPEC / "reference_aging.json") + parser.add_argument("--check", action="store_true") + args = parser.parse_args() + if not args.artifact: + parser.error("--artifact or NZ_CHRONICLE_ARTIFACT is required") + artifact = load_ledger_consumer_artifact(args.artifact) + document = build_reference_aging(artifact) + encoded = json.dumps(document, ensure_ascii=False, indent=2) + "\n" + if args.check: + if args.out.read_text() != encoded: + raise SystemExit(f"Stale generated resource: {args.out}") + else: + args.out.write_text(encoded) + + +if __name__ == "__main__": + main() diff --git a/tools/generate_nz_target_references.py b/tools/generate_nz_target_references.py index 1a3f309a81..af68d92fc8 100644 --- a/tools/generate_nz_target_references.py +++ b/tools/generate_nz_target_references.py @@ -79,7 +79,11 @@ "disclosed national-growth proxy." ) FAMILY_REASON = "Stats NZ Census-family nucleus standard and deterministic roster producer are not encoded; MC7 benefit units and family labels cannot substitute for Census multiplicities." -IRD_REASON = "G8-r2: reviewed IRD-definition taxable-income binding, component closure, record universe, numerical intervals and B5 ageing remain required." +IRD_REASON = "B4: reviewed IRD-definition taxable-income measurement, annual component closure and record universe remain required. Ageing resolution does not establish that measurement." +IRD_MEASUREMENT_BINDING = "ird_taxable_income_ty2027_v1" +# Reviewed national detail-row map: nil row 8 through open tail row 244. +# Published national total row 246 is diagnostic and is deliberately absent. +IRD_NATIONAL_ROWS = tuple(f"row_{row}" for row in range(8, 245)) RECEIPT_REASON = "G8-w: age-stratified receipt assignment is not supported by the current total-only receipt kernel; preserve the source snapshot and age filters." NZS_REASON = "NZ Super receipt binding and prepared receipt flag are not implemented." VP_REASON = "Veterans Pension is unsupported: no veteran facts or producer; a missing flag must refuse, never default to false." @@ -537,8 +541,10 @@ def build_reference_documents(artifact, *, package_dir=SPEC): (f for f in facts if f["layout"]["table_record_kind"] == "detail"), key=lambda f: int(f["layout"]["source_row_id"].removeprefix("row_")), ) - if len(details) != 237: - raise ValueError("Expected 237 taxable-income detail bands") + if tuple(f["layout"]["source_row_id"] for f in details) != IRD_NATIONAL_ROWS: + raise ValueError( + "Expected the reviewed 237 taxable-income detail rows 8–244" + ) for fact in details: row_id = fact["layout"]["source_row_id"] targets.append( @@ -550,12 +556,26 @@ def build_reference_documents(artifact, *, package_dir=SPEC): measure=column, family="income", period=2027, - status="requires_g8r2_taxable_income_contract_intervals_and_ageing", + status="requires_prerequisites", reason=IRD_REASON, filter_column=f"taxable_income_band_{row_id}_indicator", label=f"TY2026-27 {contract.replace('_', ' ')} {fact['dimensions']['taxable_income_band_source_label']} (parked)", ) ) + targets[-1]["metadata"].update( + { + "reference_prerequisites": json.dumps( + [ + "reference_profile:aging_index", + f"measurement:{IRD_MEASUREMENT_BINDING}", + ], + separators=(",", ":"), + ), + "required_reference_profile": "aging_index", + "required_measurement_binding": IRD_MEASUREMENT_BINDING, + "reference_value_kind": "count" if column == "people" else "money", + } + ) wage_facts = inventory.cells( "ird_wage_salary_distribution.ty2026.income_bands", measure="individuals" ) @@ -705,6 +725,7 @@ def build_reference_documents(artifact, *, package_dir=SPEC): "identity", "rolled_forward_by_ratio", "allocated_residual_by_ratio", + "linear_combination", ] if reference_set == "calibration" else ["identity"], @@ -791,14 +812,31 @@ def _reference_profiles(inventory, rows): profiles[profile] = {"transformations": transformations} return { "schema_version": 1, + "factor_context_resource": "reference_aging.json", "dimensions": { "census_residual_allocation": {"default": "mar", "profiles": profiles}, "aging_index": { "default": "central", "profiles": { - "central": {"transformations": [], "deferred": True}, - "low": {"available": False, "transformations": []}, - "high": {"available": False, "transformations": []}, + profile: { + "transformations": [ + { + "operation": "scale_money_and_intervals", + "factor_id": f"ird_ty2024_to_ty2027_{profile}", + "reference_names": [ + f"ird_taxable_income_total_by_band__{row_id}" + for row_id in IRD_NATIONAL_ROWS + ], + "count_reference_names": [ + f"ird_taxable_income_people_by_band__{row_id}" + for row_id in IRD_NATIONAL_ROWS + ], + "interval_table_ids": [], + "required_measurement_binding": IRD_MEASUREMENT_BINDING, + } + ] + } + for profile in ("low", "central", "high") }, }, }, @@ -1017,7 +1055,7 @@ def _receipts(inventory, erp, documents, feed_pin, ta_facts): ), ( "qes_prefu_and_b5_ageing", - "G8-r2; QES/PREFU rows are present in the pinned artifact but unused by this residual-allocation task.", + "QES/PREFU feed rows support the declared factor calculations in reference_aging.json; they never become direct calibration references or carried target values.", ), ( "wff_tripwires", From 1d5fff46eb3fce592a893f1cf2f73774e6bdcd6b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 04:52:42 -0400 Subject: [PATCH 02/10] Bind factor application to roster roles; make lexical floats opt-in Fixes the #1382 review (Sol r1) and the UK hub's loader notes. - Factor application: each transformed row's role (money or count) now comes from the selected profile's companion roster, not the rehashable action label. Money rows must carry exactly the verified singleton linear_combination; count rows keep their original operation, operands and kind. Both reviewer tampering cases refuse at the resolver and at compilation. - Lexical floats: load_ledger_consumer_artifact(lexical_floats=False) by default returns builtin floats again. Only compile replay with selected factors and the NZ ageing generator opt in; a static test pins those call sites. - _strict_scalar_equal treats LexicalFloat as float; bool, int and float stay distinct. - Oracle: exact roots return a zero-width enclosure and ambiguous bounds are refined; the (32, 1, 0, 2, 4) tie is an explicit example. - RuleSpec scan: only the seven Chronicle identity fields are exempt. - Factor schedules: frequency 1-12 and digits 0-18, so exact receipts stay serializable. Tests: 24 engine-free files, 3,024 passed and 5 skipped (UK feed not configured), one file per run; six new mutants killed. Co-Authored-By: GPT-6.1 Sol Co-Authored-By: Claude Opus 5.5 --- .../nz-reference-ageing-factors.added.md | 12 +- .../src/microcosm/build/ledger_artifact.py | 24 ++-- .../src/microcosm/build/ledger_targets.py | 5 +- .../src/microcosm/build/reference_factors.py | 35 ++++-- .../src/microcosm/build/reference_profiles.py | 92 ++++++++++++++- .../build/transport/target_kernels.py | 7 +- .../shared/test_ledger_artifact.py | 87 +++++++++++++- .../engine_free/shared/test_ledger_targets.py | 57 +++++++++ .../shared/test_nz_reference_aging.py | 2 +- .../shared/test_nz_spec_package.py | 35 ++++-- .../shared/test_reference_factors.py | 102 +++++++++++++--- .../shared/test_reference_profiles.py | 111 ++++++++++++++++++ .../shared/test_transport_target_kernels.py | 75 ++++++++++++ .../reference_factor_transport.py | 2 +- tools/generate_nz_reference_aging.py | 2 +- 15 files changed, 587 insertions(+), 61 deletions(-) diff --git a/changelog.d/nz-reference-ageing-factors.added.md b/changelog.d/nz-reference-ageing-factors.added.md index d625f48eb6..2f8a2967d2 100644 --- a/changelog.d/nz-reference-ageing-factors.added.md +++ b/changelog.d/nz-reference-ageing-factors.added.md @@ -4,6 +4,12 @@ compiler replay. Declare the reviewed NZ ageing profiles and their explicit mone and count companions while keeping the income references parked for measurement closure. -Keep authenticated decimal tokens in compact slotted floats that survive copying -and pickling. Bind factor evidence to reviewed feed identities while allowing -prose-only pin edits; refuse replay when the source commit cannot be authenticated. +Retain authenticated decimal tokens only with explicit lexical-float loading for +selected factors; ordinary loads keep plain floats and their serializer and memory +behavior. Bind factor application to the selected money/count roster and preserve +count operations. Certify exact-root ties in the independent oracle and bound +supported schedules so exact receipts remain serializable. Float selector pins +match token-retaining floats while keeping booleans, integers and floats distinct. +Scan extra feed-identity fields for RuleSpec commits. Bind factor evidence to +reviewed feed identities while allowing prose-only pin edits; refuse replay when +the source commit cannot be authenticated. diff --git a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py index 8d35f4b2ff..c181d68e9a 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_artifact.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_artifact.py @@ -108,11 +108,12 @@ def chronicle_feed_identity(feed_pin: Mapping[str, Any]) -> dict[str, Any]: class LexicalFloat(float): - """An ordinary float retaining its authenticated JSON numeric token. + """An opt-in float retaining its authenticated JSON numeric token. - Existing consumers and JSON serialization retain their float behavior. - Exact-arithmetic consumers can inspect ``lexical_token`` and prove that - converting the float back to decimal reproduces the published operand. + Request ``lexical_floats=True`` when loading operands for exact arithmetic. + The default loader returns plain floats, avoiding the instance and token + overhead and preserving compatibility with serializers requiring exact + float types. Standard JSON serialization retains the same numeric bytes. """ __slots__ = ("lexical_token",) @@ -296,6 +297,7 @@ def load_ledger_consumer_artifact( expected_facts_sha256: str | None = None, expected_manifest_sha256: str | None = None, feed_pin: Mapping[str, Any] | None = None, + lexical_floats: bool = False, ) -> LedgerConsumerArtifact: """Load a Ledger consumer artifact directory or bare consumer-facts file. @@ -305,6 +307,8 @@ def load_ledger_consumer_artifact( reviewed against; any mismatch raises before facts are used. ``feed_pin`` additionally checks all six reviewed artifact fields, without replacing the manifest integrity checks or either optional hash check. + ``lexical_floats=True`` retains numeric tokens for factor verification; + otherwise JSON decimals load as plain ``float`` instances. """ artifact_path = Path(path) if not artifact_path.exists(): @@ -360,7 +364,7 @@ def load_ledger_consumer_artifact( if feed_pin is not None: artifact = LedgerConsumerArtifact( path=artifact_path, - facts=_load_fact_rows(facts_path), + facts=_load_fact_rows(facts_path, lexical_floats=lexical_floats), facts_sha256=facts_sha256, manifest=manifest, manifest_sha256=manifest_sha256, @@ -386,7 +390,7 @@ def load_ledger_consumer_artifact( if artifact is None: artifact = LedgerConsumerArtifact( path=artifact_path, - facts=_load_fact_rows(facts_path), + facts=_load_fact_rows(facts_path, lexical_floats=lexical_floats), facts_sha256=facts_sha256, manifest=manifest, manifest_sha256=manifest_sha256, @@ -435,7 +439,9 @@ def resolve_ledger_artifact(args: Namespace) -> LedgerConsumerArtifact | None: ) -def _load_fact_rows(path: Path) -> tuple[dict[str, Any], ...]: +def _load_fact_rows( + path: Path, *, lexical_floats: bool = False +) -> tuple[dict[str, Any], ...]: rows: list[dict[str, Any]] = [] with path.open() as file: for line_number, line in enumerate(file, start=1): @@ -443,7 +449,9 @@ def _load_fact_rows(path: Path) -> tuple[dict[str, Any], ...]: if not stripped: continue try: - row = json.loads(stripped, parse_float=LexicalFloat) + row = json.loads( + stripped, parse_float=LexicalFloat if lexical_floats else float + ) except json.JSONDecodeError as exc: raise ValueError( f"Invalid Ledger facts JSONL row {line_number}: {exc.msg}" diff --git a/packages/microcosm-build/src/microcosm/build/ledger_targets.py b/packages/microcosm-build/src/microcosm/build/ledger_targets.py index 3af241ca1c..035f18ad8a 100644 --- a/packages/microcosm-build/src/microcosm/build/ledger_targets.py +++ b/packages/microcosm-build/src/microcosm/build/ledger_targets.py @@ -20,6 +20,7 @@ from types import MappingProxyType from typing import Any +from microcosm.build.ledger_artifact import LexicalFloat from microcosm.calibrate import ( CalibrationHierarchy, CalibrationHierarchySeed, @@ -5058,7 +5059,9 @@ def _dimension_values_match(fact: object, expected: object) -> bool: def _strict_scalar_equal(actual: object, expected: object) -> bool: - return type(actual) is type(expected) and actual == expected + actual_type = float if type(actual) is LexicalFloat else type(actual) + expected_type = float if type(expected) is LexicalFloat else type(expected) + return actual_type is expected_type and actual == expected def _measure_concepts(fact: object) -> tuple[str, ...]: diff --git a/packages/microcosm-build/src/microcosm/build/reference_factors.py b/packages/microcosm-build/src/microcosm/build/reference_factors.py index b8ad41911f..387c64b958 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_factors.py +++ b/packages/microcosm-build/src/microcosm/build/reference_factors.py @@ -24,6 +24,12 @@ OPERATION = "projected_period_average_ratio" OPERATION_VERSION = 1 +# Exact powers in projected receipts grow with both schedule size and root +# precision. Keep ordinary schedules within the stock integer serialization +# budget, including when rounding needs a finer root enclosure. +_MAX_SUBPERIODS_PER_YEAR = 12 +_MAX_ROUNDING_DIGITS = 18 +_MAX_RECEIPT_ROOT_PLACES = 256 _DECLARATION_FIELDS = frozenset( { "schema_version", @@ -186,11 +192,20 @@ def _declaration(declaration: object) -> dict: if row["projection_policy"] != "observed_preferred_latest_contiguous": raise ValueError("Unknown factor projection policy.") frequency = row["subperiods_per_year"] - if type(frequency) is not int or not 1 <= frequency <= 366: - raise ValueError("subperiods_per_year must be a declared positive integer.") + if type(frequency) is not int or not 1 <= frequency <= _MAX_SUBPERIODS_PER_YEAR: + raise ValueError( + "subperiods_per_year must be an integer from 1 to " + f"{_MAX_SUBPERIODS_PER_YEAR} for serializable exact receipts." + ) rounding = _closed(row["rounding"], {"digits", "mode"}, "factor rounding") - if type(rounding.get("digits")) is not int or not 0 <= rounding["digits"] <= 100: - raise ValueError("Factor rounding digits must be an integer from 0 to 100.") + if ( + type(rounding.get("digits")) is not int + or not 0 <= rounding["digits"] <= _MAX_ROUNDING_DIGITS + ): + raise ValueError( + "Factor rounding digits must be an integer from 0 to " + f"{_MAX_ROUNDING_DIGITS} for serializable exact receipts." + ) if rounding.get("mode") != "nearest_half_even": raise ValueError("Factor rounding must be nearest_half_even.") expected = _read_rational(row["expected_operational_factor"], "expected factor") @@ -403,7 +418,10 @@ def _operand( "decimal_values_equal": True, } else: - raise ValueError("Factor operand lacks an authenticated lexical numeric token.") + raise ValueError( + "Factor operand lacks an authenticated lexical numeric token; " + "load the artifact with lexical_floats=True." + ) numeric = _decimal(token, "feed numeric token") return numeric, { "selector": selector, @@ -539,7 +557,7 @@ def numerator_at(root: Fraction) -> Fraction: digits = row["rounding"]["digits"] precision = digits + 8 - while precision <= 4096: + while precision <= _MAX_RECEIPT_ROOT_PLACES: lower, upper, exact = certified_nth_root_bounds( 1 + effective_growth, frequency, precision ) @@ -556,7 +574,10 @@ def numerator_at(root: Fraction) -> Fraction: break precision *= 2 else: - raise ValueError("Factor rounding cannot be certified unambiguously.") + raise ValueError( + "Factor rounding cannot be certified within the supported exact receipt " + "precision." + ) factor = {"numerator": rounded_lower, "denominator": 10**digits} if rounded_lower <= 0: raise ValueError("Operational factor must be positive.") diff --git a/packages/microcosm-build/src/microcosm/build/reference_profiles.py b/packages/microcosm-build/src/microcosm/build/reference_profiles.py index 881fdbf496..9c1fdebf00 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_profiles.py +++ b/packages/microcosm-build/src/microcosm/build/reference_profiles.py @@ -312,6 +312,8 @@ def resolve_reference_profiles( if selected_factors: receipt.update( resolver_version=FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION, + selected_declarations=_copy(chosen), + base_reference_document=_copy(base), selected_factors=_copy(selected_factors), selected_factor_identities={ factor_id: { @@ -511,6 +513,45 @@ def resolve_reference_profiles( return effective, intervals, receipt +def _factor_reference_bindings(resolution: Mapping) -> tuple[dict, set]: + """Recover each factor row's role and source behavior from bound documents.""" + if resolution["resolver_version"] == REFERENCE_PROFILE_RESOLVER_VERSION: + return {}, set() + chosen = _mapping(resolution.get("selected_declarations"), "selected declarations") + base = _mapping(resolution.get("base_reference_document"), "base references") + if reference_document_sha256(chosen) != resolution.get( + "selected_declarations_sha256" + ) or reference_document_sha256(base) != resolution.get("base_references_sha256"): + raise ValueError("Factor companion source document identity mismatch.") + if { + dimension: choice.get("name") for dimension, choice in chosen.items() + } != resolution.get("selection"): + raise ValueError("Selected profile declaration identity mismatch.") + source_rows = _sequence(base.get("target_references"), "base target references") + by_name = {row["name"]: row for row in source_rows} + if len(by_name) != len(source_rows): + raise ValueError("Base reference names must be unique.") + bindings, other_names = {}, set() + for dimension, choice in chosen.items(): + for transform in choice["declaration"].get("transformations", []): + if transform.get("operation") != SCALE_MONEY_AND_INTERVALS: + other_names.update(_explicit_names(transform, "reference_names")) + continue + money, counts = _validate_companions(transform, by_name) + for role, names in (("money", money), ("count", counts)): + for name in names: + if name in bindings: + raise ValueError("Duplicate factor companion roster entry.") + bindings[name] = { + "dimension": dimension, + "profile": choice["name"], + "factor_id": transform["factor_id"], + "role": role, + "source": by_name[name], + } + return bindings, other_names + + def validate_reference_resolution( document: Mapping, receipt: Mapping, @@ -545,6 +586,7 @@ def validate_reference_resolution( interval_document ) != resolution.get("effective_intervals_sha256"): raise ValueError("Effective interval document hash mismatch.") + factor_bindings, other_names = _factor_reference_bindings(resolution) names, used_factors = [], set() for row in document.get("target_references", ()): metadata = row.get("metadata", {}) @@ -556,8 +598,35 @@ def validate_reference_resolution( ): raise ValueError("Effective reference profile identity mismatch.") action = resolution.get("transformations", {}).get(row["name"], {}) - if "factor_id" in action: - factor_id = action["factor_id"] + binding = factor_bindings.get(row["name"]) + if factors and binding is None and row["name"] not in other_names: + raise ValueError( + "Factor action names a row outside its companion roster." + ) + if binding is not None or "factor_id" in action: + if binding is None: + raise ValueError( + "Factor action names a row outside its companion roster." + ) + role = binding["role"] + operation = "linear_combination" if role == "money" else "identity" + if action.get("operation") != operation or any( + action.get(key) != binding[key] + for key in ("dimension", "profile", "factor_id") + ): + raise ValueError( + "Factor action disagrees with its companion roster role." + ) + source = binding["source"] + if ( + metadata.get("reference_value_kind") != role + or row.get("ledger_selector") != source.get("ledger_selector") + or row.get("period") != source.get("period") + ): + raise ValueError( + "Effective factor companion source semantics changed." + ) + factor_id = binding["factor_id"] if factor_id not in factors: raise ValueError( "A transformed reference has missing factor evidence." @@ -572,10 +641,10 @@ def validate_reference_resolution( or action.get("target_period") != declaration["target_period"] ): raise ValueError("Effective reference factor identity mismatch.") - if action.get("operation") == "linear_combination": + if role == "money": expected = [ { - "aggregate_fact_key": row.get("ledger_selector", {}).get( + "aggregate_fact_key": source.get("ledger_selector", {}).get( "aggregate_fact_key" ), "expected_member_count": 1, @@ -585,14 +654,25 @@ def validate_reference_resolution( if ( row.get("value_operation") != "linear_combination" or row.get("value_operands") != expected + or action.get("operand_selectors") != expected ): raise ValueError( "Effective money factor must be applied exactly once." ) - elif action.get("operation") != "identity": - raise ValueError("Unsupported factor transformation action.") + elif ( + row.get("value_operation", "identity") + != source.get("value_operation", "identity") + or row.get("value_operands", []) != source.get("value_operands", []) + or action.get("operand_selectors") + != source.get("value_operands", []) + ): + raise ValueError( + "Effective count value semantics must remain unchanged." + ) if sorted(names) != resolution.get("transformed_names"): raise ValueError("Resolution receipt transformed names mismatch.") if used_factors != set(factors): raise ValueError("Resolution receipt has unused selected factor evidence.") + if set(factor_bindings) - set(names): + raise ValueError("Resolution receipt is missing factor companion rows.") return resolution diff --git a/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py b/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py index 8e3c14221a..efd5fbe291 100644 --- a/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py +++ b/packages/microcosm-build/src/microcosm/build/transport/target_kernels.py @@ -399,7 +399,12 @@ def compile_target_surface( document, reference_resolution, references_sha256=references_sha256 ) artifact = load_ledger_consumer_artifact( - facts_path, expected_facts_sha256=expected_facts_sha256, feed_pin=feed_pin + facts_path, + expected_facts_sha256=expected_facts_sha256, + feed_pin=feed_pin, + lexical_floats=bool( + reference_resolution and reference_resolution.get("selected_factors") + ), ) if reference_resolution is not None: for entry in reference_resolution.get("selected_factors", {}).values(): diff --git a/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py b/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py index 557e6216da..7dc217711d 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_ledger_artifact.py @@ -2,6 +2,7 @@ from __future__ import annotations +import ast import hashlib import json import os @@ -26,6 +27,7 @@ resolve_ledger_artifact, validate_chronicle_feed_pin, ) +from microcosm.graph.canonical import canonical_json from test_support.microcosm_build.chronicle_feed import write_pinned_artifact from test_support.paths import paths_for @@ -96,7 +98,7 @@ def test_authenticated_float_retains_lexical_token_without_changing_json(tmp_pat facts_path.write_text(original) facts_sha = hashlib.sha256(original.encode()).hexdigest() artifact = load_ledger_consumer_artifact( - facts_path, expected_facts_sha256=facts_sha + facts_path, expected_facts_sha256=facts_sha, lexical_floats=True ) value = artifact.facts[0]["value"] assert isinstance(value, LexicalFloat) @@ -111,11 +113,53 @@ def test_authenticated_float_retains_lexical_token_without_changing_json(tmp_pat assert artifact.facts_sha256 == facts_sha +@pytest.mark.parametrize("pinned", [False, True]) +def test_default_float_loading_returns_exact_builtin_float(tmp_path, pinned): + path, pin = write_pinned_artifact(tmp_path / "artifact", [_fact_row(value=0.1)]) + artifact = load_ledger_consumer_artifact( + path, **({"feed_pin": pin} if pinned else {}) + ) + + assert type(artifact.facts[0]["value"]) is float + + +def test_lexical_float_opt_in_is_limited_to_factor_consumers(): + repository = paths_for("microcosm-build").repository + sources = list((repository / "packages").glob("*/src/**/*.py")) + sources.extend((repository / "tools").rglob("*.py")) + opt_ins = set() + for path in sources: + for node in ast.walk(ast.parse(path.read_text())): + if not isinstance(node, ast.Call): + continue + for keyword in node.keywords: + if keyword.arg != "lexical_floats": + continue + # A loader forwarding its caller's choice is not an opt-in. + if ( + isinstance(keyword.value, ast.Name) + and keyword.value.id == "lexical_floats" + ): + continue + if ( + isinstance(keyword.value, ast.Constant) + and keyword.value.value is False + ): + continue + opt_ins.add(path.relative_to(repository).as_posix()) + assert opt_ins == { + "packages/microcosm-build/src/microcosm/build/transport/target_kernels.py", + "tools/generate_nz_reference_aging.py", + } + + @pytest.mark.parametrize("protocol", range(pickle.HIGHEST_PROTOCOL + 1)) def test_authenticated_float_pickle_preserves_lexical_token(tmp_path, protocol): facts_path = tmp_path / "consumer_facts.jsonl" facts_path.write_text('{"aggregate_fact_key":"decimal","value":1.2500e2}\n') - value = load_ledger_consumer_artifact(facts_path).facts[0]["value"] + value = load_ledger_consumer_artifact(facts_path, lexical_floats=True).facts[0][ + "value" + ] restored = pickle.loads(pickle.dumps(value, protocol=protocol)) @@ -128,7 +172,9 @@ def test_authenticated_float_pickle_preserves_lexical_token(tmp_path, protocol): def test_authenticated_float_deepcopy_preserves_lexical_token(tmp_path): facts_path = tmp_path / "consumer_facts.jsonl" facts_path.write_text('{"aggregate_fact_key":"decimal","value":1.2500e2}\n') - value = load_ledger_consumer_artifact(facts_path).facts[0]["value"] + value = load_ledger_consumer_artifact(facts_path, lexical_floats=True).facts[0][ + "value" + ] restored = deepcopy(value) @@ -582,3 +628,38 @@ def test_real_nz_artifact_matches_committed_feed_pin(): assert artifact.fact_row_count == pin["fact_row_count"] assert artifact.schema_version == pin["artifact_schema_version"] assert list(artifact.fact_schema_versions) == pin["consumer_fact_schema_versions"] + + +def test_real_nz_lexical_opt_in_preserves_canonical_bytes(): + artifact_path = os.environ.get("NZ_CHRONICLE_ARTIFACT") + if not artifact_path: + pytest.skip("NZ_CHRONICLE_ARTIFACT is unset") + pin_path = ( + paths_for("microcosm-build").package + / "src/microcosm/build/nz/chronicle_feed.json" + ) + pin = json.loads(pin_path.read_text()) + plain = load_ledger_consumer_artifact(artifact_path, feed_pin=pin) + lexical = load_ledger_consumer_artifact( + artifact_path, feed_pin=pin, lexical_floats=True + ) + + def floats(value): + if isinstance(value, float): + yield value + elif isinstance(value, dict): + for child in value.values(): + yield from floats(child) + elif isinstance(value, (list, tuple)): + for child in value: + yield from floats(child) + + plain_values, lexical_values = ( + list(floats(plain.facts)), + list(floats(lexical.facts)), + ) + assert plain_values + assert all(type(value) is float for value in plain_values) + assert all(type(value) is LexicalFloat for value in lexical_values) + assert [float(value.lexical_token) for value in lexical_values] == plain_values + assert canonical_json(plain.facts) == canonical_json(lexical.facts) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_ledger_targets.py b/packages/microcosm-build/tests/engine_free/shared/test_ledger_targets.py index 59fe6e2246..2a9413fb65 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_ledger_targets.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_ledger_targets.py @@ -7,9 +7,14 @@ TargetCoverageRequirement, target_profile_coverage_gate, ) +from microcosm.build.ledger_artifact import ( + LexicalFloat, + load_ledger_consumer_artifact, +) from microcosm.build.ledger_targets import ( LedgerTargetMapping, LedgerTargetReference, + _strict_scalar_equal, apply_ledger_target_profile, compile_ledger_target_references, constraint_bound_shadowing_dimensions, @@ -1729,6 +1734,58 @@ def test__given_selector_matches_multiple_eligible_months__then_latest_month_is_ class TestLedgerSelectorExtensions: + @pytest.mark.parametrize( + ("actual", "expected", "equal"), + [ + (LexicalFloat("0.1"), 0.1, True), + (0.1, LexicalFloat("0.1"), True), + (LexicalFloat("0.1"), LexicalFloat("0.10"), True), + (1, 1.0, False), + (1.0, 1, False), + (True, 1, False), + (1, True, False), + (True, 1.0, False), + (1.0, True, False), + (LexicalFloat("1.0"), 1, False), + (1, LexicalFloat("1.0"), False), + (LexicalFloat("1.0"), True, False), + (True, LexicalFloat("1.0"), False), + ], + ) + def test_strict_scalar_equal_treats_lexical_floats_as_floats( + self, actual, expected, equal + ) -> None: + assert _strict_scalar_equal(actual, expected) is equal + + @pytest.mark.parametrize("lexical_floats", [False, True]) + def test_float_dimension_pin_compiles_loaded_fact( + self, tmp_path, lexical_floats + ) -> None: + facts_path = tmp_path / "consumer_facts.jsonl" + facts_path.write_text( + json.dumps(_consumer_fact_row(dimensions={"band": 0.1})) + "\n" + ) + artifact = load_ledger_consumer_artifact( + facts_path, lexical_floats=lexical_floats + ) + dimension = artifact.facts[0]["dimensions"]["band"] + assert type(dimension) is (LexicalFloat if lexical_floats else float) + reference = LedgerTargetReference( + name="float dimension selector", + ledger_selector={"dimension_values": {"band": 0.1}}, + entity="tax_unit", + measure="adjusted_gross_income", + period=2023, + family="irs_soi", + ) + + (target,) = compile_ledger_target_references( + artifact.facts, [reference], country="us" + ).specs + + assert target.name == reference.name + assert target.value == artifact.facts[0]["value"] + def test_dimension_values_use_strict_typed_equality(self) -> None: reference = LedgerTargetReference( name="typed dimension selector", diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py index 448085b354..136e81bacb 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py @@ -62,7 +62,7 @@ def artifact(): root = os.environ.get("NZ_CHRONICLE_ARTIFACT") if not root: pytest.skip("NZ_CHRONICLE_ARTIFACT is not set") - loaded = load_ledger_consumer_artifact(Path(root)) + loaded = load_ledger_consumer_artifact(Path(root), lexical_floats=True) validate_chronicle_feed_pin(loaded, _document()["feed_identity"]) return loaded diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py index 3a561ac84c..6a30848d75 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_spec_package.py @@ -309,9 +309,9 @@ def rulespec_commit_mentions(value: object) -> set[str]: "rulespec" in any case); - the value, at any depth, of a key that contains "commit" in any case, unless the key's mapping is a foreign record (its repository - attribution lacks "rulespec", or a complete Chronicle identity below - ``feed_identity``) and neither the key nor an enclosing - key contains "rulespec". + attribution lacks "rulespec") or the key is one of the seven fields + of a complete Chronicle identity below ``feed_identity``, and neither + the key nor an enclosing key contains "rulespec". A foreign record cancels the context it sits in, except that its commit keys still count below a rulespec key. Integers count where hex strings @@ -338,33 +338,37 @@ def visit( rulespec_record = any( "rulespec" in repository.lower() for repository in repositories ) - artifact_identity = False + artifact_identity_fields: set[str] = set() if feed_identity_record and is_accepted_consumer_artifact_schema_version( node.get("artifact_schema_version") ): try: - chronicle_feed_identity(node) + artifact_identity_fields = set(chronicle_feed_identity(node)) except ValueError: pass - else: - artifact_identity = True - foreign = (named or artifact_identity) and not rulespec_record + foreign = named and not rulespec_record if rulespec_record: commit_value = True elif foreign: commit_value = False for key, child in node.items(): name = str(key).lower() - commit_key = "commit" in name and (rulespec_context or not foreign) + identity_field = key in artifact_identity_fields + field_commit_value = commit_value and ( + rulespec_context or not identity_field + ) + commit_key = "commit" in name and ( + rulespec_context or (not foreign and not identity_field) + ) visit( str(key), rulespec_context=rulespec_context, - commit_value=commit_value, + commit_value=field_commit_value, ) visit( child, rulespec_context=rulespec_context or "rulespec" in name, - commit_value=commit_value or commit_key or "rulespec" in name, + commit_value=field_commit_value or commit_key or "rulespec" in name, feed_identity_record=name == "feed_identity", ) elif isinstance(node, list): @@ -1486,6 +1490,8 @@ class TestRulespecPin: "unattributed", "incomplete", "explicit_commit", + "extra_commit", + "rulespec_extra_revision", "prose", "rulespec_context", "wrong_schema", @@ -1505,6 +1511,13 @@ def test_chronicle_identity_scope_preserves_rulespec_mentions(self, case) -> Non elif case == "explicit_commit": identity["rulespec_nz_commit"] = "c0ffee1" expected = {"c0ffee1"} + elif case == "extra_commit": + identity["commit"] = "deadbee" + expected = {"deadbee"} + elif case == "rulespec_extra_revision": + identity["revision"] = "deadbee" + payload = {"rulespec": payload} + expected = {commit, "deadbee"} elif case == "prose": identity["notes"] = "RuleSpec-nz deadbee" expected = {"deadbee"} diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py index 73f3a1c0ae..2c9d98ebf4 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py @@ -5,7 +5,7 @@ from fractions import Fraction import pytest -from hypothesis import given, settings +from hypothesis import example, given, settings from hypothesis import strategies as st from microcosm_build.reference_factors import factor_context_fixture, factor_fixture @@ -17,6 +17,7 @@ resolve_reference_factor, validate_factor_context, ) +from microcosm.graph.canonical import canonical_json def _fraction(row): @@ -39,7 +40,10 @@ def _oracle_root(radicand, degree, places=50): low = middle else: high = middle - return Fraction(low, denominator), Fraction(high, denominator) + lower = Fraction(low, denominator) + if lower**degree == radicand: + return lower, lower + return lower, Fraction(high, denominator) def _oracle_round(number, digits): @@ -52,22 +56,35 @@ def _oracle_round(number, digits): return quotient -def _oracle_factor(source, anchor, growth, frequency, digits): - low, high = _oracle_root(1 + Fraction(growth) / 100, frequency) - lower = ( - Fraction(anchor) - / Fraction(source) - * sum(low**index for index in range(frequency)) - / frequency - ) - upper = ( - Fraction(anchor) - / Fraction(source) - * sum(high**index for index in range(frequency)) - / frequency +def _oracle_factor(source, anchor, growth, frequency, digits, *, places=50): + while places <= 4096: + low, high = _oracle_root(1 + Fraction(growth) / 100, frequency, places) + lower = ( + Fraction(anchor) + / Fraction(source) + * sum(low**index for index in range(frequency)) + / frequency + ) + upper = ( + Fraction(anchor) + / Fraction(source) + * sum(high**index for index in range(frequency)) + / frequency + ) + if _oracle_round(lower, digits) == _oracle_round(upper, digits): + return _oracle_round(lower, digits), (low, high) + places = max(1, places * 2) + raise AssertionError("Independent oracle could not enclose a rounded factor.") + + +def test_independent_oracle_refines_ambiguous_rounding(): + coarse = _oracle_root(Fraction(103, 100), 2, places=1) + assert _oracle_round((1 + coarse[0]) / 2, 6) != _oracle_round( + (1 + coarse[1]) / 2, 6 ) - assert _oracle_round(lower, digits) == _oracle_round(upper, digits) - return _oracle_round(lower, digits), (low, high) + expected, bounds = _oracle_factor("1", "1", "3", 2, 6, places=1) + assert expected == 1007445 + assert bounds[1] - bounds[0] < coarse[1] - coarse[0] def test_factor_resolves_exact_operands_once_and_replays(): @@ -242,7 +259,7 @@ def test_closed_declaration_guards(field, mutation, message): ("coverage", "coverage mismatch"), ("boolean", "Boolean"), ("nan", "finite"), - ("float_without_token", "lexical numeric token"), + ("float_without_token", "lexical_floats=True"), ("lossy_float", "does not reproduce"), ("negative", "positive"), ], @@ -479,6 +496,7 @@ def test_receipt_tampering_refuses_and_unselected_edits_are_local(): @settings(max_examples=70, deadline=None) +@example(source=32, anchor=1, growth=0, frequency=2, digits=4) @given( source=st.integers(1, 10**9), anchor=st.integers(1, 10**9), @@ -533,3 +551,51 @@ def test_very_large_integer_cross_products_do_not_overflow(): factor, receipt = resolve_reference_factor(declaration, facts, identity) assert factor["numerator"] == 3000000 assert _fraction(receipt["denominator_mean"]) == huge + + +@pytest.mark.parametrize( + "frequency,digits,message", + [ + (13, 6, "subperiods_per_year.*1 to 12.*serializable"), + (365, 6, "subperiods_per_year.*1 to 12.*serializable"), + (12, 19, "rounding digits.*0 to 18.*serializable"), + ], +) +def test_unsupported_exact_receipt_schedule_refuses_at_declaration( + frequency, digits, message +): + declaration, facts, identity = factor_fixture() + declaration["subperiods_per_year"] = frequency + declaration["rounding"]["digits"] = digits + # A malformed schedule is intentional: range validation must precede it. + declaration["source_schedule"] = [] + with pytest.raises(ValueError, match=message): + resolve_reference_factor(declaration, facts, identity) + + +def test_largest_supported_schedule_and_rounding_have_serializable_exact_receipt(): + expected, _ = _oracle_factor("100", "110", "3", 12, 18) + declaration, facts, identity = factor_fixture( + frequency=12, growth="3", digits=18, expected_numerator=expected + ) + factor, receipt = resolve_reference_factor(declaration, facts, identity) + assert factor == {"numerator": expected, "denominator": 10**18} + encoded = canonical_json(receipt) + assert encoded and factor_document_sha256(receipt) + replay_reference_factor(declaration, facts, identity, factor, receipt) + + +def test_root_refinement_stays_within_exact_receipt_precision_budget(monkeypatch): + precisions = [] + + def ambiguous_bounds(value, degree, decimal_places): + precisions.append(decimal_places) + return Fraction(1), Fraction(2), False + + monkeypatch.setattr( + "microcosm.build.reference_factors.certified_nth_root_bounds", ambiguous_bounds + ) + declaration, facts, identity = factor_fixture(frequency=12, digits=18) + with pytest.raises(ValueError, match="supported exact receipt precision"): + resolve_reference_factor(declaration, facts, identity) + assert precisions == [26, 52, 104, 208] diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index c803dc5bb9..94e339494d 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -608,3 +608,114 @@ def test_self_consistent_effective_money_tampering_still_refuses(): receipt["receipt_sha256"] = reference_document_sha256(receipt) with pytest.raises(ValueError, match="must be applied exactly once"): validate_reference_resolution(effective, receipt) + + +@pytest.mark.parametrize("target", ["count", "money"]) +def test_rehashed_factor_application_cannot_bypass_companion_role(target): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + row = next( + row for row in effective["target_references"] if row["name"] == f"{target}_0" + ) + row["value_operation"] = "linear_combination" + row["value_operands"] = [ + { + "aggregate_fact_key": row["ledger_selector"]["aggregate_fact_key"], + "expected_member_count": 1, + "weight": 2, + } + ] + if target == "money": + receipt["transformations"][row["name"]]["operation"] = "identity" + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="roster role|count value semantics"): + validate_reference_resolution(effective, receipt) + + +def test_count_preserves_original_weighted_operation_and_refuses_changed_weight(): + references, declarations, context = _scaling_inputs() + source = references["target_references"][0] + source["value_operation"] = "linear_combination" + source["value_operands"] = [ + { + "aggregate_fact_key": source["ledger_selector"]["aggregate_fact_key"], + "expected_member_count": 1, + "weight": 1, + } + ] + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + row = effective["target_references"][0] + assert row["value_operation"] == source["value_operation"] + assert row["value_operands"] == source["value_operands"] + assert row["metadata"]["reference_value_kind"] == "count" + action = receipt["transformations"][row["name"]] + assert action["operation"] == "identity" + assert action["operand_selectors"] == source["value_operands"] + assert validate_reference_resolution(effective, receipt) == receipt + + row["value_operands"][0]["weight"] = 2 + action["operand_selectors"][0]["weight"] = 2 + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="count value semantics"): + validate_reference_resolution(effective, receipt) + + +@pytest.mark.parametrize( + "mutation", + [ + "count_action", + "count_kind", + "outside_roster", + "outside_roster_without_factor", + "source_values", + "roster", + ], +) +def test_factor_roles_and_count_semantics_use_hash_bound_source_documents(mutation): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + row = effective["target_references"][0] + if mutation == "count_action": + receipt["transformations"][row["name"]]["operation"] = "linear_combination" + elif mutation == "count_kind": + row["metadata"]["reference_value_kind"] = "money" + elif mutation == "outside_roster": + previous = row["name"] + row["name"] = "unlisted_count" + receipt["transformations"][row["name"]] = receipt["transformations"].pop( + previous + ) + receipt["transformed_names"] = sorted(receipt["transformations"]) + elif mutation == "outside_roster_without_factor": + extra = copy.deepcopy(row) + extra["name"] = "unlisted_count" + effective["target_references"].append(extra) + receipt["transformations"][extra["name"]] = copy.deepcopy( + receipt["transformations"][row["name"]] + ) + receipt["transformations"][extra["name"]].pop("factor_id") + receipt["transformed_names"] = sorted(receipt["transformations"]) + elif mutation == "source_values": + receipt["base_reference_document"]["target_references"][0]["value_operands"] = [ + {"aggregate_fact_key": "count-fact-0", "weight": 2} + ] + elif mutation == "roster": + transform = receipt["selected_declarations"]["aging_index"]["declaration"][ + "transformations" + ][0] + transform["count_reference_names"][0] = "unlisted_count" + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="roster|source.*identity|source semantics"): + validate_reference_resolution(effective, receipt) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py b/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py index 426c3d88ab..0dc1f6e823 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py @@ -31,6 +31,7 @@ import microcosm.build.reference_factors as reference_factors_module import microcosm.build.reference_profiles as reference_profiles_module +import microcosm.build.transport.target_kernels as target_kernels_module from microcosm.build.ledger_artifact import ChronicleFeedPinMismatchError from microcosm.build.reference_profiles import ( reference_document_sha256, @@ -317,6 +318,80 @@ def test_compile_replay_refuses_tampered_evidence_with_recomputed_hashes(tmp_pat ) +@pytest.mark.parametrize("target", ["count", "money"]) +def test_compile_replay_refuses_rehashed_factor_application_tampering(tmp_path, target): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + row = next( + row for row in document["target_references"] if row["name"] == f"toy-{target}" + ) + row["value_operation"] = "linear_combination" + row["value_operands"] = [ + { + "aggregate_fact_key": row["ledger_selector"]["aggregate_fact_key"], + "expected_member_count": 1, + "weight": 2, + } + ] + if target == "money": + receipt["transformations"][row["name"]]["operation"] = "identity" + receipt["effective_references_sha256"] = reference_document_sha256(document) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="roster role|count value semantics"): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + + +@pytest.mark.parametrize( + "resolved", [False, True], ids=["unresolved", "legacy-resolution"] +) +def test_no_factor_compilation_is_identical_with_or_without_lexical_loading( + tmp_path, monkeypatch, resolved +): + facts = toy_facts(CALIBRATION_TARGETS) + path = write_facts(tmp_path / "facts.jsonl", facts) + document = references_for(CALIBRATION_TARGETS) + receipt = None + if resolved: + document, _, receipt = resolve_reference_profiles( + document, {"schema_version": 1, "dimensions": {}}, {} + ) + original_loader = target_kernels_module.load_ledger_consumer_artifact + requests = [] + outputs = [] + registries = [] + for force_lexical in (False, True): + + def load_with_selected_representation(*args, lexical=force_lexical, **kwargs): + requests.append(kwargs.get("lexical_floats", False)) + kwargs["lexical_floats"] = lexical + return original_loader(*args, **kwargs) + + monkeypatch.setattr( + target_kernels_module, + "load_ledger_consumer_artifact", + load_with_selected_representation, + ) + payload, registry = compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + reference_resolution=receipt, + ) + outputs.append(payload) + registries.append([spec.value for spec in registry.specs]) + assert requests == [False, False] + assert outputs[0] == outputs[1] + assert registries[0] == registries[1] + + def test_compile_emits_a_traced_surface_bound_to_facts_not_paths(tmp_path) -> None: payload = _surface(tmp_path) surface = decode_target_surface(payload) diff --git a/test_support/microcosm_build/reference_factor_transport.py b/test_support/microcosm_build/reference_factor_transport.py index f3d539b864..1fe2f52bb4 100644 --- a/test_support/microcosm_build/reference_factor_transport.py +++ b/test_support/microcosm_build/reference_factor_transport.py @@ -97,7 +97,7 @@ def factor_transport_fixture( manifest["source_commit"] = pin["source_commit"] manifest_path.write_text(json.dumps(manifest, sort_keys=True) + "\n") pin["manifest_sha256"] = hashlib.sha256(manifest_path.read_bytes()).hexdigest() - artifact = load_ledger_consumer_artifact(path, feed_pin=pin) + artifact = load_ledger_consumer_artifact(path, feed_pin=pin, lexical_floats=True) identity = chronicle_feed_identity(pin) declaration, _, _ = factor_fixture(feed_identity=identity) evidence_facts = artifact.facts diff --git a/tools/generate_nz_reference_aging.py b/tools/generate_nz_reference_aging.py index e40961b972..1a4ce04d12 100644 --- a/tools/generate_nz_reference_aging.py +++ b/tools/generate_nz_reference_aging.py @@ -227,7 +227,7 @@ def main(): args = parser.parse_args() if not args.artifact: parser.error("--artifact or NZ_CHRONICLE_ARTIFACT is required") - artifact = load_ledger_consumer_artifact(args.artifact) + artifact = load_ledger_consumer_artifact(args.artifact, lexical_floats=True) document = build_reference_aging(artifact) encoded = json.dumps(document, ensure_ascii=False, indent=2) + "\n" if args.check: From 4f770381ee7eded181e673a70dcedeb95ec4c92b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 06:28:13 -0400 Subject: [PATCH 03/10] Bind compact factor companions instead of embedding documents 1d5fff46 embedded the selected declarations and the whole base reference document in every v2 resolution receipt, which travels in each compile and prepare node's params: the NZ default receipt grew to 4.07 MB canonical. Those documents were trusted only through hashes in the selection identity, so a compact record bound the same way is as strong. - v2 receipts carry factor_companions: per roster name, its role, factor, profile and source value semantics (474 names, 392 KB). factor_companions_sha256 and transformed_names join the v2 selection identity. - Roles still come from the bound record, never the action label; money operands and count semantics are checked as before. - The NZ default receipt is now 1.67 MB canonical, capped by a test at 2.6 MB. v1 receipt bytes are unchanged and pinned. Tests: 15 files, 2,508 passed and 5 skipped; three mutants killed. Co-Authored-By: GPT-6.1 Sol Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/reference_profiles.py | 132 +++++++---- .../shared/test_reference_profiles.py | 209 +++++++++++++++++- .../shared/test_transport_target_kernels.py | 77 +++++++ 3 files changed, 369 insertions(+), 49 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/reference_profiles.py b/packages/microcosm-build/src/microcosm/build/reference_profiles.py index 9c1fdebf00..c5a282ba66 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_profiles.py +++ b/packages/microcosm-build/src/microcosm/build/reference_profiles.py @@ -65,6 +65,8 @@ def _selection_identity(receipt: Mapping) -> dict: } if receipt.get("resolver_version") == FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION: identity["selected_factor_identities"] = receipt["selected_factor_identities"] + identity["factor_companions_sha256"] = receipt["factor_companions_sha256"] + identity["transformed_names"] = receipt["transformed_names"] return identity @@ -73,7 +75,15 @@ def validate_reference_factor_evidence(receipt: Mapping) -> dict: from microcosm.build.reference_factors import validate_factor_context if receipt.get("resolver_version") == REFERENCE_PROFILE_RESOLVER_VERSION: - if "selected_factors" in receipt or "selected_factor_identities" in receipt: + if any( + key in receipt + for key in ( + "selected_factors", + "selected_factor_identities", + "factor_companions", + "factor_companions_sha256", + ) + ): raise ValueError("Legacy resolution cannot carry factor evidence.") return {} factors = _mapping(receipt.get("selected_factors"), "selected factors") @@ -186,6 +196,43 @@ def _validate_companions(transform: Mapping, by_name: Mapping) -> tuple[list, li return money, counts +def _factor_companions(chosen: Mapping, by_name: Mapping) -> dict: + """Capture roster roles and source value semantics before transforming rows.""" + companions = {} + for dimension, choice in chosen.items(): + for transform in choice["declaration"].get("transformations", []): + if transform.get("operation") != SCALE_MONEY_AND_INTERVALS: + continue + money, counts = _validate_companions(transform, by_name) + for role, names in (("money", money), ("count", counts)): + for name in names: + if name in companions: + raise ValueError("Duplicate factor companion roster entry.") + row = by_name[name] + companions[name] = { + "role": role, + "factor_id": transform["factor_id"], + "dimension": dimension, + "profile": choice["name"], + "source": _copy( + { + "ledger_selector": row["ledger_selector"], + "period": row.get("period"), + "value_operation": row.get( + "value_operation", "identity" + ), + "value_operands": row.get("value_operands", []), + "metadata": { + "reference_value_kind": row["metadata"][ + "reference_value_kind" + ] + }, + } + ), + } + return companions + + def _satisfy_factor_prerequisite(row: dict, dimension: str, binding: str) -> list: metadata = row.setdefault("metadata", {}) if metadata.get("activation_status") != REQUIRES_PREREQUISITES: @@ -310,10 +357,22 @@ def resolve_reference_profiles( "selection": resolved_selection, } if selected_factors: + companions = _factor_companions(chosen, by_name) receipt.update( resolver_version=FACTOR_REFERENCE_PROFILE_RESOLVER_VERSION, - selected_declarations=_copy(chosen), - base_reference_document=_copy(base), + factor_companions=companions, + factor_companions_sha256=reference_document_sha256(companions), + transformed_names=sorted( + name + for choice in chosen.values() + for transform in choice["declaration"].get("transformations", []) + for field in ( + ("reference_names", "count_reference_names") + if transform.get("operation") == SCALE_MONEY_AND_INTERVALS + else ("reference_names",) + ) + for name in _explicit_names(transform, field) + ), selected_factors=_copy(selected_factors), selected_factor_identities={ factor_id: { @@ -513,43 +572,30 @@ def resolve_reference_profiles( return effective, intervals, receipt -def _factor_reference_bindings(resolution: Mapping) -> tuple[dict, set]: - """Recover each factor row's role and source behavior from bound documents.""" +def _factor_reference_bindings(resolution: Mapping) -> dict: + """Validate the compact roster bound into the v2 selection identity.""" if resolution["resolver_version"] == REFERENCE_PROFILE_RESOLVER_VERSION: - return {}, set() - chosen = _mapping(resolution.get("selected_declarations"), "selected declarations") - base = _mapping(resolution.get("base_reference_document"), "base references") - if reference_document_sha256(chosen) != resolution.get( - "selected_declarations_sha256" - ) or reference_document_sha256(base) != resolution.get("base_references_sha256"): - raise ValueError("Factor companion source document identity mismatch.") - if { - dimension: choice.get("name") for dimension, choice in chosen.items() - } != resolution.get("selection"): - raise ValueError("Selected profile declaration identity mismatch.") - source_rows = _sequence(base.get("target_references"), "base target references") - by_name = {row["name"]: row for row in source_rows} - if len(by_name) != len(source_rows): - raise ValueError("Base reference names must be unique.") - bindings, other_names = {}, set() - for dimension, choice in chosen.items(): - for transform in choice["declaration"].get("transformations", []): - if transform.get("operation") != SCALE_MONEY_AND_INTERVALS: - other_names.update(_explicit_names(transform, "reference_names")) - continue - money, counts = _validate_companions(transform, by_name) - for role, names in (("money", money), ("count", counts)): - for name in names: - if name in bindings: - raise ValueError("Duplicate factor companion roster entry.") - bindings[name] = { - "dimension": dimension, - "profile": choice["name"], - "factor_id": transform["factor_id"], - "role": role, - "source": by_name[name], - } - return bindings, other_names + return {} + bindings = _mapping(resolution.get("factor_companions"), "factor companions") + if reference_document_sha256(bindings) != resolution.get( + "factor_companions_sha256" + ): + raise ValueError("Factor companion source record identity mismatch.") + for name, raw_binding in bindings.items(): + binding = _mapping(raw_binding, "factor companion") + source = _mapping(binding.get("source"), "factor companion source") + if ( + not isinstance(name, str) + or not name + or binding.get("role") not in {"money", "count"} + or binding.get("profile") + != resolution["selection"].get(binding.get("dimension")) + or source.get("metadata", {}).get("reference_value_kind") != binding["role"] + ): + raise ValueError( + "Factor companion roster role or profile identity mismatch." + ) + return bindings def validate_reference_resolution( @@ -586,9 +632,13 @@ def validate_reference_resolution( interval_document ) != resolution.get("effective_intervals_sha256"): raise ValueError("Effective interval document hash mismatch.") - factor_bindings, other_names = _factor_reference_bindings(resolution) - names, used_factors = [], set() + factor_bindings = _factor_reference_bindings(resolution) + other_names = set(resolution["transformed_names"]) - set(factor_bindings) + names, used_factors, seen_names = [], set(), set() for row in document.get("target_references", ()): + if factors and row["name"] in seen_names: + raise ValueError("Duplicate factor companion reference roster name.") + seen_names.add(row["name"]) metadata = row.get("metadata", {}) if metadata.get("reference_profiles_resolved"): names.append(row["name"]) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index 94e339494d..d2bff8567d 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -16,6 +16,8 @@ resolve_reference_profiles, validate_reference_resolution, ) +from microcosm.graph.canonical import canonical_json +from test_support.paths import paths_for def _selector(key, category=None): @@ -434,6 +436,7 @@ def test_counts_are_invariant_and_every_money_row_uses_one_common_factor( "mismatched_filter", "overlap", "duplicate", + "duplicate_count", "source_period", "target_period", "diagnostic_factor", @@ -472,6 +475,8 @@ def test_invalid_factor_profiles_and_companions_refuse(mutation): ) elif mutation == "duplicate": transform["reference_names"].append(transform["reference_names"][0]) + elif mutation == "duplicate_count": + transform["count_reference_names"].append(transform["count_reference_names"][0]) elif mutation in {"source_period", "target_period"}: key = "ledger_selector" if mutation == "source_period" else "period" for row in references["target_references"]: @@ -581,6 +586,51 @@ def test_legacy_receipt_remains_version_one_without_factor_fields(): assert receipt["resolver_version"] == "reference-profiles-v1" assert "selected_factors" not in receipt assert "selected_factor_identities" not in receipt + assert "factor_companions" not in receipt + assert "factor_companions_sha256" not in receipt + # Canonical bytes produced by the v1 resolver at 1d5fff46. + assert reference_document_sha256(receipt) == ( + "753fe7ddb2bc5e00cc4d70a74e0cac8295af266ffbc05511101540e39ae21508" + ) + + +def test_nz_default_factor_receipt_is_compact_and_covers_the_exact_roster(): + spec = paths_for("microcosm-build").package / "src/microcosm/build/nz" + base = json.loads((spec / "target_references.json").read_text()) + declarations = json.loads((spec / "reference_profiles.json").read_text()) + context = json.loads((spec / "reference_aging.json").read_text()) + _, _, receipt = resolve_reference_profiles( + base, declarations, {}, factor_context=context + ) + assert "selected_declarations" not in receipt + assert "base_reference_document" not in receipt + companions = receipt["factor_companions"] + expected_names = { + f"ird_taxable_income_{kind}_by_band__row_{index}" + for kind in ("people", "total") + for index in range(8, 245) + } + assert len(companions) == 474 + assert set(companions) == expected_names + source_rows = {row["name"]: row for row in base["target_references"]} + for name, companion in companions.items(): + source = source_rows[name] + role = source["metadata"]["reference_value_kind"] + assert companion == { + "role": role, + "factor_id": "ird_ty2024_to_ty2027_central", + "dimension": "aging_index", + "profile": "central", + "source": { + "ledger_selector": source["ledger_selector"], + "period": source.get("period"), + "value_operation": source.get("value_operation", "identity"), + "value_operands": source.get("value_operands", []), + "metadata": {"reference_value_kind": role}, + }, + } + assert receipt["factor_companions_sha256"] == reference_document_sha256(companions) + assert len(canonical_json(receipt)) < 2_600_000 def test_unrelated_direct_fact_references_are_outside_companion_rosters(): @@ -636,6 +686,28 @@ def test_rehashed_factor_application_cannot_bypass_companion_role(target): validate_reference_resolution(effective, receipt) +def test_rehashed_action_label_cannot_change_money_into_a_count(): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + row = next( + row for row in effective["target_references"] if row["name"] == "money_0" + ) + source = receipt["factor_companions"][row["name"]]["source"] + row["metadata"]["reference_value_kind"] = "count" + row["value_operation"] = source["value_operation"] + row["value_operands"] = copy.deepcopy(source["value_operands"]) + action = receipt["transformations"][row["name"]] + action["operation"] = "identity" + action["operand_selectors"] = copy.deepcopy(source["value_operands"]) + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="roster role"): + validate_reference_resolution(effective, receipt) + + def test_count_preserves_original_weighted_operation_and_refuses_changed_weight(): references, declarations, context = _scaling_inputs() source = references["target_references"][0] @@ -675,11 +747,12 @@ def test_count_preserves_original_weighted_operation_and_refuses_changed_weight( "count_kind", "outside_roster", "outside_roster_without_factor", + "outside_roster_with_residual_label", "source_values", "roster", ], ) -def test_factor_roles_and_count_semantics_use_hash_bound_source_documents(mutation): +def test_factor_roles_and_count_semantics_use_hash_bound_companion_record(mutation): references, declarations, context = _scaling_inputs() effective, _, receipt = resolve_reference_profiles( references, declarations, {}, factor_context=context @@ -696,7 +769,10 @@ def test_factor_roles_and_count_semantics_use_hash_bound_source_documents(mutati previous ) receipt["transformed_names"] = sorted(receipt["transformations"]) - elif mutation == "outside_roster_without_factor": + elif mutation in { + "outside_roster_without_factor", + "outside_roster_with_residual_label", + }: extra = copy.deepcopy(row) extra["name"] = "unlisted_count" effective["target_references"].append(extra) @@ -704,18 +780,135 @@ def test_factor_roles_and_count_semantics_use_hash_bound_source_documents(mutati receipt["transformations"][row["name"]] ) receipt["transformations"][extra["name"]].pop("factor_id") + if mutation == "outside_roster_with_residual_label": + receipt["transformations"][extra["name"]]["operation"] = ( + "allocated_residual_by_ratio" + ) receipt["transformed_names"] = sorted(receipt["transformations"]) elif mutation == "source_values": - receipt["base_reference_document"]["target_references"][0]["value_operands"] = [ + receipt["factor_companions"][row["name"]]["source"]["value_operands"] = [ {"aggregate_fact_key": "count-fact-0", "weight": 2} ] elif mutation == "roster": - transform = receipt["selected_declarations"]["aging_index"]["declaration"][ - "transformations" - ][0] - transform["count_reference_names"][0] = "unlisted_count" + receipt["factor_companions"]["unlisted_count"] = receipt[ + "factor_companions" + ].pop(row["name"]) + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises( + ValueError, + match=( + "roster|companion.*hash|source.*identity|source semantics" + "|selection identity mismatch" + ), + ): + validate_reference_resolution(effective, receipt) + + +@pytest.mark.parametrize("target", ["money", "count"]) +def test_rehashed_forged_companion_role_requires_the_bound_selection_identity(target): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + row = next( + row for row in effective["target_references"] if row["name"] == f"{target}_0" + ) + companion = receipt["factor_companions"][row["name"]] + forged_role = "count" if target == "money" else "money" + companion["role"] = forged_role + companion["source"]["metadata"]["reference_value_kind"] = forged_role + row["metadata"]["reference_value_kind"] = forged_role + action = receipt["transformations"][row["name"]] + if forged_role == "money": + rational = action["operational_factor"] + operation = "linear_combination" + operands = [ + { + "aggregate_fact_key": row["ledger_selector"]["aggregate_fact_key"], + "expected_member_count": 1, + "weight": rational["numerator"] / rational["denominator"], + } + ] + else: + operation = companion["source"]["value_operation"] + operands = companion["source"]["value_operands"] + row["value_operation"] = operation + row["value_operands"] = copy.deepcopy(operands) + action["operation"] = "linear_combination" if forged_role == "money" else "identity" + action["operand_selectors"] = copy.deepcopy(operands) + # Rehash every mutable attachment while retaining the original selection. + receipt["factor_companions_sha256"] = reference_document_sha256( + receipt["factor_companions"] + ) + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="selection identity mismatch"): + validate_reference_resolution(effective, receipt) + + +def test_factor_companion_hash_must_be_covered_by_the_selection_identity(): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + incomplete_identity = { + key: receipt[key] + for key in ( + "resolver_version", + "base_references_sha256", + "base_intervals_sha256", + "selected_declarations_sha256", + "selection", + "selected_factor_identities", + "transformed_names", + ) + } + selection_hash = reference_document_sha256(incomplete_identity) + receipt["reference_selection_sha256"] = selection_hash + for row in effective["target_references"]: + row["metadata"]["reference_selection_sha256"] = selection_hash + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="selection identity mismatch"): + validate_reference_resolution(effective, receipt) + + +@pytest.mark.parametrize("mutation", ["missing_record", "untransformed_record"]) +def test_factor_companion_record_and_transformed_rows_cover_each_other(mutation): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + companions = receipt["factor_companions"] + if mutation == "missing_record": + companions.pop("count_0") + else: + companions["untransformed_count"] = copy.deepcopy(companions["count_0"]) + receipt["factor_companions_sha256"] = reference_document_sha256(companions) + # Rebind the changed record so this checks roster coverage after identity. + identity = { + key: receipt[key] + for key in ( + "resolver_version", + "base_references_sha256", + "base_intervals_sha256", + "selected_declarations_sha256", + "selection", + "selected_factor_identities", + "factor_companions_sha256", + "transformed_names", + ) + } + selection_hash = reference_document_sha256(identity) + receipt["reference_selection_sha256"] = selection_hash + for row in effective["target_references"]: + row["metadata"]["reference_selection_sha256"] = selection_hash receipt["effective_references_sha256"] = reference_document_sha256(effective) receipt.pop("receipt_sha256") receipt["receipt_sha256"] = reference_document_sha256(receipt) - with pytest.raises(ValueError, match="roster|source.*identity|source semantics"): + with pytest.raises(ValueError, match="roster|missing factor companion"): validate_reference_resolution(effective, receipt) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py b/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py index 0dc1f6e823..e72a10d902 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_transport_target_kernels.py @@ -20,6 +20,7 @@ from __future__ import annotations import json +from copy import deepcopy from dataclasses import replace from pathlib import Path @@ -348,6 +349,82 @@ def test_compile_replay_refuses_rehashed_factor_application_tampering(tmp_path, ) +@pytest.mark.parametrize("target", ["count", "money"]) +def test_compile_refuses_rehashed_companion_role_with_unchanged_selection( + tmp_path, target +): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + name = f"toy-{target}" + companion = receipt["factor_companions"][name] + role = "count" if target == "money" else "money" + companion["role"] = role + companion["source"]["metadata"]["reference_value_kind"] = role + row = next(row for row in document["target_references"] if row["name"] == name) + action = receipt["transformations"][name] + # Make the forged role internally consistent. Its original selection hash + # must still refuse even when the action and effective row agree with it. + operation = "linear_combination" if role == "money" else "identity" + rational = action["operational_factor"] + operands = ( + [ + { + "aggregate_fact_key": row["ledger_selector"]["aggregate_fact_key"], + "expected_member_count": 1, + "weight": rational["numerator"] / rational["denominator"], + } + ] + if role == "money" + else [] + ) + row["metadata"]["reference_value_kind"] = role + row["value_operation"] = operation + row["value_operands"] = operands + action["operation"] = operation + action["operand_selectors"] = operands + receipt["factor_companions_sha256"] = reference_document_sha256( + receipt["factor_companions"] + ) + receipt["effective_references_sha256"] = reference_document_sha256(document) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="Reference selection identity mismatch"): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + + +def test_compile_refuses_outside_roster_row_with_residual_action(tmp_path): + path, pin, document, receipt, _ = factor_transport_fixture(tmp_path, activate=True) + extra = deepcopy(document["target_references"][0]) + previous = extra["name"] + extra["name"] = "unlisted-count" + document["target_references"].append(extra) + action = deepcopy(receipt["transformations"][previous]) + action.pop("factor_id") + action["operation"] = "allocated_residual_by_ratio" + receipt["transformations"][extra["name"]] = action + receipt["transformed_names"] = sorted(receipt["transformations"]) + receipt["effective_references_sha256"] = reference_document_sha256(document) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises( + ValueError, match="selection identity|outside its companion roster" + ): + compile_target_surface( + path, + document, + country=COUNTRY, + references_sha256=reference_document_sha256(document), + feed_pin=pin, + reference_resolution=receipt, + ) + + @pytest.mark.parametrize( "resolved", [False, True], ids=["unresolved", "legacy-resolution"] ) From d28817ff0ce8a4ed5340efd639d5520d06db5f83 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 10:16:41 -0400 Subject: [PATCH 04/10] Keep malformed resolution receipts on the ValueError path Belgium's Sol review of 4f770381 found two latent regressions in validate_reference_resolution: a receipt without transformed_names raised KeyError, and an unnamed unresolved row raised KeyError where base accepted it. transformed_names is now checked as a list of strings, and roster-name bookkeeping runs only with factor evidence. The docstring states the trust boundary: checks assume a trusted selection identity; selected factors are anchored by replay against the authenticated feed. The resolver property test suppresses only too_slow: an integer draw took 31 s under host load in review. Tests: test_legacy_receipt_without_transformed_names_refuses_as_a_value_error and test_unnamed_unresolved_rows_still_validate_without_factor_evidence; each goes red (KeyError) with its fix reverted. test_reference_profiles.py 74 passed, test_transport_target_kernels.py 52, test_nz_target_references.py 50. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/reference_profiles.py | 23 +++++++++++--- .../shared/test_reference_profiles.py | 31 +++++++++++++++++-- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/reference_profiles.py b/packages/microcosm-build/src/microcosm/build/reference_profiles.py index c5a282ba66..e6b6a33920 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_profiles.py +++ b/packages/microcosm-build/src/microcosm/build/reference_profiles.py @@ -605,7 +605,14 @@ def validate_reference_resolution( references_sha256: str | None = None, interval_document: Mapping | None = None, ) -> dict: - """Refuse stale effective documents, receipts or interval companions.""" + """Refuse stale effective documents, receipts or interval companions. + + The checks bind the effective rows to the receipt and the receipt's + factor companions to its selection identity. They assume that identity is + trusted, as when composition resolves a fresh receipt: a forger who also + replaces the selection identity is outside this layer. Selected factors + are anchored independently by replay against the authenticated feed. + """ resolution = _copy(_mapping(receipt, "reference resolution receipt")) if ( resolution.get("resolver_version") @@ -633,12 +640,18 @@ def validate_reference_resolution( ) != resolution.get("effective_intervals_sha256"): raise ValueError("Effective interval document hash mismatch.") factor_bindings = _factor_reference_bindings(resolution) - other_names = set(resolution["transformed_names"]) - set(factor_bindings) + transformed_names = resolution.get("transformed_names") + if not isinstance(transformed_names, list) or not all( + isinstance(name, str) for name in transformed_names + ): + raise ValueError("Resolution receipt transformed names are malformed.") + other_names = set(transformed_names) - set(factor_bindings) names, used_factors, seen_names = [], set(), set() for row in document.get("target_references", ()): - if factors and row["name"] in seen_names: - raise ValueError("Duplicate factor companion reference roster name.") - seen_names.add(row["name"]) + if factors: + if row.get("name") in seen_names: + raise ValueError("Duplicate factor companion reference roster name.") + seen_names.add(row.get("name")) metadata = row.get("metadata", {}) if metadata.get("reference_profiles_resolved"): names.append(row["name"]) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index d2bff8567d..5685bc3427 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -6,7 +6,7 @@ import json import pytest -from hypothesis import given, settings +from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st from microcosm_build.reference_factors import factor_context_fixture @@ -401,7 +401,14 @@ def test_factor_scales_money_once_keeps_counts_and_measurement_prerequisite(): pair_count=st.integers(min_value=1, max_value=16), anchor=st.integers(min_value=1, max_value=500), ) -@settings(max_examples=16, database=None, deadline=None) +# Two integers are cheap to draw; a 31 s draw under host load tripped +# too_slow in review, so only wall-clock health is suppressed. +@settings( + max_examples=16, + database=None, + deadline=None, + suppress_health_check=[HealthCheck.too_slow], +) def test_counts_are_invariant_and_every_money_row_uses_one_common_factor( pair_count, anchor ): @@ -594,6 +601,26 @@ def test_legacy_receipt_remains_version_one_without_factor_fields(): ) +def test_legacy_receipt_without_transformed_names_refuses_as_a_value_error(): + references, declarations = _inputs() + effective, _, receipt = resolve_reference_profiles(references, declarations, {}) + receipt.pop("transformed_names") + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="transformed names"): + validate_reference_resolution(effective, receipt) + + +def test_unnamed_unresolved_rows_still_validate_without_factor_evidence(): + references, declarations = _inputs() + effective, _, receipt = resolve_reference_profiles(references, declarations, {}) + effective["target_references"].append({"entity": "household", "metadata": {}}) + receipt.pop("receipt_sha256") + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt["receipt_sha256"] = reference_document_sha256(receipt) + assert validate_reference_resolution(effective, receipt) == receipt + + def test_nz_default_factor_receipt_is_compact_and_covers_the_exact_roster(): spec = paths_for("microcosm-build").package / "src/microcosm/build/nz" base = json.loads((spec / "target_references.json").read_text()) From 2a641321edb0371f06dc75dbde6d02239431acfc Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 24 Oct 2026 18:06:35 -0400 Subject: [PATCH 05/10] Check factor currency at run entry, not in validation Factor validation compared date.today() with each declaration's validity window. Every NZ factor declares valid_until 2026-11-03, so main's CI would have failed for every PR from 2026-11-04. Validation is now a pure function of declaration and feed: declared_on <= as_of and valid_from <= as_of <= valid_until. require_current_factors(selected, *, today) has no default for today. The transport CLI calls it once, for --resume auto|forbid, with today's UTC date, before preparation can run CREATE. --resume require replays a stored graph and is exempt. No kernel reads the clock. The CLI checks every factor the default and scenario profile views select, through compose.reference_profile_views, the walk activation now shares, so a spec without scenarios checks its default view alone (Belgium's review). An end-to-end test replays a warm store under --resume require after the factor expires: rc 0, no kernel runs, and the stored export's bytes unchanged. From the d28817ff review (findings 1-4): resolution transformations must map names to objects, resolved and factor rows need nonempty names, and a v2 unresolved duplicate companion refuses. Unresolved unnamed v1 rows still validate. The expired-factor mutation in test_reference_factors now expires before its as_of, so the retained as_of check refuses it. Tests (hub, one file per process, normal priority): 15 files, 2,077 passed and 5 skipped (the UK feed cases). Clock runs at 2026-11-05: test_nz_reference_aging 18 and test_reference_profiles 97 passed. Whole CLI test file with the CLI clock at 2100-01-01: 163 passed. Mutants killed, 8 of 8: the clock back in validation, the currency check on replay, no currency check, run entry walking other views than activation, the local date, and review mutants M3, M6 and M7. Receipts, effective intervals and factor contexts are byte-identical to d28817ff (8 payloads, re-checked on this tree). Co-Authored-By: GPT-6.1 Sol Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/reference_factors.py | 24 ++- .../src/microcosm/build/reference_profiles.py | 27 +++- .../src/microcosm/build/transport/cli.py | 36 ++++- .../src/microcosm/build/transport/compose.py | 36 +++-- .../shared/test_nz_reference_aging.py | 34 ++++ .../shared/test_reference_factors.py | 8 +- .../shared/test_reference_profiles.py | 110 ++++++++++++- .../shared/test_transport_composed_graph.py | 147 +++++++++++++++++- 8 files changed, 397 insertions(+), 25 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/reference_factors.py b/packages/microcosm-build/src/microcosm/build/reference_factors.py index 387c64b958..1a02dade36 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_factors.py +++ b/packages/microcosm-build/src/microcosm/build/reference_factors.py @@ -233,8 +233,6 @@ def _declaration(declaration: object) -> dict: raise ValueError( "Factor declaration is expired or not yet valid at its declared as_of." ) - if not dates["valid_from"] <= date.today() <= dates["valid_until"]: - raise ValueError("Factor declaration is expired or not yet valid today.") for key in ("evidence", "decision_references"): if any(not isinstance(item, str) or not item for item in _list(row[key], key)): raise ValueError(f"{key} must contain nonempty text.") @@ -717,6 +715,28 @@ def validate_factor_context( return result +def require_current_factors(selected: Mapping[str, dict], *, today: date) -> None: + """Require current declarations from ``validate_factor_context``'s result. + + The currency check guards new runs only. Validation and replay remain pure + functions of their recorded inputs; run entry supplies the explicit date. + """ + outside_validity = [] + for factor_id, entry in selected.items(): + validity = entry["declaration"]["validity"] + if not ( + date.fromisoformat(validity["valid_from"]) + <= today + <= date.fromisoformat(validity["valid_until"]) + ): + outside_validity.append(factor_id) + if outside_validity: + raise ValueError( + f"Selected factors {sorted(outside_validity)} are expired or not yet " + f"valid on {today.isoformat()}; a reviewed re-declaration is needed." + ) + + def replay_reference_factor( declaration: Mapping, facts: Iterable, diff --git a/packages/microcosm-build/src/microcosm/build/reference_profiles.py b/packages/microcosm-build/src/microcosm/build/reference_profiles.py index e6b6a33920..10015e8afc 100644 --- a/packages/microcosm-build/src/microcosm/build/reference_profiles.py +++ b/packages/microcosm-build/src/microcosm/build/reference_profiles.py @@ -645,24 +645,35 @@ def validate_reference_resolution( isinstance(name, str) for name in transformed_names ): raise ValueError("Resolution receipt transformed names are malformed.") + transformations = _mapping( + resolution.get("transformations"), "resolution transformations" + ) + if any(not isinstance(action, Mapping) for action in transformations.values()): + raise ValueError("Resolution transformations must map names to objects.") other_names = set(transformed_names) - set(factor_bindings) names, used_factors, seen_names = [], set(), set() for row in document.get("target_references", ()): + name = row.get("name") + metadata = row.get("metadata", {}) + resolved = metadata.get("reference_profiles_resolved") + if (factors or resolved) and (not isinstance(name, str) or not name): + raise ValueError( + "Resolved and factor reference names must be nonempty strings." + ) if factors: - if row.get("name") in seen_names: + if name in seen_names: raise ValueError("Duplicate factor companion reference roster name.") - seen_names.add(row.get("name")) - metadata = row.get("metadata", {}) - if metadata.get("reference_profiles_resolved"): - names.append(row["name"]) + seen_names.add(name) + if resolved: + names.append(name) if metadata.get("reference_selection_sha256") != selection_hash or ( metadata.get("effective_intervals_sha256") != resolution.get("effective_intervals_sha256") ): raise ValueError("Effective reference profile identity mismatch.") - action = resolution.get("transformations", {}).get(row["name"], {}) - binding = factor_bindings.get(row["name"]) - if factors and binding is None and row["name"] not in other_names: + action = transformations.get(name, {}) + binding = factor_bindings.get(name) + if factors and binding is None and name not in other_names: raise ValueError( "Factor action names a row outside its companion roster." ) diff --git a/packages/microcosm-build/src/microcosm/build/transport/cli.py b/packages/microcosm-build/src/microcosm/build/transport/cli.py index 3d26dd15ff..38411e7af6 100644 --- a/packages/microcosm-build/src/microcosm/build/transport/cli.py +++ b/packages/microcosm-build/src/microcosm/build/transport/cli.py @@ -14,6 +14,10 @@ explorer page and ``build-status.json``. The status file lists the outputs the spec declares as still owed by a later package. There is no upload, staging or publication path; ``--local-only`` is the only mode. + +The currency check guards new runs only: ``auto`` and ``forbid`` require +selected factors current on today's UTC date before CREATE; ``require`` only +verifies stored work. """ from __future__ import annotations @@ -24,6 +28,7 @@ import sys from collections.abc import Mapping, Sequence from dataclasses import dataclass, replace +from datetime import UTC, date, datetime from pathlib import Path from tempfile import TemporaryDirectory from types import MappingProxyType @@ -32,6 +37,7 @@ import pandas as pd from microcosm.build.artifact_files import file_artifact, materialize_bytes +from microcosm.build.reference_factors import require_current_factors from microcosm.frame import Frame from microcosm.frame.adapters.axiom import AxiomEntityTableDataset from microcosm.frame.materialize import put_frame_table @@ -60,6 +66,7 @@ TransportGraphExtension, compose_transport_graph, load_transport_spec, + reference_profile_views, skeleton_create_declaration, transport_endpoints, transport_pending_outputs, @@ -634,8 +641,34 @@ def parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace: return args +def _today() -> date: + """Today's UTC date, so a local run and CI agree on a validity boundary.""" + return datetime.now(UTC).date() + + +def _require_current_run_factors( + spec: Mapping[str, object], *, resume: ResumePolicy +) -> None: + """The currency check guards new runs only, including scenario selections. + + ``require`` only replays stored work and may verify historical factors. + Check every factor the default and scenario views select, through the + walk activation uses, against today's UTC date, before CREATE. + """ + if resume == "require": + return + selected = {} + for view in reference_profile_views(spec): + selected.update(view[2].get("selected_factors", {})) + require_current_factors(selected, today=_today()) + + def main(argv: Sequence[str] | None = None) -> int: - """Run the CLI; return 0 on success and 1 on a refused build.""" + """Run the CLI; return 0 on success and 1 on a refused build. + + The currency check guards new runs only (``auto`` and ``forbid``), before + preparation can run CREATE. ``require`` verifies existing stored work. + """ try: args = parse_args(argv) @@ -656,6 +689,7 @@ def main(argv: Sequence[str] | None = None) -> int: "--resume require refuses a cold transport graph store." ) spec = load_transport_spec(args.spec_dir if args.spec_dir else args.country) + _require_current_run_factors(spec, resume=args.resume) prepared = prepare_transport_build( spec, sources=sources, inventory_store=store_root, resume=args.resume ) diff --git a/packages/microcosm-build/src/microcosm/build/transport/compose.py b/packages/microcosm-build/src/microcosm/build/transport/compose.py index 82740818d2..b0907925d3 100644 --- a/packages/microcosm-build/src/microcosm/build/transport/compose.py +++ b/packages/microcosm-build/src/microcosm/build/transport/compose.py @@ -413,6 +413,30 @@ def reference_profile_view( return view +def reference_profile_views(spec: Mapping[str, object]) -> tuple: + """Resolve the default profile view and each distinct scenario-knob view. + + Activation and run entry share this walk. Scenario views resolve only when + both ``reference_profiles`` and ``scenarios`` are declared; knob sets that + repeat, or equal the default selection, resolve once. + """ + view = reference_profile_view(spec) + if view is None: + return () + views = [view] + if _has_resource(spec, "scenarios"): + checked_selections = {canonical_json({})} + for scenario in _sequence( + _raw_transport_resource(spec, "scenarios").get("scenarios"), "scenarios" + ): + knobs = _mapping(_mapping(scenario, "scenario").get("knobs", {}), "knobs") + identity = canonical_json(knobs) + if identity not in checked_selections: + views.append(reference_profile_view(spec, knobs)) + checked_selections.add(identity) + return tuple(views) + + def transport_resource( spec: Mapping[str, object], name: str, *, profile_selection: Mapping | None = None ) -> Mapping: @@ -552,17 +576,7 @@ def validate_transport_activation(spec: Mapping[str, object]) -> None: missing = [] # Resolve first so activation never inspects an executable profile's raw rows. - reference_profile_view(spec) - if _has_resource(spec, "reference_profiles") and _has_resource(spec, "scenarios"): - checked_selections = {canonical_json({})} - for scenario in _sequence( - _raw_transport_resource(spec, "scenarios").get("scenarios"), "scenarios" - ): - knobs = _mapping(_mapping(scenario, "scenario").get("knobs", {}), "knobs") - identity = canonical_json(knobs) - if identity not in checked_selections: - reference_profile_view(spec, knobs) - checked_selections.add(identity) + reference_profile_views(spec) selections = ( tuple(_declared_resource_selections(transport_resource(spec, GRAPH_RESOURCE))) if _has_resource(spec, GRAPH_RESOURCE) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py index 136e81bacb..fa9ecb3aca 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_reference_aging.py @@ -5,12 +5,14 @@ import copy import json import os +from datetime import date from decimal import Decimal, localcontext from fractions import Fraction from pathlib import Path import pytest +from microcosm.build import reference_factors from microcosm.build.ledger_artifact import ( LexicalFloat, load_ledger_consumer_artifact, @@ -19,6 +21,7 @@ from microcosm.build.ledger_targets import fact_matches_selector from microcosm.build.reference_factors import ( replay_reference_factor, + require_current_factors, resolve_reference_factor, validate_factor_context, ) @@ -92,6 +95,37 @@ def test_generated_aging_resource_reproduces_pinned_feed_and_all_receipts(artifa assert entry["receipt"]["feed_identity"] == identity +def test_packaged_factor_context_validation_ignores_the_wall_clock(monkeypatch): + class FutureDate(date): + @classmethod + def today(cls): + return cls(2026, 11, 5) + + monkeypatch.setattr(reference_factors, "date", FutureDate) + + assert set(validate_factor_context(_document())) == set(_EXPECTED) + + +@pytest.mark.parametrize( + "today,current", + [ + (date(2026, 10, 22), False), + (date(2026, 10, 23), True), + (date(2026, 11, 3), True), + (date(2026, 11, 4), False), + ], +) +def test_factor_currency_uses_inclusive_declared_boundaries(today, current): + selected = validate_factor_context(_document()) + if current: + require_current_factors(selected, today=today) + else: + with pytest.raises(ValueError, match="reviewed re-declaration") as error: + require_current_factors(selected, today=today) + for factor_id in selected: + assert factor_id in str(error.value) + + @pytest.mark.parametrize("factor_id", list(_EXPECTED)) def test_all_six_factors_and_observed_diagnostic_are_exact(factor_id, operand_facts): entry = _entry(factor_id) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py index 2c9d98ebf4..6e2045bbd8 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py @@ -1,6 +1,7 @@ """Exact factor arithmetic, evidence and replay without country assumptions.""" from copy import deepcopy +from datetime import date from decimal import Decimal from fractions import Fraction @@ -14,6 +15,7 @@ certified_nth_root_bounds, factor_document_sha256, replay_reference_factor, + require_current_factors, resolve_reference_factor, validate_factor_context, ) @@ -108,6 +110,10 @@ def test_factor_resolves_exact_operands_once_and_replays(): assert validate_factor_context(context, ["toy_factor"]) == {"toy_factor": entry} +def test_currency_check_without_selected_factors_is_a_noop(): + require_current_factors({}, today=date(2026, 11, 5)) + + def test_factor_resolution_and_replay_ignore_caller_feed_pin_prose(): declaration, facts, identity = factor_fixture() factor, receipt = resolve_reference_factor(declaration, facts, identity) @@ -401,7 +407,7 @@ def test_numeric_and_schedule_guards(mutation, message): elif mutation == "sensitivity": declaration["growth"]["sensitivity_provenance"] = [] elif mutation == "expired": - declaration["validity"]["valid_until"] = "2005-01-01" + declaration["validity"]["valid_until"] = "2001-12-31" elif mutation == "wrong_expected": declaration["expected_operational_factor"]["numerator"] += 1 elif mutation == "wrong_feed": diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index 5685bc3427..60e2cee84d 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -4,6 +4,7 @@ import copy import json +from datetime import date import pytest from hypothesis import HealthCheck, given, settings @@ -614,13 +615,100 @@ def test_legacy_receipt_without_transformed_names_refuses_as_a_value_error(): def test_unnamed_unresolved_rows_still_validate_without_factor_evidence(): references, declarations = _inputs() effective, _, receipt = resolve_reference_profiles(references, declarations, {}) - effective["target_references"].append({"entity": "household", "metadata": {}}) + effective["target_references"].extend( + [ + {"entity": "household", "metadata": {}}, + {"entity": "household", "metadata": {}}, + ] + ) receipt.pop("receipt_sha256") receipt["effective_references_sha256"] = reference_document_sha256(effective) receipt["receipt_sha256"] = reference_document_sha256(receipt) assert validate_reference_resolution(effective, receipt) == receipt +def test_duplicate_unresolved_factor_companion_refuses(): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + duplicate = copy.deepcopy(effective["target_references"][0]) + assert duplicate["name"] == "count_0" + duplicate["metadata"].pop("reference_profiles_resolved") + effective["target_references"].append(duplicate) + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="Duplicate factor companion"): + validate_reference_resolution(effective, receipt) + + +@pytest.mark.parametrize("with_factors", [False, True], ids=["v1", "v2"]) +@pytest.mark.parametrize( + "mutation", + [ + "transformations_list", + "transformations_null", + "transformation_scalar", + "resolved_name_missing", + "resolved_name_null", + "resolved_name_empty", + "resolved_name_scalar", + "resolved_name_list", + ], +) +def test_malformed_resolution_shapes_refuse_as_value_errors(with_factors, mutation): + if with_factors: + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + else: + references, declarations = _inputs() + effective, _, receipt = resolve_reference_profiles(references, declarations, {}) + row = effective["target_references"][0] + if mutation == "transformations_list": + receipt["transformations"] = [] + elif mutation == "transformations_null": + receipt["transformations"] = None + elif mutation == "transformation_scalar": + receipt["transformations"][row["name"]] = 7 + elif mutation == "resolved_name_missing": + row.pop("name") + else: + row["name"] = { + "resolved_name_null": None, + "resolved_name_empty": "", + "resolved_name_scalar": 7, + "resolved_name_list": [], + }[mutation] + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="transformations|reference names"): + validate_reference_resolution(effective, receipt) + + +@pytest.mark.parametrize( + "name_fields", + [{}, {"name": None}, {"name": ""}, {"name": 7}, {"name": []}], + ids=["missing", "null", "empty", "int", "list"], +) +def test_unnamed_unresolved_factor_rows_refuse_as_value_errors(name_fields): + references, declarations, context = _scaling_inputs() + effective, _, receipt = resolve_reference_profiles( + references, declarations, {}, factor_context=context + ) + effective["target_references"].append( + {"entity": "household", "metadata": {}, **name_fields} + ) + receipt["effective_references_sha256"] = reference_document_sha256(effective) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + with pytest.raises(ValueError, match="reference names"): + validate_reference_resolution(effective, receipt) + + def test_nz_default_factor_receipt_is_compact_and_covers_the_exact_roster(): spec = paths_for("microcosm-build").package / "src/microcosm/build/nz" base = json.loads((spec / "target_references.json").read_text()) @@ -660,6 +748,26 @@ def test_nz_default_factor_receipt_is_compact_and_covers_the_exact_roster(): assert len(canonical_json(receipt)) < 2_600_000 +def test_nz_default_factor_resolution_validates_after_declaration_expiry(monkeypatch): + from microcosm.build import reference_factors + + class LaterDate(date): + @classmethod + def today(cls): + return cls(2026, 11, 5) + + monkeypatch.setattr(reference_factors, "date", LaterDate) + spec = paths_for("microcosm-build").package / "src/microcosm/build/nz" + base = json.loads((spec / "target_references.json").read_text()) + declarations = json.loads((spec / "reference_profiles.json").read_text()) + context = json.loads((spec / "reference_aging.json").read_text()) + effective, _, receipt = resolve_reference_profiles( + base, declarations, {}, factor_context=context + ) + assert receipt["selected_factors"] + assert validate_reference_resolution(effective, receipt) == receipt + + def test_unrelated_direct_fact_references_are_outside_companion_rosters(): references, declarations, context = _scaling_inputs() direct = { diff --git a/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py b/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py index 5d6ee3a416..4187358f15 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py @@ -43,6 +43,7 @@ import shutil import time from dataclasses import replace +from datetime import UTC, date, datetime, timedelta, timezone from pathlib import Path from unittest.mock import Mock @@ -1454,7 +1455,10 @@ def test_packaged_spec_refuses_before_reading_any_source(tmp_path): ) -def test_cli_main_refuses_the_packaged_spec_and_writes_nothing(tmp_path, capsys): +def test_cli_main_refuses_the_packaged_spec_and_writes_nothing( + tmp_path, monkeypatch, capsys +): + monkeypatch.setattr(cli_module, "_today", lambda: date(2026, 10, 24)) out = tmp_path / "out" assert cli_module.main(["--country", "nz", "--out", str(out)]) == 1 message = capsys.readouterr().err @@ -1643,6 +1647,50 @@ def injected_registry(bindings, root, *, unit_rule, engines_by_binding=None): assert not (out / EXPORT_FILENAME).exists() +_AFTER_FACTOR_EXPIRY = date(2100, 1, 1) + + +@pytest.mark.parametrize("resume", ["auto", "forbid"]) +@pytest.mark.parametrize("selection", ["default", "scenario"]) +def test_cli_main_refuses_expired_factors_before_create( + tmp_path, monkeypatch, capsys, resume, selection +): + _, _, _, _, spec = factor_transport_fixture(tmp_path) + if selection == "scenario": + spec["resources"]["reference_profiles"]["dimensions"]["index"]["profiles"][ + "central" + ]["transformations"] = [] + spec["resources"]["scenarios"]["scenarios"].append( + {"id": "variant", "knobs": {"index": "low"}} + ) + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + monkeypatch.setattr(cli_module, "load_transport_spec", lambda source: spec) + prepare = Mock(side_effect=AssertionError("Must refuse before preparation.")) + create = Mock(side_effect=AssertionError("Must refuse before CREATE.")) + monkeypatch.setattr(cli_module, "prepare_transport_build", prepare) + monkeypatch.setattr(cli_module.TRANSPORT_CREATE, "run", create) + out = tmp_path / "out" + assert ( + cli_module.main(["--country", "xx", "--out", str(out), "--resume", resume]) == 1 + ) + error = capsys.readouterr().err + assert "toy_factor" in error + assert "reviewed re-declaration" in error + prepare.assert_not_called() + create.assert_not_called() + assert not out.exists() + + +def test_cli_factor_currency_decision_allows_historical_replay(tmp_path, monkeypatch): + # The factor fixture has parked measurement rows and no runnable skeleton. + # Exercise the CLI decision directly; the warm-store test below verifies + # actual require execution with the engine-free composed skeleton. + _, _, _, _, spec = factor_transport_fixture(tmp_path) + assert compose_module.reference_profile_view(spec)[2]["selected_factors"] + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + cli_module._require_current_run_factors(spec, resume="require") + + def test_cli_main_and_path_loader_success(composed, tmp_path, monkeypatch, capsys): # Real Path loading, registry preparation and execution; only the injected # engine seam replaces Axiom with the fixture's pure-Python adapters. @@ -1691,8 +1739,105 @@ def counted(context, _run=run, _ref=ref): assert (out / EXPORT_FILENAME).is_file() assert json.loads((out / "manifest.json").read_bytes())["nodes"] observe_warm.append(True) + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + assert cli_module.main([*argv, "--resume", "require"]) == 0 + assert capsys.readouterr().err == "" + assert calls == [] + + +def test_cli_run_date_is_the_utc_date(monkeypatch): + # 11:30pm in New York on 3 November is already 4 November in UTC, where CI runs. + instant = datetime(2026, 11, 4, 3, 30, tzinfo=UTC) + + class Clock(datetime): + @classmethod + def now(cls, tz=None): + return instant.astimezone(tz or timezone(timedelta(hours=-5))) + + monkeypatch.setattr(cli_module, "datetime", Clock) + assert cli_module._today() == date(2026, 11, 4) + + +def test_cli_currency_check_walks_the_views_activation_walks(tmp_path, monkeypatch): + # Activation resolves scenario views only when both resources exist and + # validates their shapes; the run-entry check shares that walk. + _, _, _, _, spec = factor_transport_fixture(tmp_path) + del spec["resources"]["scenarios"] + assert len(compose_module.reference_profile_views(spec)) == 1 + monkeypatch.setattr(cli_module, "_today", lambda: date(2050, 1, 1)) + cli_module._require_current_run_factors(spec, resume="auto") + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + with pytest.raises(ValueError, match="toy_factor"): + cli_module._require_current_run_factors(spec, resume="auto") + spec["resources"]["scenarios"] = {"scenarios": {"id": "malformed"}} + with pytest.raises(TypeError) as activation: + compose_module.validate_transport_activation(spec) + with pytest.raises(TypeError) as run_entry: + cli_module._require_current_run_factors(spec, resume="auto") + assert str(run_entry.value) == str(activation.value) == "scenarios must be a list." + + +def test_cli_require_replays_a_warm_store_after_selected_factors_expire( + composed, tmp_path, monkeypatch, capsys +): + # End to end: warm a real store while a selected factor is current, then + # replay it past valid_until. require verifies and runs nothing; a new run + # of the same spec refuses on that factor before preparation. + _, _, _, _, factors = factor_transport_fixture(tmp_path / "factor") + spec = copy.deepcopy(composed.spec) + spec["resources"].update( + factor_target_references=factors["resources"]["target_references"], + factor_context=factors["resources"]["factor_context"], + reference_profiles={ + **factors["resources"]["reference_profiles"], + "reference_resource": "factor_target_references", + }, + ) + assert compose_module.reference_profile_view(spec)[2]["selected_factors"] + directory = _write_local_transport_spec(tmp_path / "spec", spec) + build_registry = cli_module.build_transport_registry + observe_warm = [] + calls = [] + + def injected_registry(bindings, root, *, unit_rule, engines_by_binding=None): + registry = build_registry( + bindings, + root, + unit_rule=unit_rule, + engines_by_binding=composed.engines_by_binding, + ) + if observe_warm: + for ref in registry.kernels.refs(): + kernel = registry.kernels.get(ref) + run = kernel.run + + def counted(context, _run=run, _ref=ref): + calls.append(_ref) + return _run(context) + + monkeypatch.setattr(kernel, "run", counted) + return registry + + monkeypatch.setattr(cli_module, "build_transport_registry", injected_registry) + out = tmp_path / "out" + argv = ["--spec-dir", str(directory), "--out", str(out)] + for name, path in composed.sources.items(): + argv.extend(["--source", f"{name}={path}"]) + monkeypatch.setattr(cli_module, "_today", lambda: date(2050, 1, 1)) + assert cli_module.main(argv) == 0 + assert capsys.readouterr().err == "" + exported = (out / EXPORT_FILENAME).read_bytes() + observe_warm.append(True) + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) assert cli_module.main([*argv, "--resume", "require"]) == 0 assert capsys.readouterr().err == "" + # require reads back the stored run's export and rewrites nothing. + assert (out / EXPORT_FILENAME).read_bytes() == exported + assert calls == [] + assert cli_module.main([*argv, "--resume", "auto"]) == 1 + error = capsys.readouterr().err + assert "toy_factor" in error + assert "reviewed re-declaration" in error assert calls == [] From 495db830eb4f3684b46adc75a07a8a4627722487 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 25 Oct 2026 10:54:02 -0400 Subject: [PATCH 06/10] Check factor currency in preparation and bind the warm-store test to a factor prepare_transport_build now runs the run-entry currency check itself, after it validates the resume policy and before activation. Every library caller that starts a new run (auto or forbid) therefore refuses an expired selected factor, not only the CLI; require still reaches stored work. main drops its own call, and execute_transport_graph stays clock-free: its docstring says a caller that composes a graph itself owns the check. New tests cover library callers under auto and forbid for the default and scenario views, the require exemption, and resume validation before the currency check. The warm-store replay test now compiles a factor-bound target surface. A test-local targets.compile@1 node on nz.open reads the factor references and the pinned factor feed, and is a CLI terminal endpoint, so the warm run executes it. The test spies the factor replay and checks it ran once against the facts of the pinned feed. After the factor expires, require runs no kernel or replay, keeps the export bytes and serves the compiler from the store under the same key; auto refuses on the factor before preparation work. Co-Authored-By: GPT-6.1 Sol Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/transport/cli.py | 18 +- .../shared/test_transport_composed_graph.py | 189 ++++++++++++++++-- 2 files changed, 182 insertions(+), 25 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/transport/cli.py b/packages/microcosm-build/src/microcosm/build/transport/cli.py index 38411e7af6..6f42b3b0f8 100644 --- a/packages/microcosm-build/src/microcosm/build/transport/cli.py +++ b/packages/microcosm-build/src/microcosm/build/transport/cli.py @@ -230,7 +230,12 @@ def prepare_transport_build( inventory_store: ContentStore | str | Path | None = None, resume: ResumePolicy = "auto", ) -> PreparedTransportBuild: - """Check activation, build the registry and CREATE inventory, then compose. + """Check factor currency and activation, then compose the prepared graph. + + A new run (``auto`` or ``forbid``) first requires every factor the default + and scenario views select to be current on today's UTC date; ``require`` + only verifies stored work. This is the run-entry check for every caller, + the CLI included. Composition and execution stay clock-free. Before registry preparation, CREATE or graph source reads, activation checks declaration resource paths, non-null selected roots and encoding @@ -248,9 +253,10 @@ def prepare_transport_build( CREATE sources and reuses the stored inventory without running the probe. """ - validate_transport_activation(spec) if resume not in {"auto", "require", "forbid"}: raise ValueError("resume must be 'auto', 'require' or 'forbid'.") + _require_current_run_factors(spec, resume=resume) + validate_transport_activation(spec) if resume == "require": root = ( inventory_store.root @@ -473,6 +479,9 @@ def execute_transport_graph( later checkpoints reuse this invocation's work. The skeleton H5 is rewritten only when the export descriptor changed; an unchanged H5 must pass readback, and under ``require`` it must already exist. + + Execution is clock-free. It runs a graph that :func:`prepare_transport_build` + checked; a caller that composes a graph itself owns the currency check. """ if resume not in {"auto", "require", "forbid"}: @@ -666,8 +675,8 @@ def _require_current_run_factors( def main(argv: Sequence[str] | None = None) -> int: """Run the CLI; return 0 on success and 1 on a refused build. - The currency check guards new runs only (``auto`` and ``forbid``), before - preparation can run CREATE. ``require`` verifies existing stored work. + Preparation's currency check guards new runs only (``auto`` and + ``forbid``), before CREATE. ``require`` verifies existing stored work. """ try: @@ -689,7 +698,6 @@ def main(argv: Sequence[str] | None = None) -> int: "--resume require refuses a cold transport graph store." ) spec = load_transport_spec(args.spec_dir if args.spec_dir else args.country) - _require_current_run_factors(spec, resume=args.resume) prepared = prepare_transport_build( spec, sources=sources, inventory_store=store_root, resume=args.resume ) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py b/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py index 4187358f15..0e67af8374 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_transport_composed_graph.py @@ -52,8 +52,10 @@ from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st +from microcosm.build.reference_profiles import reference_document_sha256 from microcosm.build.transport import cli as cli_module from microcosm.build.transport import compose as compose_module +from microcosm.build.transport import target_kernels as target_kernels_module from microcosm.build.transport.artifact_types import COMPARISON_TYPE from microcosm.build.transport.cli import ( EXPORT_FILENAME, @@ -1665,10 +1667,7 @@ def test_cli_main_refuses_expired_factors_before_create( ) monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) monkeypatch.setattr(cli_module, "load_transport_spec", lambda source: spec) - prepare = Mock(side_effect=AssertionError("Must refuse before preparation.")) - create = Mock(side_effect=AssertionError("Must refuse before CREATE.")) - monkeypatch.setattr(cli_module, "prepare_transport_build", prepare) - monkeypatch.setattr(cli_module.TRANSPORT_CREATE, "run", create) + later = _mock_steps_after_the_currency_check(monkeypatch) out = tmp_path / "out" assert ( cli_module.main(["--country", "xx", "--out", str(out), "--resume", resume]) == 1 @@ -1676,11 +1675,68 @@ def test_cli_main_refuses_expired_factors_before_create( error = capsys.readouterr().err assert "toy_factor" in error assert "reviewed re-declaration" in error - prepare.assert_not_called() - create.assert_not_called() + for step in later: + step.assert_not_called() assert not out.exists() +def _mock_steps_after_the_currency_check(monkeypatch): + """Activation, the registry, the CREATE inventory and CREATE, each refusing.""" + steps = [] + for owner, name in ( + (cli_module, "validate_transport_activation"), + (cli_module, "build_transport_registry"), + (cli_module, "prepare_create_outputs"), + (cli_module.TRANSPORT_CREATE, "run"), + ): + step = Mock(side_effect=AssertionError(f"Must refuse before {name}.")) + monkeypatch.setattr(owner, name, step) + steps.append(step) + return steps + + +@pytest.mark.parametrize("resume", ["auto", "forbid"]) +@pytest.mark.parametrize("selection", ["default", "scenario"]) +def test_preparation_refuses_expired_factors_for_library_callers( + tmp_path, monkeypatch, resume, selection +): + # prepare_transport_build is exported: a caller that skips main must meet + # the same run-entry check, before activation, the registry or CREATE. + _, _, _, _, spec = factor_transport_fixture(tmp_path) + if selection == "scenario": + spec["resources"]["reference_profiles"]["dimensions"]["index"]["profiles"][ + "central" + ]["transformations"] = [] + spec["resources"]["scenarios"]["scenarios"].append( + {"id": "variant", "knobs": {"index": "low"}} + ) + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + later = _mock_steps_after_the_currency_check(monkeypatch) + with pytest.raises(ValueError, match="toy_factor") as error: + cli_module.prepare_transport_build(spec, sources={}, resume=resume) + assert "reviewed re-declaration" in str(error.value) + for step in later: + step.assert_not_called() + + +def test_preparation_lets_require_reach_stored_work_after_expiry(tmp_path, monkeypatch): + # require skips the currency check and goes on to activation and the store. + _, _, _, _, spec = factor_transport_fixture(tmp_path) + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + reached = Mock(side_effect=LookupError("activation reached")) + monkeypatch.setattr(cli_module, "validate_transport_activation", reached) + with pytest.raises(LookupError, match="activation reached"): + cli_module.prepare_transport_build(spec, sources={}, resume="require") + reached.assert_called_once_with(spec) + + +def test_preparation_checks_resume_before_currency(tmp_path, monkeypatch): + _, _, _, _, spec = factor_transport_fixture(tmp_path) + monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) + with pytest.raises(ValueError, match="resume must be"): + cli_module.prepare_transport_build(spec, sources={}, resume="sometimes") + + def test_cli_factor_currency_decision_allows_historical_replay(tmp_path, monkeypatch): # The factor fixture has parked measurement rows and no runnable skeleton. # Exercise the CLI decision directly; the warm-store test below verifies @@ -1782,22 +1838,87 @@ def test_cli_require_replays_a_warm_store_after_selected_factors_expire( ): # End to end: warm a real store while a selected factor is current, then # replay it past valid_until. require verifies and runs nothing; a new run - # of the same spec refuses on that factor before preparation. - _, _, _, _, factors = factor_transport_fixture(tmp_path / "factor") + # of the same spec refuses on that factor before preparation work. + facts, pin, _, _, factors = factor_transport_fixture(tmp_path / "factor") spec = copy.deepcopy(composed.spec) spec["resources"].update( factor_target_references=factors["resources"]["target_references"], factor_context=factors["resources"]["factor_context"], + factor_feed=pin, reference_profiles={ **factors["resources"]["reference_profiles"], "reference_resource": "factor_target_references", }, ) - assert compose_module.reference_profile_view(spec)[2]["selected_factors"] + profile_view = compose_module.reference_profile_view + + def measured_view(spec, selection=None): + # As in factor_transport_fixture(activate=True), supply a synthetic + # reviewed measurement closure. The real resolver still selects and + # binds the factors; composition must attach its rehashed receipt. + # Copies, so the resolver's own return values are never edited. + references, intervals, receipt = profile_view(spec, selection) + references, receipt = copy.deepcopy(references), copy.deepcopy(receipt) + for row in references["target_references"]: + row["metadata"]["activation_status"] = "active" + receipt["effective_references_sha256"] = reference_document_sha256(references) + receipt.pop("receipt_sha256") + receipt["receipt_sha256"] = reference_document_sha256(receipt) + return references, intervals, receipt + + monkeypatch.setattr(compose_module, "reference_profile_view", measured_view) + declaration = spec["resources"]["transport_graph"] + compiler_id = "nz.factor.targets.compile" + declaration["sources"].append( + { + **next( + source + for source in declaration["sources"] + if source["name"] == "nz_calibration_facts" + ), + "name": "factor_facts", + } + ) + declaration["nodes"].append( + { + "id": compiler_id, + "kernel": "targets.compile@1", + "population": "nz.open", + "sources": ["factor_facts"], + "params": { + "country": factors["country"], + "references": { + "resource": "factor_target_references", + "encoding": "json", + }, + "references_sha256": { + "resource": "factor_target_references", + "encoding": "sha256", + }, + "chronicle_feed_pin": {"resource": "factor_feed", "encoding": "json"}, + }, + } + ) + # This factor-bound compiler is an explicit CLI terminal endpoint, so its + # target surface must actually be compiled and cached during the warm run. + declaration["endpoints"]["terminal"].append(compiler_id) + compiler = compose_transport_graph(spec, composed.config).node(compiler_id) + assert compiler.kernel == "targets.compile@1" + assert "reference_resolution" in compiler.params + resolution = json.loads(compiler.params["reference_resolution"]) + assert resolution["selected_factors"] + assert json.loads(compiler.params["chronicle_feed_pin"]) == pin directory = _write_local_transport_spec(tmp_path / "spec", spec) build_registry = cli_module.build_transport_registry - observe_warm = [] calls = [] + replay = Mock( + wraps=target_kernels_module.reference_factors_module.replay_reference_factor + ) + monkeypatch.setattr( + target_kernels_module.reference_factors_module, + "replay_reference_factor", + replay, + ) def injected_registry(bindings, root, *, unit_rule, engines_by_binding=None): registry = build_registry( @@ -1806,39 +1927,67 @@ def injected_registry(bindings, root, *, unit_rule, engines_by_binding=None): unit_rule=unit_rule, engines_by_binding=composed.engines_by_binding, ) - if observe_warm: - for ref in registry.kernels.refs(): - kernel = registry.kernels.get(ref) - run = kernel.run + for ref in registry.kernels.refs(): + kernel = registry.kernels.get(ref) + run = kernel.run - def counted(context, _run=run, _ref=ref): - calls.append(_ref) - return _run(context) + def counted(context, _run=run): + calls.append(context.node.id) + return _run(context) - monkeypatch.setattr(kernel, "run", counted) + monkeypatch.setattr(kernel, "run", counted) return registry monkeypatch.setattr(cli_module, "build_transport_registry", injected_registry) out = tmp_path / "out" argv = ["--spec-dir", str(directory), "--out", str(out)] - for name, path in composed.sources.items(): + for name, path in {**composed.sources, "factor_facts": facts}.items(): argv.extend(["--source", f"{name}={path}"]) monkeypatch.setattr(cli_module, "_today", lambda: date(2050, 1, 1)) assert cli_module.main(argv) == 0 assert capsys.readouterr().err == "" + assert calls.count(compiler_id) == 1 + replay.assert_called_once() + factor = resolution["selected_factors"]["toy_factor"] + # The replay ran against the authenticated factor feed: the facts an + # independent load of the pinned factor_facts source yields. + fed_facts = ( + target_kernels_module.ledger_artifact_module.load_ledger_consumer_artifact( + facts, feed_pin=pin, lexical_floats=True + ).facts + ) + assert fed_facts + replay.assert_called_once_with( + factor["declaration"], + fed_facts, + factor["declaration"]["feed_identity"], + factor["operational_factor"], + factor["receipt"], + ) + warm_node = json.loads((out / "manifest.json").read_bytes())["nodes"][compiler_id] + assert warm_node["receipt"]["n_targets"] == 2 exported = (out / EXPORT_FILENAME).read_bytes() - observe_warm.append(True) + calls.clear() + replay.reset_mock() monkeypatch.setattr(cli_module, "_today", lambda: _AFTER_FACTOR_EXPIRY) assert cli_module.main([*argv, "--resume", "require"]) == 0 assert capsys.readouterr().err == "" # require reads back the stored run's export and rewrites nothing. assert (out / EXPORT_FILENAME).read_bytes() == exported assert calls == [] + replay.assert_not_called() + stored_node = json.loads((out / "manifest.json").read_bytes())["nodes"][compiler_id] + assert stored_node["hit"] is True + assert stored_node["key"] == warm_node["key"] + assert stored_node["opaque_artifacts"] == warm_node["opaque_artifacts"] + later = _mock_steps_after_the_currency_check(monkeypatch) assert cli_module.main([*argv, "--resume", "auto"]) == 1 error = capsys.readouterr().err assert "toy_factor" in error assert "reviewed re-declaration" in error assert calls == [] + for step in later: + step.assert_not_called() def test_cli_main_invalid_arguments_are_a_refusal(capsys): From 64daa4f78f51587fa89280a194f8149370eeed5f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 08:18:18 -0400 Subject: [PATCH 07/10] Import the reference-factor fixtures through test_support, as CI does Two tests imported microcosm_build.reference_factors as a top-level module. The hub's local runs put test_support on PYTHONPATH, so they passed there, but CI imports it as test_support.microcosm_build and stopped engine-free at collection once this stack first ran against main. Every other test in the repo uses the test_support prefix. Co-Authored-By: Claude Opus 5.5 --- .../tests/engine_free/shared/test_reference_factors.py | 2 +- .../tests/engine_free/shared/test_reference_profiles.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py index 6e2045bbd8..4db4d79ddc 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py @@ -8,7 +8,7 @@ import pytest from hypothesis import example, given, settings from hypothesis import strategies as st -from microcosm_build.reference_factors import factor_context_fixture, factor_fixture +from test_support.microcosm_build.reference_factors import factor_context_fixture, factor_fixture from microcosm.build.ledger_artifact import LexicalFloat from microcosm.build.reference_factors import ( diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index 60e2cee84d..37c1507c7e 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -9,7 +9,7 @@ import pytest from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st -from microcosm_build.reference_factors import factor_context_fixture +from test_support.microcosm_build.reference_factors import factor_context_fixture from microcosm.build.reference_profiles import ( REFERENCE_DOCUMENT_KEYS, From b157bb9f52b9e3f76668d2087dc32374fb357886 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 08:26:49 -0400 Subject: [PATCH 08/10] Sort the test_support imports as ruff does in CI Co-Authored-By: Claude Opus 5.5 --- .../tests/engine_free/shared/test_reference_factors.py | 5 ++++- .../tests/engine_free/shared/test_reference_profiles.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py index 4db4d79ddc..7d97c71a15 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_factors.py @@ -8,7 +8,6 @@ import pytest from hypothesis import example, given, settings from hypothesis import strategies as st -from test_support.microcosm_build.reference_factors import factor_context_fixture, factor_fixture from microcosm.build.ledger_artifact import LexicalFloat from microcosm.build.reference_factors import ( @@ -20,6 +19,10 @@ validate_factor_context, ) from microcosm.graph.canonical import canonical_json +from test_support.microcosm_build.reference_factors import ( + factor_context_fixture, + factor_fixture, +) def _fraction(row): diff --git a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py index 37c1507c7e..ab44f469b9 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_reference_profiles.py @@ -9,7 +9,6 @@ import pytest from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st -from test_support.microcosm_build.reference_factors import factor_context_fixture from microcosm.build.reference_profiles import ( REFERENCE_DOCUMENT_KEYS, @@ -18,6 +17,7 @@ validate_reference_resolution, ) from microcosm.graph.canonical import canonical_json +from test_support.microcosm_build.reference_factors import factor_context_fixture from test_support.paths import paths_for From b36c702f0908740af52e492357712610496caa51 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 09:55:51 -0400 Subject: [PATCH 09/10] Exclude ledger_artifact from the UK compile modules, with its reason 1d5fff46 made `ledger_targets` import `LexicalFloat` from `ledger_artifact`, and `ledger_targets` is a UK target compile module. CI's `test_every_direct_import_of_a_listed_module_is_listed_or_excluded` then failed: every direct import of a listed module must be listed or excluded. The import feeds one type check: `_strict_scalar_equal` reads an opt-in lexical float as `float`. Only the transport factor compiler opts in, which `test_lexical_float_opt_in_is_limited_to_factor_consumers` pins; the UK kernels load plain floats, so no UK value is ever a `LexicalFloat`, and the loaded facts are node inputs hashed by content. That matches the existing exclusions for imports that never move a value, and it keeps the UK kernels' hashed module set as it was. Co-Authored-By: Claude Opus 5.5 --- .../microcosm/build/uk_runtime/target_compile_modules.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py index 58ba918311..4ea77cd56c 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py @@ -69,6 +69,13 @@ "the feed-pin epoch arithmetic chronicle_feed checks; the pinned " "facts themselves are node inputs hashed by content" ), + "microcosm.build.ledger_artifact": ( + "ledger_targets imports LexicalFloat only so its strict scalar match " + "reads an opt-in lexical float as float; only the transport factor " + "compiler opts in (test_lexical_float_opt_in_is_limited_to_factor_" + "consumers), the UK kernels load plain floats, and the loaded facts " + "are node inputs hashed by content" + ), "microcosm.build.gates": ( "imported for the GateResult and TargetCoverageRequirement types only" ), From 7cd1d267e0aa769314f821d8140aeb1d21ff0160 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 10:55:30 -0400 Subject: [PATCH 10/10] List ledger_artifact among the UK target compile modules Both UK target kernels decode their ledger facts inside run, through full_targets -> load_ledger_consumer_artifact -> _load_fact_rows. The decoded floats feed listed compilers, but source keys hash the raw file bytes and source_hash covers only the modules the kernels pass it, so an edit to the decoder left both UK implementation hashes unchanged (the delta review moved a national target by changing only the default decimal parser). List the module instead of excluding it; its one microcosm.build import, chronicle_epoch, stays excluded, and its reason now names ledger_artifact's schema gate and epoch labels too. This adds no cache invalidation of its own: this branch already edits ledger_targets.py and ledger_artifact.py, so it re-keys every UK target node either way. Co-Authored-By: Claude Opus 5.5 --- .../build/uk_runtime/target_compile_modules.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py index 4ea77cd56c..642a1e912a 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/target_compile_modules.py @@ -23,6 +23,7 @@ UK_TARGET_COMPILE_MODULE_NAMES: tuple[str, ...] = ( "microcosm.build.cross_grain", + "microcosm.build.ledger_artifact", "microcosm.build.ledger_targets", "microcosm.build.target_materialization", "microcosm.build.target_reference_authoring", @@ -66,15 +67,10 @@ "refuses an undeclared condition and never moves a value" ), "microcosm.build.chronicle_epoch": ( - "the feed-pin epoch arithmetic chronicle_feed checks; the pinned " - "facts themselves are node inputs hashed by content" - ), - "microcosm.build.ledger_artifact": ( - "ledger_targets imports LexicalFloat only so its strict scalar match " - "reads an opt-in lexical float as float; only the transport factor " - "compiler opts in (test_lexical_float_opt_in_is_limited_to_factor_" - "consumers), the UK kernels load plain floats, and the loaded facts " - "are node inputs hashed by content" + "the feed-pin epoch arithmetic chronicle_feed checks, and the " + "consumer schema gate and epoch labels ledger_artifact applies; " + "none moves a fact value, and the pinned facts themselves are node " + "inputs hashed by content" ), "microcosm.build.gates": ( "imported for the GateResult and TargetCoverageRequirement types only"