Skip to content

Add Montana income tax parameters for 2017–2020 - #10847

Merged
MaxGhenis merged 2 commits into
mainfrom
mt-historical-income-tax-parameters
Nov 14, 2026
Merged

MaxGhenis merged 2 commits into
mainfrom
mt-historical-income-tax-parameters

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Correct Montana's 2017–2020 income tax parameters so historical returns use the amounts the Department of Revenue published for each year. Also start four existing subtractions in 2017, where the parameter list started them in 2021. Tax years 2015 and 2016 change too, through backdating.

The annual brackets, exemptions and pension limits come from the 2017, 2018, 2019 and 2020 Form 2 instructions. The department published the earlier standard deduction limits in its 2021 instructions.

This follows the historical-parameter finding in #10276.

Changes

Tax year Personal exemption Single/separate standard deduction minimum–maximum Pension exemption maximum Pension phase-out starts
2017 $2,400 $2,000–$4,510 $4,110 $34,260
2018 $2,440 $2,030–$4,580 $4,180 $34,820
2019 $2,510 $2,090–$4,710 $4,300 $35,800
2020 $2,560 $2,130–$4,790 $4,370 $36,420

Joint and head-of-household standard deduction limits equal twice the single amounts. The pension limits appear on PDF pages 23, 25, 30 and 27, respectively.

Start four existing subtractions in 2017, where the parameter list started them in 2021, so they now apply in 2017–2020. They cover federal-government interest and state income-tax refunds (Schedule II, lines 1 and 6), senior interest (line 12), and 529 contributions (line 20). For 2015 and 2016 the list keeps its three entries.

Date the existing parameters from their verified 2017 availability for separate filing (Box 3a), exemptions and the capital gains credit (lines 44–47), standard deductions (Worksheet V), and Social Security calculations (Worksheet VIII). Also date the existing parameters for the federal tax deduction, child-care deduction and allocation, miscellaneous deductions, interest and disability exclusions, and other additions.

backdate_parameters copies each parameter's earliest value back to 2015, the first modeled year. On main, 2015 and 2016 took the 2021 amounts, and they now take the 2017 brackets, exemption, standard deduction limits and pension limits.

The 2017 medical-allocation example now produces $114.00 of separate tax and $184.00 of joint tax. With the same 0.679 allocation, each spouse has $4,300 of taxable income: $29 + $1,400 × 2% = $57.00.

Invariants and validation

test_mt_historical_parameters.py checks three properties with generated inputs and deterministic boundary points:

  • Each filing status uses the published marginal brackets in 2017–2020. Its standard deduction limits follow the chosen statutory reading.
  • Standard deductions stay between each year's minimum and maximum and increase with Montana AGI. Pension exemptions stay between zero and each year's cap and decrease with federal AGI above the phase-out threshold.
  • Each of the four restored subtraction components reaches the total in every historical year.

mt_historical_parameters.yaml adds 21 cases covering annual amounts, both sides of each rate threshold, both standard-deduction boundaries, both pension phase-out boundaries, and the restored subtractions. mt_income_tax.yaml checks the re-derived 2017 medical-allocation example.

The historical amounts and the four subtractions change results for 2015–2020 only. A comparison of all 39 edited parameter files found identical effective values in all 390 file/year combinations for 2021–2030.

Local single-file checks passed: 21 historical YAML cases, 6 income-tax YAML cases, 3 property tests and all 103 source-conflict guard tests. make format passed.

Five mutants each failed their targeted assertion: an incorrect 2017 bracket, exemption and pension cap, a doubled 2018 surviving-spouse cap, and delaying the restored subtractions until 2021.

Pull request run 43524771581 at 55a31a61be passed all 36 jobs on GitHub's merge with main f926615321.

Methodology choices

  • Use the Department of Revenue's published annual thresholds and exemption amounts. Move constant-rule anchors to 2017 to record verified availability, without claiming that the legislature first enacted those provisions in 2017.
  • Calculate tax across successive brackets under MCA 15-30-2103(1)–(2), using the published indexed thresholds. The department rounds fixed subtract amounts in its booklets; retain fractional-dollar tax calculations.
  • Follow MCA 15-30-2132(1) for surviving spouses' standard deductions. Only married joint filers and federal heads of household may double the deduction. Surviving spouses cannot claim federal head-of-household status under 26 USC 2(b)(1). The department generally permits federal qualifying widows or widowers to use Montana head-of-household status in its 2018, 2019 and 2020 instructions. Retain single standard-deduction limits under the statute. Record both readings in candidate us-mt:surviving-spouse-standard-deduction for later registration. Single and head-of-household filers share the $5,000 federal-tax deduction limit and $800 senior-interest limit.
  • Preserve the existing equal-share allocation convention. Spouses must divide the child-care deduction equally between separate columns (2017 instructions). Retain other allocation assumptions.
  • Leave later-only parameters unchanged: the property rebate remains zero before its first applicable year; the separate capital-gains rates, federal-deduction ordering switch and old-age subtraction remain outside the historical calculation paths.
  • Leave years before 2017 unverified: 2015 and 2016 use the 2017 amounts through backdating. This PR leaves the program registry's verified years as they stand.
  • Leave the 2017 itemized deduction limitation unmodeled. Worksheet VI-IDL reduces a filer's itemized deductions by the smaller of two amounts: 80% of the deductions it covers, or 3% of Montana AGI above $261,500 for a single filer ($313,800 joint, $287,650 head of household, $156,900 separate). The model applies no such limit, so a 2017 itemizer above those amounts keeps too large a deduction. The gap predates this PR.
  • Reuse all existing parameters and inputs. The four restored subtractions follow provisions the department described in the 2017 booklet; their formulas remain unchanged.

Overlap with open work

Companion draft PR #10840 addresses the other #10276 follow-ups. The two PRs edit separate files and can merge independently.

#9888 and #9912 each change the first list in deductions/itemized/misc_deductions.yaml, which this PR re-dates from 2021 to 2017. #10696 changes the list in subtractions/subtractions.yaml that this PR re-dates the same way. All three will conflict in those files once this PR lands, and each should keep the 2017 date when it merges main.

#10772 and #10713 also edit subtractions/subtractions.yaml and merge there without conflict. Each will conflict in source_conflicts/candidates.yaml, where its entry sits next to this PR's. #10002 and #10070 merge with this head without conflict. #10110, a draft, also edits itemized/misc_deductions.yaml.

Microsimulation impact

This PR changes Montana income tax results for tax years 2015 to 2020 only. The default dataset's records start in 2024, so no population estimate exists for those years.

We compared main at 935b24ff4f with this branch at 55a31a61be. All 664 leaf parameters under gov.states.mt hold the same value on both at the start of each year from 2021 to 2035, and the PR changes no formula.

For 2015 to 2020, lower bracket thresholds, exemptions, standard deduction limits and pension limits can raise tax, and from 2017 the four subtractions can lower it. For example, a single filer aged 40 with $40,000 of wages owes $1,722.81 of Montana income tax for 2016, up from $1,649.51:

Standard deduction Exemption Taxable income Tax
main (2021 amounts) $4,830 $2,580 $32,590 $698 + 6.9% × $13,790 = $1,649.51
this PR (2017 amounts) $4,510 $2,400 $33,090 $654 + 6.9% × $15,490 = $1,722.81

The same filer's tax for 2021, 2024, 2025 and 2026 stays the same.

impact: Montana income tax changes for tax years 2015 to 2020 only; the default dataset starts in 2024, so no estimate exists for those years, and no parameter or formula changes from 2021 on

axiom: TheAxiomFoundation/rulespec-us#1520 queued, extended with the 2017–2020 amounts and companion cases; the corpus lacks the 2017–2020 Form 2 instructions and the 2017 and 2019 editions of MCA 15-30-2103, 15-30-2110 and 15-30-2132, so the signed encoder can't run yet

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 12, 2026 02:15
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10847 at 55a31a61beb578d0fd3ffa5951f53324fe760cd3 (squash): Add Montana income tax parameters for 2017–2020.

  • Reviews:
    • The PR has no GitHub reviews. One independent review ran outside GitHub and approved 55a31a61be with no blocking finding.
    • The review downloaded the 2017 to 2021 Form 2 instructions from revenuefiles.mt.gov and read every amount the PR adds against them. Those amounts cover the four rate schedules, the exemptions, the standard deduction limits, and the pension exemption maximums and thresholds. It found the four subtractions on the 2017 Schedule II and the re-dated constants in the 2017 to 2020 booklets. It read MCA 15-30-2103 and 15-30-2132 and 26 U.S.C. 2(b)(1), and it found each source-conflict excerpt word for word in its source.
    • It built the head and the merge base 935b24ff4f and dumped every Montana income tax parameter for each year from 2015 to 2030. 44 parameters differ, all within 2015 to 2020, and none of the 1,824 values for 2021 to 2030 differs.
    • It computed three households by hand and matched each to the head: a single filer with $40,000 of wages in 2019 ($1,675.22), a retiree with a $20,000 pension in 2017 ($156.48), and a filer with U.S. government interest and a state refund in 2018 ($1,015.52).
    • On the head it ran the 21 new YAML cases, the 6 cases in mt_income_tax.yaml, the three property tests, the 103 source-conflict guard tests and four other Montana test files that hold cases before 2021 (122 cases). All pass. On the merge base, all 21 new cases fail, and so does the re-derived 2017 case. A mutant that left the four subtractions out of 2019 failed test_historical_subtractions_include_each_existing_component.
    • The review listed corrections to the description, and I made each before merge. The description now says that 2015 and 2016 change through backdating, that the four subtractions apply from 2017, and why no population estimate exists. It lists the 2017 itemized deduction limitation as a gap and uses an accepted axiom: form.
    • I also corrected two statements about open PRs. Fix Montana's 2021–2023 SALT caps and tax elections #10002 no longer edits a file this PR changes apart from source_conflicts/candidates.yaml, and Count Montana casualty losses once per return and only for the spouses who had them, less $100 and 10% of Montana AGI #9888 removes one entry from misc_deductions.yaml where the description said it deleted the file.
  • Methodology choices for maintainers:
    • A surviving spouse keeps the single standard deduction limits. MCA 15-30-2132(1) doubles them only for a joint return and for a filer who qualifies as head of household on the federal return, and 26 U.S.C. 2(b)(1) keeps a surviving spouse out of that status. The department's 2018 to 2020 instructions let a qualifying widow or widower use head of household status. The PR follows the statute and records both readings as candidate us-mt:surviving-spouse-standard-deduction. For example, a 2018 surviving spouse with $100,000 of Montana AGI deducts $4,580, where the department's reading gives $9,160.
    • The model taxes income across the brackets of MCA 15-30-2103, and the department's printed table rounds its subtraction amounts. On $20,000 of 2017 taxable income the brackets give $819.60 and the table gives $820.
    • The PR dates the constant rules in 28 parameter files from 2017, since the 2017 booklet shows each one. That date marks the earliest booklet checked. It doesn't claim that the legislature enacted any of these rules in 2017.
    • Tax years 2015 and 2016 now take the 2017 amounts through backdating, where they took the 2021 ones. Nobody has checked either year against its own booklet.
  • Gates checked live at merge:
    • gh pr checks exits 0;
    • the latest Pull request run at the head, 43524771581, passed and tested this head merged into main at f926615321;
    • MERGEABLE;
    • not a draft;
    • no reviewer's latest review requests changes;
    • the semantic-overlap guard: since f926615321, main has changed no area this PR touches. Between the PR's merge base 935b24ff4f and main at f926615321, main changed one file this PR touches, source_conflicts/candidates.yaml, where other PRs added entries. Main also changed a Montana income tax test file this PR leaves alone, through Count the premium tax credit in household net income as a refundable credit #10773, and three Montana LIHEAP variables. The branch merges into main at f926615321 without conflict;
    • the merge pins the head.
  • Impact: The PR changes Montana income tax results for tax years 2015 to 2020 only. The default dataset's records start in 2024, so no population estimate exists for those years. I built the head and the merge base 935b24ff4f and read all 664 leaf parameters under gov.states.mt at the start of each year from 2021 to 2035, and no value differs. The PR changes no formula. For example, a single filer with $40,000 of wages owes $1,722.81 of Montana income tax for 2016, up from $1,649.51. The same filer's tax for 2021, 2024, 2025 and 2026 stays the same.
  • Next:
  • Axiom: TheAxiomFoundation/rulespec-us#1520 stays queued, and a comment there adds the 2017 to 2020 amounts and companion cases from this PR's YAML. The signed encoder can't run yet. The corpus holds Montana's Form 2 instructions for 2021 to 2025 only, and no 2017 or 2019 edition of MCA 15-30-2103, 15-30-2110 or 15-30-2132.

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant