Skip to content

Model Montana's working military retirement and survivor benefit exemption - #10713

Open
MaxGhenis wants to merge 5 commits into
mainfrom
fix-mt-military-retirement-exemption
Open

MaxGhenis wants to merge 5 commits into
mainfrom
fix-mt-military-retirement-exemption

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

What was missing

PolicyEngine-US did not model Montana's working military retirement and survivor benefit exemption. military_retirement_pay.py and military_retirement_pay_survivors.py listed it as a limitation and the Montana subtractions.yaml marked it "not yet modeled", so PolicyEngine-US taxed all of a Montana military retiree's pay.

The law

  • MCA 15-30-2120(3)(n)(i) subtracts "a portion of military pensions or military retirement income as calculated pursuant to subsection (8)" that a retired member of the armed forces (10 U.S.C. 101), the army or air national guard or a reserve component (38 U.S.C. 101) receives. (3)(n)(ii) subtracts "up to 50% of all income received as survivor benefits for military service" of the same kinds.
  • (8)(a): the (3)(n)(i) subtraction "is equal to the lesser of: (i) the amount of Montana source wage income on the return; or (ii) 50% of the taxpayer's military pension or military retirement income." (8)(b) defines Montana source wage income as "(i) wages, salary, tips, and other compensation for services performed in the state; (ii) net income from a trade, business, profession, or occupation carried on in the state; and (iii) net income from farming activities carried on in the state."
  • (9): a person may claim either subtraction only if they became a resident after June 30, 2023 or "was a resident of the state before receiving military pension or military retirement income and remained a resident"; only "for 5 consecutive years after satisfying the provisions of subsection (9)(a)"; and not after claiming it and then becoming a nonresident. 2025 Mont. Laws ch. 586 (SB 93) changed (9)(a)(i) from "becomes a resident of the state after June 30, 2023" to "became a resident of the state on or after June 30, 2023" and repealed the 2033 termination (section 4, chapter 650, Laws of 2023), both for tax years beginning after December 31, 2025. The Form WMRE instructions name "Senate Bill 124"; the enacted bill is SB 93.
  • ARM 42.15.1501(1) lists the armed forces as the Army, Navy, Marine Corps, Air Force, Space Force and Coast Guard, plus the guard and reserve components. (2) says Montana source wage income "does not include income from any passive activity as that term is defined in 26 USC 469(c)". ARM 42.15.1510(3) gives worked examples.
  • Form WMRE (2025) Part II: line 1 takes taxable military retirement income; lines 2 to 5 take wages (Form 1040 line 1z), sole proprietorship income (Schedule 1 line 3), partnership and S corporation income, and farming income, and lines 3 to 5 each say "If zero or less, enter 0"; line 6 adds lines 2 to 5; line 7 takes half of line 1; line 8 takes the lesser of lines 6 and 7. Part III takes half of taxable military survivor benefits.
  • Start year: the 2024 Form 2 instructions (Senate Bill 104) say the exemption "can only be claimed for five years beginning with tax year 2024" for residents from before July 1, 2023, and the Revenue Interim Committee's November 2025 memo says "The partial exemption first became available in tax year 2024."

Change

  • New parameters under gov.states.mt.tax.income.subtractions.military_retirement:
    • rate (0.5) and survivor_rate (0.5);
    • in_effect (false before 2024, true from 2024; parameters extend their first value backward, so the rates alone would have reached 2023);
    • earned_income_sources: irs_employment_income ((8)(b)(i), WMRE line 2), total_self_employment_income ((8)(b)(ii), line 3: all Schedule C income, including a specified service trade or business), partnership_s_corp_income (line 4) and farm_operations_income ((8)(b)(iii), line 5: Schedule F).
  • New input mt_military_retirement_exemption_eligible (Person, default true) for the (9) residency and five-year conditions, which PolicyEngine-US cannot derive.
  • New mt_military_retirement_exemption (Person). The head's record carries the return's amount: in_effect × [min(rate × the eligible head's and spouse's military_retirement_pay, the return's earned income) + survivor_rate × their eligible military_retirement_pay_survivors]. Earned income sums each source in earned_income_sources over head and spouse and floors each sum at 0, as WMRE lines 3 to 5 do. Dependents' pay and income do not count.
  • subtractions.yaml adds the variable to its 2024 and 2025 lists (2026 carries 2025 forward). military_retirement_pay.py and military_retirement_pay_survivors.py drop their Montana limitation lines.

Readings taken

Three readings go into source_conflicts/candidates.yaml (step 1 of CONTRIBUTING.md#source-conflicts; no marker until the register holds them):

Id Question PE-US follows Pinned by
us-mt:military-retirement-exemption-schedule-e-income The WMRE line 4 instruction sends owners to all of Schedule 1 line 5, which also holds rents, royalties, estates, trusts and Form 4835 farm rent. Do those count? Statute: no. (8)(b) counts only a trade, business, profession or occupation, the line's own label is "partnership and S corporation income", and ARM 42.15.1501(2) leaves out passive activity income, which includes rental activity. "Rents, royalties, farm rent and estate income are not earned income"
us-mt:military-retirement-and-survivor-exemptions-same-return WMRE has the filer mark one box and complete Part II or Part III, and joint filers who both qualify complete one form. Can one return take both subtractions? Statute: yes. (3)(n)(i) and (ii) are separate subtractions and nothing makes a filer choose. "Retirement pay and survivor benefits on one return each get their exemption"; "A retiree who is also a survivor takes both exemptions beside an ineligible spouse"
us-mt:military-retirement-exemption-business-loss-floor (8)(b) says only "net income". Does a loss in one source reduce the others? Gap-fill from WMRE lines 3 to 5: each source counts as at least 0; Schedule C income nets across proprietorships first. "A business loss does not reduce wages in the earned income limit"; "A loss in one sole proprietorship offsets income from another before the floor"

Assumptions

  • mt_military_retirement_exemption_eligible defaults to true, which overstates the exemption in two known ways. From 2024, it includes a resident from before July 2023 whose pay or benefits began while living in another state (WMRE's example of Albert, who moved to Montana in 2021 after his pay began in Georgia in 2020). From 2029, it also includes every filer whose five years have run out, starting with those whose five years began in 2024 (WMRE: "The last year these taxpayers can claim the exemption will be tax year 2028"). As a benchmark, the committee memo reports 1,711 resident claimants and $24.8 million for tax year 2024 (more than 1,783 claimants and $25.5 million with nonresidents and part-year residents). The input has no formula, so it stays a calculator input.
  • PolicyEngine-US models full-year residents, so all of the return's wages, business, partnership and S corporation, and farm income count as Montana source.
  • PolicyEngine-US has no material participation input, so it counts all Schedule C, partnership, S corporation and Schedule F income, including any that ARM 42.15.1501(2) would leave out as passive.
  • military_retirement_pay and military_retirement_pay_survivors cover every uniformed service; (3)(n)(i) covers the armed forces, the guard and the reserves. The variable assumes none of the pay comes from the NOAA Corps or the Public Health Service.

Invariants

For every input:

  • the exemption is 0 before 2024, for ineligible filers, and on every record but the head's;
  • 0 ≤ exemption ≤ half the eligible filers' military retirement pay plus half their survivor benefits;
  • the exemption equals min(0.5 × eligible pay, Σ over sources max(0, head's and spouse's amount)) + 0.5 × eligible survivor benefits;
  • the exemption never raises Montana income tax.

A local randomized check (300 tax units and 572 people: 60% married, 30% with a dependent; random pay, survivor benefits, wages, Schedule C income including SSTB losses, partnership and S corporation income, Schedule F income, Schedule J farm_income, rents, farm rent, estate income and eligibility; seed 20261111; not committed, following this repo's YAML-first test policy) found every invariant held in TY2024 and TY2026. The exemption equaled an independent restatement of Form WMRE on every unit, Montana income tax never exceeded a reform that sets in_effect to false, and every TY2023 amount was 0.

Tests

mt_military_retirement_exemption.yaml, 22 cases:

  • The rate, the earnings cap and survivor benefits: TY2026 $30,000 of pay and $60,000 of wages gives 15,000 and mt_subtractions 15,000; $8,000 of wages binds (8,000); no earnings gives 0; $10,000 of survivor benefits alone gives 5,000; retired pay and a spouse's survivor benefits on one return give 10,000; a retiree who is also a survivor beside an ineligible spouse with wages and pay gives 16,000.
  • Each earnings source: SSTB income ($40,000 gives 15,000), Schedule F income ($40,000 gives 15,000), partnership and S corporation income (TY2025, $9,000 gives 9,000), a Schedule C loss netting against SSTB income before the floor (6,000), and a business loss that doesn't reduce wages (6,000).
  • What doesn't count: Schedule J farm_income (0); rents, Form 4835 farm rent and estate income (0); a dependent's pay (0); a dependent's wages (0).
  • Eligibility and years: an ineligible retiree (0); an ineligible survivor (0); the spouse's pay against the head's wages (15,000); TY2024 with mt_subtractions 15,000; TY2023 (0).
  • ARM 42.15.1510(3)(a) and (b): wages of $50,000 and pay of $40,000 give 20,000; $18,000 of Schedule C income and pay of $40,000 give 18,000.

Removing each new term fails at least one case:

Mutation Cases that fail (of 22)
Drop irs_employment_income from earned_income_sources 7
Drop total_self_employment_income 4
Drop partnership_s_corp_income 1
Drop farm_operations_income 1
Read self_employment_income (non-SSTB only) instead of total_self_employment_income 2
Add farm_income (Schedule J) to the list 1
Drop the 2024 subtractions.yaml entry 1
Drop the filer mask on earnings 1
Mask survivor benefits with filer instead of eligible 1
Drop the per-source zero floor 1

At 09ed698 (this branch, with main merged at 3386304), all 1,122 cases under tests/policy/baseline/gov/states/mt pass, and so do the 107 tests in tests/code_health/test_source_conflicts.py and tests/code_health/test_military_retirement_readers.py. ruff format and check pass on the changed Python files.

Before and after

TY2026, a single filer age 55 with $30,000 of military retired pay, before this fix (2eeb5d3) and after (09ed698):

Other income Exemption before Exemption after Montana income tax before Montana income tax after
$40,000 of SSTB income 0 15,000 2,434.44 1,695.48
$40,000 of Schedule F income 0 15,000 2,434.44 1,695.48
$40,000 of Schedule J farm_income (AGI $30,000) 15,000 0 0.00 653.30

A married couple, one spouse age 45 with $30,000 of military retired pay and $60,000 of wages, TY2026, at 09ed698: Montana income tax is 2,716.60 with in_effect set to false and 2,011.60 with the 15,000 exemption (2eeb5d3 gave the same 2,011.60). With no pension the couple owes 1,306.60, so Montana's tax on the pay falls from 1,410 to 705. A retired couple, ages 67 and 65, with $45,000 of military retired pay, $30,000 of Social Security and no earnings gets no exemption.

axiom: us-mt/statute/15-30-2120 queued (TheAxiomFoundation/rulespec-us#2075)

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 8, 2026 01:32
…ption

MCA 15-30-2120(3)(n) and (8), from tax year 2024: the lesser of half the
return's military retirement pay or its Montana earned income (Form WMRE
lines 2-5), plus half of military survivor benefits. An input records the
section (9) residency and five-year conditions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… June 30, 2023)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main's #10331 drops the disability income exclusion from Montana's
subtractions for 2024 on, after SB 399 repealed it. This branch adds
the working military retirement exemption to the same lists. The
resolution keeps both: the exemption joins the 2024 and 2025 lists,
the exclusion stays out, and the references keep both changes' sources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review November 9, 2026 16:50
@MaxGhenis
MaxGhenis requested a review from DTrim99 November 9, 2026 16:50
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

David, I'd like your read on two Montana choices here:

  1. The PR defaults mt_military_retirement_exemption_eligible to true, since no filer can use up the five consecutive years before 2028.
  2. It leaves rents and royalties out of the earnings that cap the exemption. MCA 15-30-2120(8)(b) counts "net income from a trade, business, profession, or occupation", but Form WMRE line 4 points to Schedule 1 line 5, which includes them.

If you can look by Tuesday afternoon, we can merge it before the Veterans Day post (PolicyEngine/policyengine-app-v2#1523).

@DTrim99

DTrim99 commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Model Montana's working military retirement and survivor benefit exemption

Summary

The structure follows the law. MCA 15-30-2120(3)(n)(i) and (8)(a) give a retiree "the lesser of: (i) the amount of Montana source wage income on the return; or (ii) 50% of the taxpayer's military pension or military retirement income". (3)(n)(ii) gives "up to 50% of all income received as survivor benefits", with no earnings cap. (9) adds the residency and five-year conditions. The rates (0.5 and 0.5), the 2024 start, pooling the earnings cap over the return, carrying the return's amount on the head, keeping dependents out, the zero floor on each business source, and the per-person eligibility mask all match the statute, Form WMRE (2025) and its instructions. The exemption flows through the 2024+ federal-taxable-income path (mt_taxable_income_joint.formula_2024). The PR's before/after figures reproduce: $2,716.60 to $2,011.60 for the TY2026 couple.

One critical problem remains. Two of the four earnings sources that set the cap are the wrong PolicyEngine variables:

  • self_employment_income is only non-SSTB Schedule C income, so a retiree who works as a consultant, physician or lawyer gets no cap room from that business.
  • farm_income is the Schedule J income-averaging input. It isn't in federal AGI. Schedule F income sits in farm_operations_income, which the formula never reads.

Three should items remain: the PR's two statute-over-form readings have no source-conflict candidate entries; four new terms are unpinned by tests; and one reference title carries page text.

On the two questions in the thread:

  • Rents and royalties (question 2). Leaving them out is right under the 2026-10-19 statute-first rule. (8)(b)(ii) counts only "net income from a trade, business, profession, or occupation", and WMRE line 4's own label is "Montana source partnership and S corporation income". Only the line 4 instruction points to all of Schedule 1 line 5. The reading needs a candidate entry (Should 1).
  • Defaulting eligibility to true (question 1). It's a reasonable default, with two caveats for the documentation (Suggestion 2). First, the five-year limit doesn't bind anyone until 2029, one year later than the PR body says. Second, the residency test already excludes a real group in 2024-2028 that the default can't see.

Critical (must fix)

  1. The earnings cap misses SSTB business income and Schedule F farm income, and counts a non-AGI input (mt_military_retirement_exemption.py:36-44).
    • The law counts all of them. (8)(b) defines "Montana source wage income" to include "(ii) net income from a trade, business, profession, or occupation carried on in the state; and (iii) net income from farming activities carried on in the state". The WMRE instructions (p. 3) send line 3 to "the total business income included on Form 1040, Schedule 1, line 3" (all Schedule C income). Line 5 is "farming income". The 2024 Form 2 instructions (p. 5) list "Net income from a trade or business" and "Net income from farming activities in Montana".

    • SSTB income. PolicyEngine splits Schedule C into self_employment_income ("Self-employment non-farm income") and sstb_self_employment_income (income from a specified service trade or business under IRC 199A(d)(2)). total_self_employment_income adds the two. Federal gross income, earned_income and eitc_earned_income read both. The formula reads only self_employment_income, so it drops the professions that (8)(b)(ii) names explicitly.

    • Farm income. farm_income is documented as "Income averaging for farmers and fishermen. Schedule J. Seperate from QBI and self-employment income." No federal or Montana tax formula reads it; gov/irs/gross_income/sources.yaml lists farm_operations_income ("Income from active farming operations. Schedule F") instead. The formula does the reverse: it ignores Schedule F income and counts farm_income, which isn't in AGI at all.

    • Probes on the head tree (TY2026, single, Montana, age 50 or 55, $30,000 of military retired pay):

      Earnings Law Head Montana tax at head Montana tax under the law
      $40,000 sstb_self_employment_income 15,000 0 $2,434.44 $1,695.48
      $40,000 farm_operations_income 15,000 0 $2,434.44 $1,695.48
      $40,000 farm_income (AGI stays $30,000) 0 15,000

      The first two filers overpay Montana tax by $738.95.

    • Hand check for the SSTB filer:

      • SE tax: 40,000 × 0.9235 × 0.153 = 5,651.82, so the deduction for half is 2,825.91.
      • AGI: 70,000 − 2,825.91 = 67,174.09.
      • QBI deduction: 0.2 × 37,174.09 = 7,434.82.
      • Federal taxable income: 67,174.09 − 16,100 − 7,434.82 = 43,639.27. Montana adds back the QBI deduction: 51,074.09.
      • Tax at the head: 47,500 × 4.7% + 3,574.09 × 5.65% = 2,232.50 + 201.94 = 2,434.44.
      • Tax with the 15,000 exemption: 36,074.09 × 4.7% = 1,695.48.
    • Montana is a heavily agricultural state, and consulting is a common second career for retirees, so neither case is rare.

    • Fix:

      • Replace "self_employment_income" with "total_self_employment_income" (Schedule 1 line 3 nets SSTB and non-SSTB Schedule C income, matching the combined floor) and "farm_income" with "farm_operations_income".
      • Add a TY2026 case for each: $30,000 of pay with $40,000 of SSTB income gives 15,000, and $30,000 of pay with $40,000 of Schedule F income gives 15,000.
      • farm_rent_income (Form 4835, Schedule E line 40) is a crop-share landlord's rent. Like other rents it stays out under the statute reading the PR already takes (see Should 1).
      • Update the PR body's source list and the "Earned income adds ..." sentence.

Should address

  1. Record the two statute-over-form readings as source-conflict candidates (policyengine_us/variables/gov/states/mt/tax/income/subtractions/military_retirement/mt_military_retirement_exemption.py).

    • CLAUDE.md and CONTRIBUTING.md#source-conflicts require it. Where the statute conflicts with a form or its instructions, the code follows the statute and the ruling PR adds a source_conflicts/candidates.yaml item (step 1: id, program, question, years, at least two sources, readings, pe_us with follows: statute, state). It adds no marker yet. The PR takes two such readings and records neither, though its body describes both.
    • (a) Rents, royalties, estates and trusts in the cap.
      • (8)(b)(ii) counts "net income from a trade, business, profession, or occupation".
      • The WMRE line 4 instruction (p. 3) says "Residents actively engaged in a business as an owner of a partnership or S corporation, enter the amount from Form 1040, Schedule 1, line 5". That line also carries rental real estate, royalties, estates, trusts and Form 4835 farm rent.
      • The code uses partnership_s_corp_income alone.
      • Suggested id: us-mt:military-retirement-exemption-schedule-e-income.
    • (b) Both subtractions on one return.
      • (3)(n)(i) and (ii) are separate subtractions, and the code allows both, such as one spouse's retired pay and the other's survivor annuity, or a retiree who is also a survivor.
      • Form WMRE has the filer "Mark the appropriate box" (one of two). The instructions (p. 3) say "If you mark the Military Retiree box, complete Parts I and II. If you mark the Beneficiary ... box, complete Parts I and III" and "If filing jointly and both spouses qualify for the exemption, complete only one form." So the form allows one of the two per return.
      • Case 5 pins the statute reading.
      • Suggested id: us-mt:military-retirement-and-survivor-exemptions-same-return.
    • Optional, in the same entries: the zero floor on each business source is a gap-fill from WMRE lines 3-5 ("If zero or less, enter 0"). (8)(b) says only "net income".
    • The PR adds no conflict-sounding comments, so the Tie source-conflict markers to the register shared with Axiom #10287 ratchet is unaffected either way.
  2. Pin four unpinned terms (mutation rule: deleting each fails no test).

    • The 2024 subtractions.yaml entry. No test runs TY2024. Case 1 (2026) pins only the 2025 list, which 2026 carries forward. Add a TY2024 case that checks mt_subtractions. A probe on the head tree gives 15,000 for a single 50-year-old with $30,000 of pay and $50,000 of wages.
    • partnership_s_corp_income in the source list. No case uses it. Probe: TY2025, $30,000 of pay and $9,000 of partnership_income gives 9,000.
    • The farm source. No case uses it (covered by the Critical fix's new case).
    • The filer mask on earnings and the eligibility mask on survivor benefits.
      • Case 8 gives the military pay to the dependent, so it pins only the mask on pay. Add a filer with pay and no earnings whose dependent has wages. Probe: TY2026, $30,000 of pay and a dependent with $20,000 of wages gives 0.
      • Case 9 has no survivor benefits, so replacing eligible with filer in the survivor sum fails nothing. Add an ineligible survivor (expect 0).
  3. Drop the page text from the RIC memo reference title (policyengine_us/parameters/gov/states/mt/tax/income/subtractions/military_retirement/in_effect.yaml:13).

    • The title "Montana Revenue Interim Committee, Tax Benefits for Veterans (November 2025), p. 1" ends in page text, and the href already has #page=1.
    • CLAUDE.md: "One cited page: #page=57 in the href only, no page in the title." Remove ", p. 1".

Suggestions

  1. Remove the stale Montana line from military_retirement_pay_survivors.py. The PR deletes the Montana "not yet modeled" limitation from military_retirement_pay.py. The survivor variable still says "Montana (MCA 15-30-2120(3)(n)(ii)): allows exempting up to 50% of military survivor benefits ... this deduction is not yet modeled". After this PR, that is false.

  2. Eligibility default (question 1): keep true, but document when it stops being exact.

    • Timing. The WMRE instructions (p. 2) say that for residents from before July 1, 2023 "the exemption is available for five years beginning with tax year 2024. The last year these taxpayers can claim the exemption will be tax year 2028." The form also asks for the "First tax year the exemption was taken". So (9)(b) can't bind anyone before 2029, not 2028 as the PR body says ("through 2027 ... From 2028"). The input's own documentation already says 2024 through 2028. From 2029, everyone whose eligibility began before 2024 drops out, and the default keeps them in. Say so in the input's documentation, so long-run projections carry the caveat.
    • Residency. (9)(a) already excludes, from 2024, a resident from before July 2023 whose pay began elsewhere. WMRE gives this example: "Albert ... moved to Montana in 2021 ... He began receiving his military retirement income when he was a resident of Georgia in 2020 ... he is not eligible for the exemption." Many retirees move after retiring, and service members stationed in Montana often keep another state's residency, so this group may be large.
    • Benchmark. The Revenue Interim Committee memo (p. 1) reports 1,783 claimants and $25.5 million exempted in TY2024. A microsimulation aggregate well above that would suggest the default (or the residency test) needs a takeup-style adjustment.
    • The plain-input design is right: a default formula would hide the variable from the web calculator's household builder (the Give Michigan's qualified disabled veteran exemption to every veteran with a service-connected disability #10714 lesson).
  3. Move the earnings source list to a parameter. For example, military_retirement/earned_income_sources.yaml, looped with the same per-source floor. The list then carries its own references (WMRE lines 2-5), and source changes like the Critical fix become data-only.

  4. Note the "armed forces" scope.

    • (3)(n)(i)(A) covers "the armed forces of the United States, as defined in 10 U.S.C. 101": Army, Navy, Air Force, Marine Corps, Space Force and Coast Guard.
    • military_retirement_pay covers retirees of all "uniformed services", which adds the NOAA Corps and the Public Health Service.
    • One line in the exemption's documentation would record that assumption.
  5. Bill numbers and the 2024 start (text only).

    • The PR body and rulespec-us#2075 say SB 124 (2025) repealed the 2033 termination, following the WMRE instructions. The 2025 Form 2 instructions (p. 4: "Senate Bill 93 removes the expiration date for the military retirement income and survivor's benefits subtraction") and the RIC memo (p. 2) say SB 93. The current MCA carries no termination note for (3)(n), so the code is right either way.
    • For the 2024 start, the 2024 Form 2 instructions (p. 5, "Under Senate Bill 104 ... the exemption can only be claimed for five years beginning with tax year 2024") or WMRE p. 2 would be a Department of Revenue source to add beside the memo in in_effect.yaml.

Verified correct

  • Statute (current MCA 15-30-2120, read in full).
    • (3)(n)(i)(A)-(D) and (ii) "up to 50%".
    • (8)(a)(i)-(ii) "lesser of", applied only to (3)(n)(i).
    • (8)(b)(i)-(iii).
    • (9)(a)(i) "on or after June 30, 2023", (a)(ii), (b) five consecutive years, and (c).
    • There's no termination note for (3)(n); the only termination notes are for (3)(p) and (q), in 2035.
    • The input documentation's "on or after June 30, 2023" follows the statute; WMRE says "after June 30, 2023". It's documentation only, with no computational effect.
  • Form WMRE (2025).
    • Part II: line 1 is taxable military retirement income (1099-R box 2a, code 7). Lines 2-5 are wages, business, partnership/S corporation and farm income, with lines 3-5 floored at 0. Line 6 is the sum, line 7 is 50% of line 1, and line 8 is the lesser of lines 6 and 7.
    • Part III: 50% of taxable SBP benefits. Death benefits (code 4) don't qualify, and military_retirement_pay_survivors already excludes DIC.
  • Start year. The 2024 Form 2 instructions (SB 104) and the RIC memo ("first became available in tax year 2024") support in_effect = false before 2024 and true from 2024.
  • Pooling and placement.
    • The cap uses "Montana source wage income on the return", so pooling the head's and spouse's earnings is right, and case 6 (the spouse's pay against the head's wages) is right.
    • Only eligible filers' pay and survivor benefits count.
    • The head carries the amount. mt_taxable_income_joint.formula_2024 sums mt_subtractions over the head and spouse, so placement doesn't change tax (spouse rows are 0 in cases 1, 3, 5, 6 and 8).
    • Married filing separately on the same return ended in 2024, so mt_agi_indiv isn't reached.
  • Probes on the head tree.
    • Probe 8: a retiree who also receives survivor benefits ($24,000 of pay, $8,000 of benefits), joint with a spouse who has $50,000 of wages and $10,000 of pay but is ineligible: 12,000 + 4,000 = 16,000.
    • Probe 9: an Idaho resident gets 0 and mt_income_tax 0, with no errors.
    • No state-gated int or enum key, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
  • Reuse. The formula reuses military_retirement_pay, military_retirement_pay_survivors, irs_employment_income and partnership_s_corp_income. No existing variable records Montana residency history, so the new eligibility input duplicates nothing. It has no formula, so it stays a calculator input.
  • Count military SBP annuities in state benefit income lists #10317 guard. The formula reads the raw military_retirement_pay and the survivor input separately from a file under .../mt/tax/..., which is_tax_side exempts. That is correct, since (8) caps only the retiree's pay. test_military_retirement_readers.py passes on the merged tree.
  • Tie source-conflict markers to the register shared with Axiom #10287 ratchet. The PR adds no conflict-sounding comments (checked against CONFLICT_COMMENT_RE), and no touched file is in KNOWN_UNMARKED. Every repository-content check in test_source_conflicts.py passes on the merged tree (see CI status for one local-only self-test failure).
  • Other checks.
    • The changelog fragment is top-level, with type added.
    • The tests are in a variable-named YAML file.
    • No partner-test files are touched.
    • rate.yaml and survivor_rate.yaml references corroborate 0.5 (WMRE Part II line 7, Part III line 2).
  • Hand-checks (arithmetic; the PR's ten cases also pass on the head tree):
    1. Case 1 (2026): min(60,000, 0.5 × 30,000) = 15,000 on the head and 0 on the spouse. mt_subtractions is 15,000 (no old-age subtraction at ages 45/43).
    2. Case 2 (2025): min(8,000, 15,000) = 8,000.
    3. Case 3: earnings 0, so min(22,500, 0) = 0. Interest and Social Security aren't earnings.
    4. Case 4: 0.5 × 10,000 = 5,000, with no earnings needed.
    5. Case 5: min(0.5 × 20,000, 5,000) + 0.5 × 10,000 = 10,000.
    6. Case 6: min(60,000, 0.5 × 30,000) = 15,000 on the head.
    7. Case 7: 6,000 + max(0, −4,000) = 6,000, and min(15,000, 6,000) = 6,000.
    8. Case 8: the dependent's pay is masked, so 0.
    9. Case 9: the input is false, so 0.
    10. Case 10 (2023): in_effect is false, so 0. Every 2021-list subtraction is 0 for this household, so mt_subtractions is 0.
    11. PR body, TY2026 couple: federal taxable income is 90,000 − 32,200 = 57,800 (probe confirms 57,800).
      • Before: 57,800 × 4.7% = 2,716.60.
      • After: 42,800 × 4.7% = 2,011.60 (probe confirms).
      • Without the pension: 27,800 × 4.7% = 1,306.60.
    12. The SSTB filer in Critical 1: 2,434.44 at the head vs 1,695.48 under the law (both probe-confirmed).

Axiom line assessment

axiom: us-mt/statute/15-30-2120 queued (TheAxiomFoundation/rulespec-us#2075) is a valid queued line: it has a status word and links the issue.

rulespec-us#2075 is OPEN and labelled pe-parity. It is dispatch-ready:

  • module path us-mt/statutes/15-30-2120/3/n.yaml;
  • corpus citation with its sha256;
  • verbatim (3)(n), (8) and (9);
  • seven required outputs;
  • companion tests A-G, which are hand-derived from the statute and form arithmetic, not PolicyEngine output;
  • the pipeline wiring step.

It records the encoding debt (the held mt_pit_2026_has_military_retirement_subtraction branch) in the same form accepted for #2074 in this batch.

It matches the head's behavior. Its output 4 is stated at the level of the law ("net income from a trade or business and net farm income"), so the Critical fix doesn't contradict it. When the fix lands, consider adding a farm companion test, such as "$30,000 of military retirement income and $40,000 of net farm income gives output 5 = 15,000". Also consider correcting "SB 124" (Suggestion 5).

CI status

At head 2eeb5d3, 36 checks pass and 7 are skipped, with none failing or pending. The passing checks include:

  • PR validation (lock, guard tests, lint, changelog);
  • Quick Feedback;
  • Household API Partners;
  • Microsimulation;
  • all Baseline, Contrib and Python Rest shards.

The head already includes main, so CI ran the merged tree.

Locally on that tree:

Branch status

The branch is 3 commits ahead and 0 behind main. git merge-tree --write-tree gives the head's own tree, and head vs main differs only in the PR's nine files.

#10331 (merged today) edited subtractions.yaml. The PR merged main after it, and both changes are intact: #10331's disability-exclusion repeal comment and 2021 list, and this PR's 2024 and 2025 entries.

No file overlaps with the sibling military retirement PRs (#10702 UT, #10714 MI, #10715 ID, #10716 DE, #10717 ID).

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes per the review above: 1 critical (the earnings cap reads self_employment_income and farm_income, so it drops SSTB business income and Schedule F farm income that 15-30-2120(8)(b) counts, and counts a non-AGI input; use total_self_employment_income and farm_operations_income), 3 should (record two statute-over-form readings; four unpinned terms; a reference title), 5 suggestions.

MaxGhenis and others added 2 commits November 11, 2026 12:01
MCA 15-30-2120(8)(b) counts net income from a trade, business, profession
or occupation and net farming income. The cap read self_employment_income
(non-SSTB Schedule C only) and farm_income (the Schedule J averaging input,
outside AGI). A new earned_income_sources parameter lists
irs_employment_income, total_self_employment_income,
partnership_s_corp_income and farm_operations_income, and the formula loops
over it with the per-source zero floor.

Also records three readings as source-conflict candidates (Schedule E
income, both subtractions on one return, the per-source loss floor), pins
the 2024 subtractions entry, the partnership and farm sources, the filer
mask on earnings and the eligibility mask on survivor benefits, adds the
ARM 42.15.1510(3)(a) and (b) examples, documents the armed forces scope,
passive income and when the eligibility default stops being exact, drops
page text from the RIC memo title, adds the 2024 Form 2 instructions as a
source for the 2024 start, and removes the stale Montana limitation from
military_retirement_pay_survivors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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.

2 participants