Skip to content

Order the residential clean energy credit after the CTC, following Schedule 8812 Credit Limit Worksheets A and B - #9742

Open
MaxGhenis wants to merge 2 commits into
mainfrom
ctc-limit-worksheet-a-credits
Open

MaxGhenis wants to merge 2 commits into
mainfrom
ctc-limit-worksheet-a-credits

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Summary

The Child Tax Credit's tax-liability limit (ctc_limiting_tax_liability) subtracted every other non-refundable credit, including the residential clean energy credit (Schedule 3, line 5a), and PolicyEngine ordered that credit before the CTC, the energy efficient home improvement credit, the elderly or disabled credit and the clean vehicle credits. The law orders it last. This PR follows Schedule 8812 Credit Limit Worksheets A and B and the Form 5695 credit limit worksheet:

  • Worksheet A, line 2 is a new parameter, gov.irs.credits.ctc_tax_liability_limit.preceding_credits: Schedule 3, lines 1, 2, 3, 4, 5b, 6d, 6f and 6m (6l is not modeled). It replaces filtering the aggregate non_refundable list. Line 3 is the new variable ctc_tax_liability_after_preceding_credits.
  • Worksheet A, line 4 / Worksheet B, line 15: subsequent_credits (the residential clean energy credit; the adoption, mortgage interest and DC homebuyer credits also belong there but are not modeled) reduces the limit only when Worksheet B applies (ctc_credit_limit_worksheet_b_applies: a CTC-qualifying child, no Form 2555, CTC not fully refundable; 26 U.S.C. 24(d)(3) bars the refundable CTC for Form 2555 filers).
  • Worksheet B, line 14 is ctc_non_refundable_minimum, the CTC that cannot be refunded whatever the liability.
  • Form 5695, line 14 worksheet: residential_clean_energy_credit_credit_limit now subtracts every other non-refundable credit and the CTC on Form 1040, line 19 (or Worksheet B, line 14 when Worksheet B applies).
  • The energy efficient home improvement, elderly or disabled, and new and used clean vehicle credits no longer list the residential clean energy credit as a preceding credit (Form 5695 line 31 worksheet, Schedule R credit limit worksheet, Form 8936 lines 11 and 16). Without this the new 25D limit would form a cycle.
  • Colorado's 2022–2023 federal CTC replica (DR 0104CN lines 4–6) now reads Worksheet A line 3, which is what the form reproduces (it has no Worksheet B).
  • tools/pinned_tbs.py (Alabama's 2020-IRC recompute), the CRFB Social Security credit reform and the AFA reform update the new lists so their credits keep their order.

Why not just drop the residential clean energy credit from the limit

Only subtracting the Worksheet A line 2 credits would be wrong for most claimants. Worksheet B line 15 puts the residential clean energy credit back on Worksheet A line 4 whenever the filer has a qualifying child. That is how the IRS carries out 26 U.S.C. 24(d)(1)(B), which refunds the CTC by "the amount by which the aggregate amount of credits allowed by this subpart ... would increase" if the 26(a) limit rose. The aggregate includes the residential clean energy credit, so that credit displaces the non-refundable CTC into the refundable part. For a married couple with two children, $60,000 of wages and $10,000 of solar spending in 2025, a line-2-only limit gives an ACTC of $1,457. The worksheets and the statute give $3,400.

Sources (read for this PR)

  • 2025 Instructions for Schedule 8812, Credit Limit Worksheet A (p. 4): line 2 adds Schedule 3 lines 1, 2, 3, 4, 5b, 6d, 6f, 6l and 6m; line 4 is "the amount from Credit Limit Worksheet B" when the filer claims Form 8396, 8839, 5695 Part I or 8859, does not file Form 2555, and line 4 of Schedule 8812 is more than zero.
  • Credit Limit Worksheet B (pp. 5–6): line 14 is line 1 less line 13 (the lesser of $1,700 per child and the phase-in amount); line 15 is Schedule 3 lines 5a, 6c, 6g and 6h, "Enter this amount on line 4 of Credit Limit Worksheet A."
  • 2025 Instructions for Form 5695, Residential Clean Energy Credit Limit Worksheet (p. 5): line 2 includes the CTC/ODC from Form 1040 line 19, with the footnote to use "Credit Limit Worksheet B, line 14, instead" when Schedule 8812 directs the filer to Worksheet B.
  • The same structure appears in the 2022–2024 Schedule 8812 instructions and in Publication 972 (2013, 2020: "Line 11 Worksheet").
  • 26 U.S.C. 25D(c): the limit is "the limitation imposed by section 26(a) for such taxable year reduced by the sum of the credits allowable under this subpart (other than this section)". 23(c)(1) excepts "this section and section 25D", and 25(e)(1)(C) excepts "this section and sections 23 and 25D", so 25D comes last.
  • 26 U.S.C. 24(d)(1)'s concluding sentence: the refundable amount "shall reduce the amount of credit otherwise allowable under subsection (a) without regard to section 26(a)."

Effect

Households. For filers whose liability binds, the reported residential clean energy credit falls to its legal amount (the rest is a carryforward, which the model does not track). The CTC limit, Colorado's 2022–2023 replica, and the split between the credits that share the liability all change. For filers with a credit for other dependents but no qualifying child, the CTC limit no longer subtracts the residential clean energy credit.

Total income tax is unchanged for standard-deduction filers. Before this PR, the over-wide residential clean energy credit and the aggregate cap in income_tax_unavailable_non_refundable_credits produced the same totals as the statute. test_ctc_credit_limit_worksheets.py checks the new code against a direct encoding of 24(d)(1), 25D(c) and 26(a) on a 720-household grid and on Hypothesis-generated households.

Known interaction. ctc_tax_liability_after_preceding_credits still uses liability with SALT removed (the no-SALT branch, moved here unchanged from ctc_limiting_tax_liability). For a SALT itemizer who claims the residential clean energy credit with a qualifying child, the old over-wide credit partly offset that inflated liability. Now these filers get the same understated ACTC that #9741 and #9649 fix for every SALT itemizer. Either fix, applied to the new line-3 variable, removes it.

Microsimulation (real runs, no scaling). main (087664b) against this branch, compared per tax unit and per household:

Dataset Year Tax units Units with any change Change in federal income tax Change in household net income
populace_us_2024 (pinned default) 2025 79,729 (164.2M weighted) 0 $0.00 $0.00
populace_us_2024 (pinned default) 2026 79,729 (165.4M weighted) 0 $0.00 $0.00
small_enhanced_cps_2024 2025 814 0 $0.00 $0.00

No value changes in any of the compared variables: income_tax, income_tax_before_credits, ctc, refundable_ctc, non_refundable_ctc, ctc_limiting_tax_liability, ctc_value, the residential clean energy credit and its potential, the energy efficient home improvement, elderly or disabled, and new and used clean vehicle credits, the capped and uncapped non-refundable totals, state_income_tax, co_ctc, ok_federal_ctc, ny_ctc and household_net_income.

The reason is in the data: residential_clean_energy_credit_potential is zero for every tax unit, because neither dataset carries residential clean energy or home improvement spending, clean vehicle purchases or a foreign earned income exclusion. On the full enhanced_cps_2024 file, the main run (55,264 tax units) shows the same zeros; the branch run on that file did not finish (the host ran out of memory and the run was stopped), so the Enhanced CPS before/after is on the small sample only. Peak memory on that sample was 2.07 GB on main and 2.09 GB on this branch.

So this PR changes household calculations for filers who enter those inputs. It does not move any aggregate the model publishes from these datasets.

Invariants (tested)

  • Worksheet A: 0 ≤ line 5 ≤ line 3 ≤ max(0, income tax before credits); line 5 = line 3 − residential clean energy credit when Worksheet B applies, otherwise line 3.
  • Statute differential: refundable_ctc, residential_clean_energy_credit and income_tax_capped_non_refundable_credits equal 24(d)(1)(B) (increase in the aggregate subpart A credits), 25D(c) (last) and 26(a), applied directly.
  • Bounds: the residential clean energy credit ≤ its potential and its limit; refundable CTC ≤ min(per-child cap, CTC, phase-in); non-refundable credits ≤ income tax before credits.
  • Monotonicity: more residential clean energy spending never raises income tax net of the refundable CTC.

Tests

  • New YAML: ctc_tax_liability_after_preceding_credits, ctc_credit_limit_worksheet_b_applies, ctc_non_refundable_minimum, residential_clean_energy_credit_credit_limit, two new ctc_limiting_tax_liability cases, a Colorado case, and five hand-worked 2025 integration cases in ctc/credit_limit_worksheets_integration.yaml, including the residential clean energy claimant whose CTC is limited.
  • New Python: test_ctc_credit_limit_worksheets.py (grid differential, two Hypothesis properties). This adds hypothesis to the dev extra, as Compute the CTC tax-liability limit from actual liability (fixes request-order dependence) #9649 does.

Related

axiom: TheAxiomFoundation/rulespec-us#1426 queued (us:statutes/26/24/d, us:statutes/26/25D, us:statutes/26/26; 25D companion cases added there)

🤖 Generated with Claude Code

…2 Credit Limit Worksheets A and B)

The CTC's tax-liability limit subtracted every other non-refundable credit,
and the residential clean energy credit (26 U.S.C. 25D) was ordered before
the CTC and before the 25C, elderly and clean vehicle credits. Section 25D(c)
orders it last. Follow the IRS worksheets:

- Credit Limit Worksheet A line 2 is a parameter
  (gov.irs.credits.ctc_tax_liability_limit.preceding_credits); line 3 is the
  new ctc_tax_liability_after_preceding_credits.
- Worksheet A line 4 / Worksheet B line 15 (subsequent_credits) reduces the
  limit only when Worksheet B applies (ctc_credit_limit_worksheet_b_applies).
- Worksheet B line 14 is ctc_non_refundable_minimum, the CTC that precedes the
  residential clean energy credit on the Form 5695 line 14 worksheet.
- The residential clean energy credit's limit subtracts every other credit;
  the 25C, elderly and clean vehicle lists no longer subtract it.
- Colorado's 2022-2023 replica reads Worksheet A line 3 (DR 0104CN 4-6).
- The Alabama 2020-IRC pin, CRFB and AFA reforms update the new lists.

Adds YAML tests (hand-worked 2025 households) and a statutory differential
plus Hypothesis property tests; adds hypothesis to the dev extra.

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

The section 911 exclusion bar was added as 24(d)(5) and redesignated (d)(3)
by Pub. L. 115-141; Cornell LII has no #d_5 anchor.

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.

1 participant