Skip to content

Net the property tax credit out of the MO WFTC liability cap - #9197

Merged
MaxGhenis merged 3 commits into
mainfrom
fix-mo-wftc-ptc-cap
Aug 2, 2026
Merged

Net the property tax credit out of the MO WFTC liability cap#9197
MaxGhenis merged 3 commits into
mainfrom
fix-mo-wftc-ptc-cap

Conversation

@hua7450

@hua7450 hua7450 commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

Fixes the Missouri Working Families Tax Credit's tax-liability cap to net out the (refundable) Missouri Property Tax Credit, matching Form MO-WFTC lines 7–10. Previously the cap used raw pre-credit tax, so PolicyEngine overpaid the WFTC to households eligible for both credits.

Fixes #9179

Legal basis

Changes

  • New variable mo_wftc_liability_cap = max(mo_income_tax_before_creditsmo_property_tax_credit, 0), with a comment noting MO-1040 Line 42 (Form MO-TC) is not modeled. It lives in credits/ next to mo_wftc.py with a WFTC-scoped name because the quantity exists only as Form MO-WFTC Line 9 — MO-1040 itself has no such line, so a generic income_tax/ name would invite reuse as a real return line.
  • Used as the liability base in mo_wftc.py only. The mo_non_refundable_credits aggregate stays on mo_income_tax_before_credits: it reads the already-capped applied mo_wftc, so the aggregate equals the applied credit either way, and the Form MO-WFTC line 8 netting is WFTC-specific — a WFTC-specific aggregate base would wrongly suppress any future credit placed ahead of the WFTC in the ordered list. (The issue originally suggested changing both call sites; that was based on the incorrect assumption that the aggregate recomputes credits from their potentials.)
  • mo_property_tax_credit remains in refundable.yaml (it is genuinely refundable per RSMo 135.020).
  • Fixed the stale "the last reference above" comments in mo_income_tax.py and mo_income_tax_before_refundable_credits.py to name RSMo 135.020 explicitly and link the refundability citation with a #page=17 anchor.
  • Relabeled mo_income_tax_before_refundable_credits to "Missouri income tax before refundable credits" — it previously shared the exact label "Missouri income tax" with mo_income_tax, leaving two indistinguishable variables in API/app metadata that differ by the full refundable PTC.

Test plan

  • Two unit cases in mo_wftc.yaml: PTC exhausting liability → WFTC $0; PTC partially reducing the cap → WFTC $40.
  • Two unit cases for the new mo_wftc_liability_cap variable (reduction and zero floor), under tests/.../credits/wftc/.
  • Pinned integration regression from the issue's verified reproduction: disabled single renter, MO 2025, $18,000 wages, $9,600 rent → tax $17.17, PTC $446.49, WFTC potential $16.89, mo_wftc $0, net MO tax −$429.32 (previously PolicyEngine paid the full $16.89 of WFTC).
  • Existing WFTC/credit-order tests unaffected (their households compute a $0 PTC).
  • CI

🤖 Generated with Claude Code

@codecov

codecov Bot commented Aug 2, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (0eec199) to head (743cf68).
⚠️ Report is 9 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9197   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            2         5    +3     
  Lines           31        62   +31     
=========================================
+ Hits            31        62   +31     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 2 commits August 2, 2026 00:00
Form MO-WFTC Lines 7-10 cap the credit at MO-1040 Line 36 tax less
Lines 42-43, and RSMo 143.177.3 applies the WFTC "after reduction for
all other credits allowed thereon." The cap previously used raw
pre-credit tax, overpaying the WFTC to households eligible for both
the WFTC and the property tax credit.

Fixes #9179

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Form MO-WFTC line 8 netting of the property tax credit is specific
to the WFTC; the aggregate reads the already-capped applied credit, so
a WFTC-specific base there would only suppress future credits placed
ahead of the WFTC in the ordered list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hua7450
hua7450 force-pushed the fix-mo-wftc-ptc-cap branch from b012ba3 to f556aea Compare August 2, 2026 04:00
@hua7450
hua7450 marked this pull request as ready for review August 2, 2026 04:45
Rename mo_income_tax_less_property_tax_credit to mo_wftc_liability_cap
and move it next to mo_wftc: the quantity exists only as Form MO-WFTC
Line 9 (MO-1040 has no such line), so a WFTC-scoped name keeps it from
being mistaken for a real return line. Disambiguate the
mo_income_tax_before_refundable_credits label, which duplicated
mo_income_tax's "Missouri income tax", and add the #page=17 anchor to
the 4711_2021.pdf refundability citations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@MaxGhenis MaxGhenis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Merging under the cross-family dual-review protocol (Claude Fable 5 + GPT-5.6-sol, independent reviews, both merge-ok with no blocking findings).

Verified: RSMo 143.177.3 ordering language confirmed verbatim against revisor.mo.gov; the aggregate-unaffected claim proven against ordered_capped_state_non_refundable_credits (applied credit A = min(W, max(T−P, 0)) ⇒ aggregate min(A, max(T,0)) = A); all 19 changed YAML cases executed and passed; label dedup checked against metadata consumers. Nonblocking notes: the refundable-WFTC reform's taxsim_state_eitc umbrella still keys on baseline mo_wftc (predates this PR), and the partial-overlap case could additionally assert the aggregate path.

@MaxGhenis
MaxGhenis merged commit 082ee45 into main Aug 2, 2026
33 checks passed
@MaxGhenis
MaxGhenis deleted the fix-mo-wftc-ptc-cap branch August 2, 2026 17:50
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.

MO WFTC liability cap does not net out the property tax credit

2 participants