From e9c18d4263873f9216eb863d1e40e680f863f27f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 13:50:10 -0400 Subject: [PATCH 1/3] Cite d1981 in the NZ non-wage money ageing disclosures Max ruled d1981 on 2026-10-26 (option A). The listed non-wage donor money columns age from calendar 2024 to tax year 2026-27 by d1599's AWE convention, factor 1.079073 (1.077090 low, 1.081052 high), disclosed as interim. A hold-fixed run (factor 1) sits beside it as a pre-declared sensitivity. The four index-family disclosures in nz/money_normalization.json said "provisional pending Max's ruling on non-wage ageing (H3)". They now cite the ruling and the sensitivity it pre-declares. They also say that no profile here carries the hold-fixed run yet: the schema allows an identity per family, not per profile, and the money kernel reads an identity's reason from the family entry. Wiring it falls to G8-w3, which first runs NZ transport. The wording also moves to active voice ("ages by"). The donor factors already match the ruling: reference_aging.json's donor_cy2024_to_ty2027_{low,central,high} carry operational factors 1077090, 1079073 and 1081052 over 10**6. No factor, column or rate changes. test_nz_money_normalization.py now pins the ruling's phrase and the sensitivity, and refuses "provisional". The NZ golden moves only money_normalization.json's hash and the spec fingerprint. Co-Authored-By: Claude Opus 5.5 --- .../src/microcosm/build/nz/money_normalization.json | 8 ++++---- .../engine_free/shared/test_nz_money_normalization.py | 9 +++++---- .../microcosm-build/tests/golden/nz_country_spec.json | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json b/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json index e6c6c2be96..052ad84597 100644 --- a/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json +++ b/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json @@ -68,7 +68,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Self-employment income (both columns, signed) is aged by ordinary-time average weekly earnings (AWE) growth, the AWE convention: Stats NZ QES observations through June 2026, then Treasury PREFU 2026 forecast AWE growth of 2.7% (0.5 points lower and higher in the low and high profiles); provisional pending Max's ruling on non-wage ageing (H3). No separate mixed-income index is used." + "disclosure": "Self-employment income (both columns, signed) ages by ordinary-time average weekly earnings (AWE) growth, the AWE convention: Stats NZ QES observations through June 2026, then Treasury PREFU 2026 forecast AWE growth of 2.7% (0.5 points lower and higher in the low and high profiles); interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3). No separate mixed-income index applies." }, "capital_income": { "factors": { @@ -76,7 +76,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Interest, dividends, rental income and realized capital gains are aged by AWE growth; provisional pending Max's ruling on non-wage ageing (H3). No asset-return or price index is used." + "disclosure": "Interest, dividends, rental income and realized capital gains age by AWE growth; interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3). No asset-return or price index applies." }, "pensions": { "factors": { @@ -84,7 +84,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Private pension income is aged by AWE growth; provisional pending Max's ruling on non-wage ageing (H3)." + "disclosure": "Private pension income ages by AWE growth; interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3)." }, "owner_housing_costs": { "factors": { @@ -92,7 +92,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Mortgage interest, mortgage principal and property tax are aged by AWE growth as an interim index; provisional pending Max's ruling on non-wage ageing (H3)." + "disclosure": "Mortgage interest, mortgage principal and property tax age by AWE growth; interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3)." } }, "cents_suffix": "_cents", diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py index e1fe039bed..c87d300f68 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py @@ -125,10 +125,11 @@ def test_every_family_uses_the_donor_factor_for_its_profile_with_a_disclosure(): for profile in ("low", "central", "high") }, family assert "AWE" in entry["disclosure"], family - assert ( - "provisional pending Max's ruling on non-wage ageing (H3)" - in entry["disclosure"] - ), family + assert "interim under Max's ruling d1981 (2026-10-26)" in entry[ + "disclosure" + ], family + assert "hold-fixed sensitivity (factor 1)" in entry["disclosure"], family + assert "provisional" not in entry["disclosure"], family def test_donor_money_basis_cites_model_lineage_as_a_declared_convention(): diff --git a/packages/microcosm-build/tests/golden/nz_country_spec.json b/packages/microcosm-build/tests/golden/nz_country_spec.json index 66feb8a5f4..857932d454 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": "3988856778646df45db3b99a1518b53178439f1625dbe8eacd4676c03d2209f5", + "fingerprint": "9cb32c97fd54fbfc234d9b7522a1cdd2396f461f1591b539aa3bc8b599efbe7f", "gate_ids": [ "calibration_per_family_fit", "demography_per_family_fit", @@ -52,7 +52,7 @@ "gates.json": "fa08b508ce1c93ef7627ca06f3a9e808f8fa6ea6f23ce24fa54c58241bbb9f7f", "geography_spine.json": "5f2b1bdd9f8768249912ffd0fbcb2f7d4ed493b51c74306f793ec12441fd383f", "holdout_references.json": "52b5a2360502156da1392a68350e4e7f61b5fd420fa74428819b65886a9f8655", - "money_normalization.json": "799540e5ea5004a39210c60df199b8d15e6b185b3aa68f0daabf44435779aeb6", + "money_normalization.json": "ce8905e0119eae1c96177dbd6508943b4dd304c398ebbf8cf70d9826155e633d", "precal_references.json": "420361e424405df2312bd21808d6b6f4c3428b6fe90c44c37ab156ce197aa25d", "reference_aging.json": "e7619ec7a02ae5f460a46d160e89c9c9836c8b1d03140aed2348761e590504f0", "reference_intervals.json": "fcc88c0efd5f416aa15a7d5afbeee1d103dd78a136e13b1efc3973d203188412", From cb0619cfd70fba0eb9ae086454d7b59f2058f357 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 14:12:37 -0400 Subject: [PATCH 2/3] Pin the d1981 disclosures' sensitivity clause and fix the changelog Act on the independent review of e9c18d42 (APPROVE_WITH_NITS): - Each disclosure now ends on a full sentence: "Max's ruling d1981 (2026-10-26) adopts this as an interim convention and pre-declares a hold-fixed sensitivity (factor 1), which no profile here carries yet (G8-w3)." - The test pins that whole clause too. Dropping "which no profile here carries yet (G8-w3)" from one family now fails it. - ruff format keeps the test file clean. - The unreleased changelog fragment nz-money-normalization.added.md still called non-wage ageing provisional. It now says ruling d1981 adopts AWE growth as the interim index and pre-declares the hold-fixed sensitivity. The NZ golden again moves only money_normalization.json's hash and the fingerprint. Co-Authored-By: Claude Opus 5.5 --- changelog.d/nz-money-normalization.added.md | 6 +++--- .../microcosm/build/nz/money_normalization.json | 8 ++++---- .../shared/test_nz_money_normalization.py | 15 ++++++++++----- .../tests/golden/nz_country_spec.json | 4 ++-- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/changelog.d/nz-money-normalization.added.md b/changelog.d/nz-money-normalization.added.md index 1e8381d4a2..18cbf0827a 100644 --- a/changelog.d/nz-money-normalization.added.md +++ b/changelog.d/nz-money-normalization.added.md @@ -15,8 +15,8 @@ change money ownership. Specs without the resource are unchanged. Factors gain the additive `money_normalization_input` purpose. Declare New Zealand's generated calendar-2024 donor factors with the existing factors' validity and explicit per-profile selection. The donor period is a declared convention -covering flows and asset stocks, checked for consistency against `_time_period`; -ageing non-wage money by AWE growth is provisional until non-wage ageing is -ruled on. The normalization resource is the single source of the USD to NZD +covering flows and asset stocks, checked for consistency against `_time_period`. +Ruling d1981 adopts AWE growth as the interim ageing index for non-wage money +and pre-declares a hold-fixed sensitivity beside it. The normalization resource is the single source of the USD to NZD rate. Both monetary rounding stages and receipt sums use exact fractions, reject non-finite inputs, and check every integer companion for overflow. diff --git a/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json b/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json index 052ad84597..a7bcbdbf5b 100644 --- a/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json +++ b/packages/microcosm-build/src/microcosm/build/nz/money_normalization.json @@ -68,7 +68,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Self-employment income (both columns, signed) ages by ordinary-time average weekly earnings (AWE) growth, the AWE convention: Stats NZ QES observations through June 2026, then Treasury PREFU 2026 forecast AWE growth of 2.7% (0.5 points lower and higher in the low and high profiles); interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3). No separate mixed-income index applies." + "disclosure": "Self-employment income (both columns, signed) ages by ordinary-time average weekly earnings (AWE) growth, the AWE convention: Stats NZ QES observations through June 2026, then Treasury PREFU 2026 forecast AWE growth of 2.7% (0.5 points lower and higher in the low and high profiles). Max's ruling d1981 (2026-10-26) adopts this as an interim convention and pre-declares a hold-fixed sensitivity (factor 1), which no profile here carries yet (G8-w3). No separate mixed-income index applies." }, "capital_income": { "factors": { @@ -76,7 +76,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Interest, dividends, rental income and realized capital gains age by AWE growth; interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3). No asset-return or price index applies." + "disclosure": "Interest, dividends, rental income and realized capital gains age by AWE growth. Max's ruling d1981 (2026-10-26) adopts this as an interim convention and pre-declares a hold-fixed sensitivity (factor 1), which no profile here carries yet (G8-w3). No asset-return or price index applies." }, "pensions": { "factors": { @@ -84,7 +84,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Private pension income ages by AWE growth; interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3)." + "disclosure": "Private pension income ages by AWE growth. Max's ruling d1981 (2026-10-26) adopts this as an interim convention and pre-declares a hold-fixed sensitivity (factor 1), which no profile here carries yet (G8-w3)." }, "owner_housing_costs": { "factors": { @@ -92,7 +92,7 @@ "central": "donor_cy2024_to_ty2027_central", "high": "donor_cy2024_to_ty2027_high" }, - "disclosure": "Mortgage interest, mortgage principal and property tax age by AWE growth; interim under Max's ruling d1981 (2026-10-26), which also pre-declares a hold-fixed sensitivity (factor 1); no profile here carries it yet (G8-w3)." + "disclosure": "Mortgage interest, mortgage principal and property tax age by AWE growth. Max's ruling d1981 (2026-10-26) adopts this as an interim convention and pre-declares a hold-fixed sensitivity (factor 1), which no profile here carries yet (G8-w3)." } }, "cents_suffix": "_cents", diff --git a/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py b/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py index c87d300f68..b0843c33e7 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_nz_money_normalization.py @@ -125,11 +125,16 @@ def test_every_family_uses_the_donor_factor_for_its_profile_with_a_disclosure(): for profile in ("low", "central", "high") }, family assert "AWE" in entry["disclosure"], family - assert "interim under Max's ruling d1981 (2026-10-26)" in entry[ - "disclosure" - ], family - assert "hold-fixed sensitivity (factor 1)" in entry["disclosure"], family - assert "provisional" not in entry["disclosure"], family + disclosure = entry["disclosure"] + assert ( + "Max's ruling d1981 (2026-10-26) adopts this as an interim convention" + in disclosure + ), family + assert ( + "pre-declares a hold-fixed sensitivity (factor 1), which no profile " + "here carries yet (G8-w3)" in disclosure + ), family + assert "provisional" not in disclosure, family def test_donor_money_basis_cites_model_lineage_as_a_declared_convention(): diff --git a/packages/microcosm-build/tests/golden/nz_country_spec.json b/packages/microcosm-build/tests/golden/nz_country_spec.json index 857932d454..e406a11f8a 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": "9cb32c97fd54fbfc234d9b7522a1cdd2396f461f1591b539aa3bc8b599efbe7f", + "fingerprint": "7ef8724b15a81b68509aa32674d34597d6887de53b3a3ac02727809dd5bd6e00", "gate_ids": [ "calibration_per_family_fit", "demography_per_family_fit", @@ -52,7 +52,7 @@ "gates.json": "fa08b508ce1c93ef7627ca06f3a9e808f8fa6ea6f23ce24fa54c58241bbb9f7f", "geography_spine.json": "5f2b1bdd9f8768249912ffd0fbcb2f7d4ed493b51c74306f793ec12441fd383f", "holdout_references.json": "52b5a2360502156da1392a68350e4e7f61b5fd420fa74428819b65886a9f8655", - "money_normalization.json": "ce8905e0119eae1c96177dbd6508943b4dd304c398ebbf8cf70d9826155e633d", + "money_normalization.json": "5e817f0b859eacc44a4f96a57923b8af8498b0bbe169565650312b9547c8157c", "precal_references.json": "420361e424405df2312bd21808d6b6f4c3428b6fe90c44c37ab156ce197aa25d", "reference_aging.json": "e7619ec7a02ae5f460a46d160e89c9c9836c8b1d03140aed2348761e590504f0", "reference_intervals.json": "fcc88c0efd5f416aa15a7d5afbeee1d103dd78a136e13b1efc3973d203188412", From c0317756bfd30c53730dc1674ac446697139f957 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 29 Oct 2026 14:22:15 -0400 Subject: [PATCH 3/3] Re-wrap the money-normalization changelog fragment Act on the delta review of cb0619cf: the fragment now says, as the disclosures do, that no profile carries the hold-fixed sensitivity yet, and the paragraph wraps at 80 columns again. Apart from that clause, the words don't change. Co-Authored-By: Claude Opus 5.5 --- changelog.d/nz-money-normalization.added.md | 35 +++++++++++---------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/changelog.d/nz-money-normalization.added.md b/changelog.d/nz-money-normalization.added.md index 18cbf0827a..005e043cae 100644 --- a/changelog.d/nz-money-normalization.added.md +++ b/changelog.d/nz-money-normalization.added.md @@ -3,20 +3,21 @@ complete money-normalization declaration (cited decimal-text or feed-replayed rate, explicit quote, half-even rounding, donor money period, the one target period every factor must age money to, per-family factors or explicit identities, and quantile-mapped or pending rosters; a concept dropped in -transport can't be normalized) and applies it -with exact rationals, and a `money.normalize@1` transport kernel that replays -its factors against the authenticated feed, refuses a donor money period that -differs from the one CREATE records, and adds an integer cents companion per -column. CREATE now records the donor's `_time_period`. An opt-in preflight names -every consumed money column without exactly one producer and refuses a second -normalization along structural population inheritance, including a currency -conversion followed by normalization; cross-population evidence edges do not -change money ownership. Specs without the resource are unchanged. Factors gain -the additive `money_normalization_input` purpose. Declare New Zealand's -generated calendar-2024 donor factors with the existing factors' validity and -explicit per-profile selection. The donor period is a declared convention -covering flows and asset stocks, checked for consistency against `_time_period`. -Ruling d1981 adopts AWE growth as the interim ageing index for non-wage money -and pre-declares a hold-fixed sensitivity beside it. The normalization resource is the single source of the USD to NZD -rate. Both monetary rounding stages and receipt sums use exact fractions, reject -non-finite inputs, and check every integer companion for overflow. +transport can't be normalized) and applies it with exact rationals, and a +`money.normalize@1` transport kernel that replays its factors against the +authenticated feed, refuses a donor money period that differs from the one +CREATE records, and adds an integer cents companion per column. CREATE now +records the donor's `_time_period`. An opt-in preflight names every consumed +money column without exactly one producer and refuses a second normalization +along structural population inheritance, including a currency conversion +followed by normalization; cross-population evidence edges do not change money +ownership. Specs without the resource are unchanged. Factors gain the additive +`money_normalization_input` purpose. Declare New Zealand's generated +calendar-2024 donor factors with the existing factors' validity and explicit +per-profile selection. The donor period is a declared convention covering flows +and asset stocks, checked for consistency against `_time_period`. Ruling d1981 +adopts AWE growth as the interim ageing index for non-wage money and +pre-declares a hold-fixed sensitivity beside it, which no profile carries yet. +The normalization resource is the single source of the USD to NZD rate. Both +monetary rounding stages and receipt sums use exact fractions, reject non-finite +inputs, and check every integer companion for overflow.