diff --git a/changelog.d/nz-money-normalization.added.md b/changelog.d/nz-money-normalization.added.md index 1e8381d4a2..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`; -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 -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. 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..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) 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). 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 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. 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 is aged by AWE growth; provisional pending Max's ruling on non-wage ageing (H3)." + "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 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. 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 e1fe039bed..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,10 +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 + disclosure = entry["disclosure"] assert ( - "provisional pending Max's ruling on non-wage ageing (H3)" - in entry["disclosure"] + "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 d7d27b54f8..a508cb9bda 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": "e7c44d3f5be90cb135a8bd284800d7c4eefcb7f8d46948ef53ee7764c41698a4", + "fingerprint": "33aeaff6d0bfee7db965eb3fb03c734aa80a1d33024e51611c6668a92ecefdeb", "gate_ids": [ "calibration_per_family_fit", "demography_per_family_fit", @@ -53,7 +53,7 @@ "gates.json": "fa08b508ce1c93ef7627ca06f3a9e808f8fa6ea6f23ce24fa54c58241bbb9f7f", "geography_spine.json": "5f2b1bdd9f8768249912ffd0fbcb2f7d4ed493b51c74306f793ec12441fd383f", "holdout_references.json": "52b5a2360502156da1392a68350e4e7f61b5fd420fa74428819b65886a9f8655", - "money_normalization.json": "799540e5ea5004a39210c60df199b8d15e6b185b3aa68f0daabf44435779aeb6", + "money_normalization.json": "5e817f0b859eacc44a4f96a57923b8af8498b0bbe169565650312b9547c8157c", "precal_references.json": "420361e424405df2312bd21808d6b6f4c3428b6fe90c44c37ab156ce197aa25d", "reference_aging.json": "e7619ec7a02ae5f460a46d160e89c9c9836c8b1d03140aed2348761e590504f0", "reference_intervals.json": "fcc88c0efd5f416aa15a7d5afbeee1d103dd78a136e13b1efc3973d203188412",