Skip to content

Sibling-of-values uprating: blocks are silently ignored — 103 nodes across ~25 parameter files frozen at last explicit value #8905

Description

@MaxGhenis

Summary

uprating: blocks written as a sibling of values: (rather than nested under metadata:) are silently ignored by the parameter loader, freezing those parameters at their last explicit value. The working form is the one gov/irs/credits/eitc/max.yaml uses (values: + metadata: uprating: inside the bracket node); the broken form places uprating: directly beside values:.

A YAML-tree audit of all 5,444 parameter files finds 103 nodes across ~25 files with the broken placement.

Confirmed frozen (runtime probes on current main)

The gov.irs.uprating index itself resolves correctly at runtime (158.87 in 2023 → 167.95 in 2024 → 172.80 in 2025), so these are placement failures, not index failures:

Parameter Probe Expected behavior
gov/irs/credits/retirement_saving/rate/joint.yaml thresholds [43,500/47,500/73,000] for 2023–2026 IRS Notices publish 46,000/50,000/76,500 (2024) etc. — fixed with explicit values in #8903
gov/states/ne/tax/income/rates/*.yaml single thresholds [4,030/24,120/38,870] identical 2025→2027 Neb. Rev. Stat. § 77-2715.03 indexes brackets annually
gov/states/me/tax/income/main/*.yaml single thresholds [26,800/63,450] identical 2025→2027 36 M.R.S. § 5403 indexes annually
gov/states/ri/tax/income/deductions/standard/amount.yaml JOINT 21,800 in both 2025 and 2026 R.I. Gen. Laws § 44-30-2.6 indexes annually
gov/states/ny/tax/income/deductions/itemized/phase_out/start.yaml SINGLE 313,200 flat 2025→2026 verify whether NY indexes these before fixing

gov/states/oh/tax/income/rates.yaml also carries the dead config but is hand-maintained with explicit entries (2026 flat-tax phase-in present), so it is latent rather than currently wrong.

Full audit list (file @ node):

Details - `gov/contrib/states/ny/wftc/reduction/married.yaml` @ `/brackets[1]/threshold` - `gov/contrib/states/ny/wftc/reduction/single.yaml` @ `/brackets[1]/threshold` - `gov/contrib/states/ri/high_earner_tax/brackets.yaml` @ `/brackets[1]/threshold` - `gov/contrib/states/ri/social_security_exemption/income_limit.yaml` @ `/SINGLE` - `gov/contrib/states/ri/social_security_exemption/income_limit.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/contrib/states/ri/social_security_exemption/income_limit.yaml` @ `/SEPARATE` - `gov/contrib/states/ri/social_security_exemption/income_limit.yaml` @ `/JOINT` - `gov/contrib/states/ri/social_security_exemption/income_limit.yaml` @ `/SURVIVING_SPOUSE` - `gov/irs/credits/retirement_saving/rate/joint.yaml` @ `/brackets[1]/threshold` - `gov/irs/credits/retirement_saving/rate/joint.yaml` @ `/brackets[2]/threshold` - `gov/irs/credits/retirement_saving/rate/joint.yaml` @ `/brackets[3]/threshold` - `gov/states/me/tax/income/agi/subtractions/pension_exclusion/phaseout/start.yaml` @ `/SINGLE` - `gov/states/me/tax/income/agi/subtractions/pension_exclusion/phaseout/start.yaml` @ `/SEPARATE` - `gov/states/me/tax/income/agi/subtractions/pension_exclusion/phaseout/start.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/me/tax/income/agi/subtractions/pension_exclusion/phaseout/start.yaml` @ `/JOINT` - `gov/states/me/tax/income/agi/subtractions/pension_exclusion/phaseout/start.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/me/tax/income/credits/fairness/sales_tax/amount/base.yaml` @ `/SINGLE` - `gov/states/me/tax/income/credits/fairness/sales_tax/amount/base.yaml` @ `/JOINT` - `gov/states/me/tax/income/credits/fairness/sales_tax/amount/base.yaml` @ `/SEPARATE` - `gov/states/me/tax/income/credits/fairness/sales_tax/amount/base.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/me/tax/income/credits/fairness/sales_tax/amount/base.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/me/tax/income/credits/fairness/sales_tax/reduction/start.yaml` @ `/SINGLE` - `gov/states/me/tax/income/credits/fairness/sales_tax/reduction/start.yaml` @ `/SEPARATE` - `gov/states/me/tax/income/credits/fairness/sales_tax/reduction/start.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/me/tax/income/credits/fairness/sales_tax/reduction/start.yaml` @ `/JOINT` - `gov/states/me/tax/income/credits/fairness/sales_tax/reduction/start.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/me/tax/income/deductions/personal_exemption/phaseout/start.yaml` @ `/SINGLE` - `gov/states/me/tax/income/deductions/personal_exemption/phaseout/start.yaml` @ `/SEPARATE` - `gov/states/me/tax/income/deductions/personal_exemption/phaseout/start.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/me/tax/income/deductions/personal_exemption/phaseout/start.yaml` @ `/JOINT` - `gov/states/me/tax/income/deductions/personal_exemption/phaseout/start.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/me/tax/income/deductions/phase_out/start.yaml` @ `/SINGLE` - `gov/states/me/tax/income/deductions/phase_out/start.yaml` @ `/SEPARATE` - `gov/states/me/tax/income/deductions/phase_out/start.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/me/tax/income/deductions/phase_out/start.yaml` @ `/JOINT` - `gov/states/me/tax/income/deductions/phase_out/start.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/me/tax/income/main/head_of_household.yaml` @ `/brackets[1]/threshold` - `gov/states/me/tax/income/main/head_of_household.yaml` @ `/brackets[2]/threshold` - `gov/states/me/tax/income/main/joint.yaml` @ `/brackets[1]/threshold` - `gov/states/me/tax/income/main/joint.yaml` @ `/brackets[2]/threshold` - `gov/states/me/tax/income/main/separate.yaml` @ `/brackets[1]/threshold` - `gov/states/me/tax/income/main/separate.yaml` @ `/brackets[2]/threshold` - `gov/states/me/tax/income/main/single.yaml` @ `/brackets[1]/threshold` - `gov/states/me/tax/income/main/single.yaml` @ `/brackets[2]/threshold` - `gov/states/me/tax/income/main/surviving_spouse.yaml` @ `/brackets[1]/threshold` - `gov/states/me/tax/income/main/surviving_spouse.yaml` @ `/brackets[2]/threshold` - `gov/states/nd/tax/income/rates/head_of_household.yaml` @ `/brackets[1]/threshold` - `gov/states/nd/tax/income/rates/head_of_household.yaml` @ `/brackets[2]/threshold` - `gov/states/nd/tax/income/rates/joint.yaml` @ `/brackets[1]/threshold` - `gov/states/nd/tax/income/rates/joint.yaml` @ `/brackets[2]/threshold` - `gov/states/nd/tax/income/rates/separate.yaml` @ `/brackets[1]/threshold` - `gov/states/nd/tax/income/rates/separate.yaml` @ `/brackets[2]/threshold` - `gov/states/nd/tax/income/rates/single.yaml` @ `/brackets[1]/threshold` - `gov/states/nd/tax/income/rates/single.yaml` @ `/brackets[2]/threshold` - `gov/states/nd/tax/income/rates/surviving_spouse.yaml` @ `/brackets[1]/threshold` - `gov/states/nd/tax/income/rates/surviving_spouse.yaml` @ `/brackets[2]/threshold` - `gov/states/ne/tax/income/rates/head_of_household.yaml` @ `/brackets[1]/threshold` - `gov/states/ne/tax/income/rates/head_of_household.yaml` @ `/brackets[2]/threshold` - `gov/states/ne/tax/income/rates/head_of_household.yaml` @ `/brackets[3]/threshold` - `gov/states/ne/tax/income/rates/joint.yaml` @ `/brackets[1]/threshold` - `gov/states/ne/tax/income/rates/joint.yaml` @ `/brackets[2]/threshold` - `gov/states/ne/tax/income/rates/joint.yaml` @ `/brackets[3]/threshold` - `gov/states/ne/tax/income/rates/separate.yaml` @ `/brackets[1]/threshold` - `gov/states/ne/tax/income/rates/separate.yaml` @ `/brackets[2]/threshold` - `gov/states/ne/tax/income/rates/separate.yaml` @ `/brackets[3]/threshold` - `gov/states/ne/tax/income/rates/single.yaml` @ `/brackets[1]/threshold` - `gov/states/ne/tax/income/rates/single.yaml` @ `/brackets[2]/threshold` - `gov/states/ne/tax/income/rates/single.yaml` @ `/brackets[3]/threshold` - `gov/states/ne/tax/income/rates/surviving_spouse.yaml` @ `/brackets[1]/threshold` - `gov/states/ne/tax/income/rates/surviving_spouse.yaml` @ `/brackets[2]/threshold` - `gov/states/ne/tax/income/rates/surviving_spouse.yaml` @ `/brackets[3]/threshold` - `gov/states/ny/tax/income/deductions/itemized/phase_out/start.yaml` @ `/SINGLE` - `gov/states/ny/tax/income/deductions/itemized/phase_out/start.yaml` @ `/JOINT` - `gov/states/ny/tax/income/deductions/itemized/phase_out/start.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/ny/tax/income/deductions/itemized/phase_out/start.yaml` @ `/SEPARATE` - `gov/states/ny/tax/income/deductions/itemized/phase_out/start.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/oh/tax/income/rates.yaml` @ `/brackets[1]/threshold` - `gov/states/oh/tax/income/rates.yaml` @ `/brackets[2]/threshold` - `gov/states/ri/tax/income/agi/subtractions/social_security/limit/income.yaml` @ `/JOINT` - `gov/states/ri/tax/income/agi/subtractions/social_security/limit/income.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/ri/tax/income/agi/subtractions/social_security/limit/income.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/ri/tax/income/agi/subtractions/social_security/limit/income.yaml` @ `/SINGLE` - `gov/states/ri/tax/income/agi/subtractions/social_security/limit/income.yaml` @ `/SEPARATE` - `gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/income_limit.yaml` @ `/JOINT` - `gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/income_limit.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/income_limit.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/income_limit.yaml` @ `/SINGLE` - `gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/income_limit.yaml` @ `/SEPARATE` - `gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml` @ `/SINGLE` - `gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml` @ `/JOINT` - `gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml` @ `/SEPARATE` - `gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/ri/tax/income/credits/ctc/phase_out/increment.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml` @ `/SINGLE` - `gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml` @ `/JOINT` - `gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml` @ `/SEPARATE` - `gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/ri/tax/income/credits/ctc/phase_out/threshold.yaml` @ `/SURVIVING_SPOUSE` - `gov/states/ri/tax/income/deductions/standard/amount.yaml` @ `/SINGLE` - `gov/states/ri/tax/income/deductions/standard/amount.yaml` @ `/JOINT` - `gov/states/ri/tax/income/deductions/standard/amount.yaml` @ `/HEAD_OF_HOUSEHOLD` - `gov/states/ri/tax/income/deductions/standard/amount.yaml` @ `/SEPARATE` - `gov/states/ri/tax/income/deductions/standard/amount.yaml` @ `/SURVIVING_SPOUSE`

Suggested fixes

  1. Per file: either move the block under metadata: (per-bracket, EITC-max style) so projections uprate, or replace with explicit published values where an official annual release exists (the Fix Saver's Credit AGI thresholds for 2024-2026 #8903 approach — preferable for exactness where notices publish rounded figures).
  2. Upstream (policyengine-core): the loader should reject or warn on unknown keys alongside values: instead of silently discarding them — this class of bug is invisible until an oracle comparison catches a stale year.

Audit script: parse each parameter YAML, flag any dict node containing both values and uprating keys at the same level.

Related: #8889 (the Saver's Credit instance, fixed by #8903).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions