Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Ohio: `oh_eitc` is applied before the credits that R.C. 5747.98 and the Schedule of Credits place ahead of it

Open
#9,921 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 2 days

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
52/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
python, yaml
Domain
backend

Research direction

Start with policyengine_us/parameters/gov/states/oh/tax/income/credits/non_refundable.yaml and compare its Ohio credit ordering with the cited R.C. 5747.98 and Schedule of Credits. Then read tests/policy/baseline/gov/states/oh/tax/income/credits/oh_non_refundable_credit_order.yaml and add the described household case. Done means the parameter ordering and tests reflect the stated statutory order and expected credit amounts.

Written by the indexing model from the issue text.

Description

Found by the policyengine-scorecard reform-validation diagnosis (batch 2), PolicyEngine/policyengine-scorecard#146. Memo: diagnosis/batch2/D.md, item D4.
Related: #7984 (merged; introduced ordered per-credit application).

What the engine does (main @ 6b80a8e = 2.2.1 for these files)

policyengine_us/parameters/gov/states/oh/tax/income/credits/non_refundable.yaml:2-19

values:
  2021-01-01:
    - oh_adoption_credit
    - oh_eitc
    - oh_cdcc
    - oh_senior_citizen_credit
    - oh_retirement_credit
    - oh_non_public_school_credits
    - oh_exemption_credit
    - oh_joint_filing_credit
  2023-01-01:
    - oh_eitc
    - oh_cdcc
    - oh_senior_citizen_credit
    - oh_retirement_credit
    - oh_non_public_school_credits
    - oh_exemption_credit
    - oh_joint_filing_credit

oh_eitc (variables/gov/states/oh/tax/income/credits/oh_eitc.py:19-30) is capped by applied_state_non_refundable_credit, which subtracts only the credits listed before it (variables/gov/states/tax/income/non_refundable_credit_cap.py:31-43). With oh_eitc first, nothing precedes it. The joint filing credit base ("line 11") is liability minus the applied CDCC, senior, retirement and exemption credits (variables/gov/states/oh/tax/income/credits/joint_filing_credit/oh_tax_before_joint_filing_credit.py:18-23; parameters/gov/states/oh/tax/income/credits/joint_filing/other_non_refundable_credits.yaml:3-7), and those are already reduced by the EITC.

The existing test tests/policy/baseline/gov/states/oh/tax/income/credits/oh_non_refundable_credit_order.yaml ("Applied non-refundable credits follow filing order") encodes the EITC-first order (oh_eitc: 80, oh_cdcc: 20 on $100 of liability), so it would need to change.

What the law and form say

R.C. 5747.71 (codes.ohio.gov; effective July 3, 2019):
"There is hereby allowed a nonrefundable credit against a taxpayer's aggregate tax liability under section 5747.02 of the Revised Code for a taxpayer who is an "eligible individual" as defined in section 32 of the Internal Revenue Code. The credit shall equal thirty per cent of the federal credit allowed for the taxable year. The credit shall not exceed the aggregate amount of tax otherwise due under section 5747.02 of the Revised Code after deducting any other nonrefundable credits that precede the credit allowed under this section in the order prescribed by section 5747.98 of the Revised Code."

R.C. 5747.98(A), version effective October 3, 2023 (H.B. 33), in force for TY2024, first eight items:
"(A) To provide a uniform procedure for calculating a taxpayer's aggregate tax liability under section 5747.02 of the Revised Code, a taxpayer shall claim any credits to which the taxpayer is entitled in the following order:
Either the retirement income credit under division (B) of section 5747.055 of the Revised Code or the lump sum retirement income credits under divisions (C), (D), and (E) of that section;
Either the senior citizen credit under division (F) of section 5747.055 of the Revised Code or the lump sum distribution credit under division (G) of that section;
The dependent care credit under section 5747.054 of the Revised Code;
The credit for displaced workers who pay for job training under section 5747.27 of the Revised Code;
The campaign contribution credit under section 5747.29 of the Revised Code;
The twenty-dollar personal exemption credit under section 5747.022 of the Revised Code;
The joint filing credit under division (G) of section 5747.05 of the Revised Code;
The earned income credit under section 5747.71 of the Revised Code;"

The September 30, 2021, March 23, 2022 and September 30, 2025 versions list the same eight credits in the same order (the 2025 version drops the campaign contribution credit and cites division (E) for the joint filing credit). In the 2021 and 2022 versions the adoption credit (5747.37) comes after the nonchartered nonpublic school tuition credit, not first.

2024 Ohio Schedule of Credits (2024 Ohio IT 1040 bundle, PDF p. 7), Nonrefundable Credits [dot leaders removed]:
" 1. Tax liability before credits (from Ohio IT 1040, line 8c)
2. Retirement income credit (include 1099-R forms)
3. Lump sum retirement credit (include a copy of the worksheet and 1099-R forms)
4. Senior citizen credit (must be 65 or older to claim this credit)
5. Lump sum distribution credit (include a copy of the worksheet and 1099-R forms).
6. Child care & dependent care credit (include a copy of the worksheet)
7. Displaced worker training credit (include a copy of the worksheet and all required documentation).
8. Campaign contribution credit for Ohio statewide office or General Assembly
9. Exemption credit
10. Total (add lines 2 through 9)
11. Tax less credits (line 1 minus line 10; if negative, enter zero).
12. Joint filing credit (see instructions for table). % times line 11, up to $650
13. Earned income credit"

2024 Ohio IT 1040 instructions (PDF p. 30), "Line 13 – Earned Income Credit": "Your nonrefundable Ohio earned income credit (EIC) equals 30% of your federal EIC (federal 1040 and 1040-SR, line 27). See R.C. 5747.71."

Example (policyengine-us 2.2.1, TY2024, Ohio, married filing jointly, wages $30,000 + $6,000, children 4 and 2, child care $4,000)

Engine values: tax before nonrefundable credits $370.32; oh_eitc_potential $1,686.18; oh_cdcc_potential $170.00; oh_exemption_credit_potential $80.00; joint filing rate 15% (the rate the engine applies to this household).

Line Schedule of Credits order (hand computed) Engine today
1 Tax before credits 370.32 370.32
6 CDCC 170.00 0.00
9 Exemption credit 80.00 0.00
11 Tax less credits 120.32 370.32 (oh_tax_before_joint_filing_credit)
12 Joint filing credit (15% of line 11) 18.05 0.00
13 EITC (capped at 120.32 - 18.05) 102.27 370.32
Ohio income tax 0.00 0.00

Reordering the parameter list to the statutory order reproduces the hand-computed column exactly.

Impact

  • Total Ohio income tax: unchanged in every case traced. The ordered aggregate (oh_non_refundable_credits) is still capped at liability, so the total of applied credits is min(sum, liability) in either order. (Reasoning plus three household checks; not proven for every input.)
  • Changed: the applied amounts of oh_eitc, oh_cdcc, oh_exemption_credit, oh_joint_filing_credit, oh_retirement_credit and oh_senior_citizen_credit, and anything that reads them, including the state_eitc aggregates (parameters/gov/states/household/state_eitcs.yaml lists oh_eitc).
  • Validation (certified bundle us-6.2.1): PE's 2024 oh_eitc total is $108.9M. Applying it after the preceding credits in the form order gives $95.9M (first order), so the ordering explains $13.0M of the gap to the scorecard's Ohio benchmark row ($59.3M, an ODT estimate the registry labels approximation; we did not re-extract that document).

Proposed change

For 2021-01-01 and 2023-01-01, reorder gov.states.oh.tax.income.credits.non_refundable to R.C. 5747.98: oh_retirement_credit, oh_senior_citizen_credit, oh_cdcc, oh_exemption_credit, oh_joint_filing_credit, oh_eitc, oh_non_public_school_credits, then oh_adoption_credit for 2021-2022. Update oh_non_refundable_credit_order.yaml, and add the household above as a test (expected values from the Schedule of Credits arithmetic).

Dominant language
Python
Stars
168
Forks
216
Avg merge
3d 11h
Merged PRs (30d)
337

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from PolicyEngine/policyengine-us

All issues in PolicyEngine/policyengine-us

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.