Skip to content

Apply Ohio's business income deduction and 3% business tax; add both deductions back in modified AGI - #9876

Merged
MaxGhenis merged 8 commits into
mainfrom
fix-oh-modified-agi-addbacks
Oct 9, 2026
Merged

MaxGhenis merged 8 commits into
mainfrom
fix-oh-modified-agi-addbacks

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Summary

oh_modified_agi equalled Ohio AGI. R.C. 5747.01(II) (effective March 5, 2026) defines modified AGI as "Ohio adjusted gross income plus any amount deducted under divisions (A)(28) and (34) of this section". The model never took either deduction, so the add-back alone would have changed nothing. In the modeled filer cases, MAGI came out numerically right while Ohio AGI and the tax were wrong. The dependent-gain interaction with #9939 needs the repair described below. This PR implements the deductions the definition refers to, and the tax structure that goes with them (closes #4056):

  • (A)(28) business income deduction. This is the 2024 Ohio Schedule of Business Income (1040 bundle PDF p. 5):

    • line 10: business income;
    • line 11: the lesser of line 10 and federal AGI, not below zero;
    • line 13: the lesser of line 11 and $250,000 ($125,000 married filing separately).

    It is entered on Schedule of Adjustments line 13.

  • Taxable business income and the 3% tax. These are R.C. 5747.02(A)(4) and schedule lines 14–16:

    • line 15 is the lesser of (line 11 − line 13) and IT 1040 line 5, so exemptions above nonbusiness income reduce taxable business income ((A)(4)(b));
    • line 16 is 3% of line 15.

    IT 1040 line 7 (taxable nonbusiness income) is line 5 − line 6. It goes through the graduated brackets (line 8a). The $26,050 no-tax threshold in (A)(3) applies to that nonbusiness balance only.

  • (A)(34) qualifying capital gain deduction, from 2026. R.C. 5747.79(B) allows the lesser of the qualifying capital gain or the deductible payroll. It is driven by two new person-level inputs and is zero unless they are set.

  • MAGI consumers. Personal exemptions now use MAGI, as R.C. 5747.025(A) and the 2024 instructions (p. 17) require; they used Ohio AGI. So does the exemption credit (R.C. 5747.022; "modified adjusted gross income less exemptions", 2024 instructions p. 29). The joint filing credit, senior, retirement, lump-sum and child care credits and the homestead exemption already read oh_modified_agi. The contrib dependent-exemption reform's baseline-mirroring schedule now reads MAGI too.

The deduction also flows to each spouse's Ohio AGI (oh_business_income_deduction_person), so it reaches joint filing credit qualifying income. The 2025 instructions (PDF p. 29) give the example: "Krysten has no qualifying income because her business income and taxable Social Security benefits were both deducted in calculating their Ohio AGI. Therefore, they are not entitled to the joint filing credit."

Tests

Expectations follow the Schedule of Business Income lines, IT 1040 lines 1–8c, the 2024 bracket table (instructions p. 18), the MAGI worksheet (p. 40) and the 2025 joint filing credit example. The original 12 new cases passed at f96ba752ae and failed on its main base (the 2025 and 2026 qualifying capital gain cases fail there because the variables do not exist):

  • pass-through income under the cap;
  • business income over the cap, taxed at 3%;
  • the $125,000 MFS cap;
  • loss netting (the 2024 instructions' Sam and Suzy example);
  • the federal AGI limit;
  • excess exemptions reducing taxable business income;
  • per-spouse allocation;
  • the Kevin and Krysten example;
  • MAGI-based exemptions;
  • the 2026 qualifying capital gain deduction, both before and after it takes effect;
  • a qualifying capital gain deducted from Ohio AGI is not excluded again from joint filing credit qualifying income (2026).

The whole oh/ folder ran at 01218d5 (test_batched --mode per-subdir --workers 1). Its only failures were the two TAXSIM cases below, now updated. Every test file changed since then was re-run on its own and passed at f96ba752ae. The fresh repair checks after reconciling current main are listed below. policy/contrib/states/oh (dependent exemption reforms, refundable EITC), policy/reform/oh_refundable_eitc.yaml, gov/states/tax/income/state_agi.yaml, code_health/test_non_refundable_credit_downstream_consumers.py and contrib/states/test_dependent_exemption_reform_activation.py pass.

Two TAXSIM-derived integration cases changed. TAXSIM35 gives 13,756.36 and 2,818.55, but it does not apply Ohio's business income deduction to the Schedule C income. With the deduction the values are 7,620.86 and 1,850.54. The form-line derivation is in each test's comment, and I checked it by hand against the 2021 brackets.

Independent review

Round 1 of an Opus review (Subfleet, read-only) recomputed every expectation and requested changes, all addressed in 35ee5d9:

  • from 2026, a deducted qualifying gain was excluded twice from joint filing credit qualifying income (fixed and tested);
  • the per-spouse split is now labelled a convention;
  • the per-entity rule is documented;
  • the nonbusiness sources are disclosed;
  • the TAXSIM-case comments now say model values.

Round 2 at 35ee5d9 found the code ready. It asked for the remaining results to be filled in here, and for two nits, which are fixed in f96ba75: the deducted gain is capped at reported capital gains inside the qualifying-income formula, and the 5747.79(A)(1) comment now quotes the statute.

Dependent qualifying gain accounting repair

The interaction with #9939 is fixed here: oh_qualifying_capital_gain_deduction
is zero for a dependent member of the filers' tax unit. R.C. 5747.79(A)(1), (B)
ties the deduction to the taxpayer's gain in federal AGI; R.C. 5747.01(II)
adds back actual deductions. This concerns the filers' return; it does not
disqualify a dependent taxpayer on their own separate return. The existing
filer-only business income deduction is preserved.

Two cases use actual dependent gain inputs and pin federal / Ohio / modified
AGI at 60,000 / 60,000 / 60,000 and, with simultaneous filer business and gain
deductions, 150,000 / 90,000 / 150,000. A Hypothesis differential test checks
single and joint tax units with one to three dependent children against twins
with the dependent business/gain inputs zeroed. Independent input-based sums
verify filer deduction caps and AGI accounting.

The new Python case covers generated-family and twin-comparison behavior
that YAML examples cannot exercise. It remains in the existing
rest-python-core group; no jobs or concurrent runner budget were added.
On this local macOS/Python 3.13.9/Core 3.32.15 environment it passed five
examples in 274.106 seconds including startup, with 1,244,135,424 bytes
(1.16 GiB) peak RSS; the pytest call took 29.06 seconds. The original
f96ba752ae Linux CI Core group took 461.44 seconds and peaked at
5,663,716 KiB (5.40 GiB); analogous five-example dependent properties took
8.41 and 8.73 seconds. The local standalone measurement is not an
incremental Linux group measurement; fresh-head CI resource results remain
pending.

Reconciled main with history-preserving merges bb9b46f47eb8 and
ec1637b5b413; the latest main verified during the repair is
7b956eb4014e3a189075c79f9b1f0a8f1d3b02ab. Repair commit:
e38e81a591aae7d5eddb85f586cf17d68afc3979.

Fresh targeted results, one foreground file at a time:

Check Actual result
Two actual dependent-gain cases before the mask Both failed: dependent deduction 80,000 instead of zero
oh_modified_agi.yaml on reconciled branch 5 passed; macOS time -l subsequently exited 1 because the sandbox denied sysctl
oh_business_income_deduction.yaml 7 passed, exit 0
test_oh_filer_deduction_invariants.py 1 passed, five generated examples, exit 0
oh_modified_agi.yaml with exact #9939 Ohio changes and helper 5 passed, exit 0
#9939 oh_deductions.yaml in that temporary combination 4 passed, exit 0
make format before every implementation/merge commit Passed; final worktree run left 6,734 files unchanged and lint passed

The full #9939 stack has unrelated MA/MN merge conflicts. The interaction
checks used its clean Ohio delta and exact person_non_dep_add helper,
then reversed both patches before committing. No #9939 changes or partner
contract expectations are included in the repair. #9939 remains stacked
on #9894, which must land first per its existing dependency.

A fresh independent read-only review approved exact repair head e38e81a591aae7d5eddb85f586cf17d68afc3979, with no unresolved P1/P2 within this assigned interaction. This code approval does not establish fresh CI or microsim readiness.

Fresh-head CI is required before readiness; historical green checks at
f96ba752ae do not establish the repair head is green. This bounded build
ran no whole folders, full suites, or microsims.

The existing Axiom queue is rulespec-us#1511. A local update draft supplies
the dependent accounting companion cases for the hub; no external issue was
posted by this repair. Source-ingestion and signed-encoder blockers remain.

Hub microsimulation impact (current head)

A real microsimulation on the default dataset, main at the merge base 7b956eb401 against this PR's head e38e81a591, for 2025 and 2026. The runs went one at a time under the shared heavy-job lock. Sums are weighted.

Output 2025 change 2026 change 2025 records changed (weighted) 2026 records changed (weighted)
oh_agi -45.21bn -47.15bn 353 (1,238,982) 353 (1,247,830)
oh_income_tax -1.20bn -1.10bn 275 (958,521) 276 (997,409)
state_income_tax -1.20bn -1.10bn 275 (958,521) 276 (997,409)
income_tax +0 +0 0 (0) 0 (0)
household_net_income +1.20bn +1.10bn 275 (958,521) 276 (997,409)
household_benefits +0 +0 0 (0) 0 (0)

Comparison files are in fixes/9876-impact/ on the hub host.

Microsim impact

The 2024 and 2026 main-versus-branch microsim comparisons remain hub-owned follow-up work. This bounded repair ran no microsims and did not verify the prior queue status; fresh results are still required.

Invariants

  • oh_business_income_deduction ≤ min(max(min(business income, federal AGI), 0), cap).
  • The per-person deductions sum to the unit deduction.
  • Taxable business income + taxable nonbusiness income = IT 1040 line 5 (oh_taxable_income) whenever line 5 is positive.
  • oh_modified_agi = oh_agi + business income deduction + qualifying capital gain deduction. The business and qualifying gain deductions on the filers' return are added back once. A dependent's business-sale gain contributes neither a deduction nor an addback to that return.

(checked on the microsim data when the runs finish)

Methodology note

  • What counts as business income. R.C. 5747.01(B) turns on facts the model cannot see (a trade or business, functional and transactional tests). The 2024 instructions (p. 11) say: "Generally, income recognized by a sole proprietorship or pass-through entity is business income. However, determining if income is business income is highly dependent upon the specific facts and circumstances."

    • Counted (new parameter business_income/sources): Schedule C (self_employment_income, sstb_self_employment_income), Schedule F (farm_operations_income), and partnership and S corporation income (partnership_s_corp_income).
    • Not counted: interest, dividends, capital gains, rents, royalties, trust income, Form 4797 gains (other_net_gain), and wages a 20%-or-more owner receives from a pass-through. The instructions treat these as business income only in a trade or business, or with ownership data the model lacks.

    This understates the deduction for landlords in the rental business and for owner-employees, and is right for passive investors.

  • Splitting a joint deduction between spouses. The joint $250,000 deduction is split between spouses in proportion to each spouse's positive business income. The statute deducts it from "the portion of an individual's federal adjusted gross income that is business income" but does not say how to divide a joint cap. This only matters for joint filing credit qualifying income.

  • Qualifying capital gain inputs. The deduction is the lesser of the qualifying gain and the deductible payroll, capped at the capital gains reported. It is computed for one entity; for sales in several entities, the variable must be set directly to the sum of the per-entity lesser amounts (5747.79(C)(2)).

  • Known gaps left for follow-ups. The lump-sum distribution credit tests MAGI rather than MAGI less exemptions, and us_govt_interest_person and interest_income are both excluded from joint filing credit qualifying income. Both predate this PR, and their formula code is unchanged. In combination with Leave dependents' own items out of DC, Delaware and Ohio subtractions #9939, removing the dependent qualifying-gain addback can change MAGI and therefore its downstream consumers.

  • The contrib reform. The dependent-exemption reform's own phase-out still reads Ohio AGI; only its baseline-mirroring schedule now reads MAGI.

  • Bracket precision. The two TAXSIM-derived integration values (7,620.86 and 1,850.54) carry the model's existing 2021 first-bracket approximation, about $0.09 above the printed bracket base. This PR does not change that.

  • Ordering of the two deductions. (A)(34) gains that are business income must be deducted before (A)(28). The model counts capital gains as nonbusiness, so the two never overlap.

axiom: R.C. 5747.02(A)(4) encoded-correct (us-oh/statutes/5747/02.yaml#individual_taxable_business_income_tax; companion "excess exemptions reduce individual taxable business income before three percent tax"); R.C. 5747.01(A)(28), (A)(34), (II), 5747.79, 5747.022, 5747.05(E) TheAxiomFoundation/rulespec-us#1511 queued

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 6, 2026 07:08
Ohio deducts the first $250,000 ($125,000 married filing separately) of
business income (R.C. 5747.01(A)(28)) and taxes the rest at a flat 3%
(R.C. 5747.02(A)(4)). The model taxed all business income at the graduated
rates. Modified AGI is Ohio AGI plus the (A)(28) deduction and, from 2026,
the (A)(34) qualifying capital gain deduction (R.C. 5747.01(II), 5747.79(B)).
Personal exemptions and the exemption credit now use modified AGI
(R.C. 5747.025, 5747.022).

Fixes #4056

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…GI in the dependent exemption reform

TAXSIM35 does not apply R.C. 5747.01(A)(28); the two 2021 integration cases
now carry the form-line derivation with the deduction. The contrib dependent
exemption reform's no-op schedule mirrors the baseline, which is stepped by
modified AGI (R.C. 5747.025).

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

- Joint filing credit qualifying income excludes capital gains only to the
  extent they are still in Ohio AGI; a gain deducted under R.C.
  5747.01(A)(34) is not excluded again (R.C. 5747.05(E)(1)). 2026 test.
- The qualifying capital gain deduction cannot exceed the capital gains
  reported, and its documentation states the per-entity rule of R.C.
  5747.79(C)(2).
- Label the per-spouse split of a joint business income deduction as a
  modeling convention; disclose farm rent, Form 4797 gains and 20%-owner
  compensation as nonbusiness; describe the TAXSIM cases' line 8a as model
  values; move the MAGI test out of business_income/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…come; quote 5747.79(A)(1)

A directly set multi-entity deduction above the capital gains reported can no
longer cancel the interest, dividend and rent exclusions.

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

codecov Bot commented Oct 6, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (3b846b7).
⚠️ Report is 320 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #9876    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            4        17    +13     
  Lines           76       245   +169     
  Branches         2         1     -1     
==========================================
+ Hits            76       245   +169     
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.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Interaction with #9939, which leaves a tax unit dependent's own items out of oh_deductions.

oh_qualifying_capital_gain_deduction is computed for every person, dependents included. Its gain cap reads capital_gains, which for a dependent is never in the filers' federal AGI (irs_gross_income).

  • This PR alone: a dependent's amount is deducted in oh_agi and added back in oh_modified_agi, so the two stay consistent, though both count the dependent.
  • With Leave dependents' own items out of DC, Delaware and Ohio subtractions #9939 merged: oh_deductions drops the dependent's amount, but oh_modified_agi (adds = ["oh_agi", "oh_business_income_deduction", "oh_qualifying_capital_gain_deduction"]) still adds back the tax unit's sum over every member. Modified AGI is then overstated by the dependent's deduction.

Suggested fix in this PR: zero oh_qualifying_capital_gain_deduction for dependents, as oh_business_income_person already does ("a dependent's income is on the dependent's own return"). Then both lines agree, whichever PR lands first. oh_business_income_deduction is fine, since it is built from the filers' business income.

Found by the independent review of #9939 (round 1, finding 4); I checked it against this branch's source.

Preserve current canonical changes through 7b956eb without rewriting
PR #9876 history. Ohio deduction formulas merge without conflicts.
Zero the qualifying capital gain deduction for dependent members whose
income is excluded from the filers' federal AGI, retaining the existing
filer gain/payroll limits and filer-only business deduction.

Pin federal, Ohio and modified AGI using actual dependent gain inputs.
Add a generated twin comparison for single/joint returns with dependents.

Addresses the PR #9876 interaction identified with #9939.
@MaxGhenis
MaxGhenis merged commit 9addef6 into main Oct 9, 2026
28 checks passed
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#9876 at 3b846b7e1a (branch updated from main; PR diff lines identical to the reviewed e38e81a591) (squash): Ohio business income deduction and 3% business tax.

  • Review: independent delta review APPROVE at this head (Subfleet; ~/reviews/us-hub/reviews-gen/us-9876/). The review's open gate, a missing current impact, is now filled in the body.
  • Gates checked live at merge:
    • gh pr checks exits 0;
    • the latest Pull request run at the head concluded success;
    • MERGEABLE;
    • not a draft;
    • no CHANGES_REQUESTED review;
    • the semantic-overlap guard;
    • head pinned.
  • Impact: a hub microsim on the default dataset, the merge base against this head; the table is in the body. Ohio income tax falls $1.20bn (2025) and $1.10bn (2026), and Ohio AGI falls $45.2bn and $47.1bn. This is a bug fix correcting the model to R.C. 5747.01 and 5747.79, merged at any aggregate size under Max's standing rule.
  • --admin: used only because a required approving review is the sole block.

@MaxGhenis
MaxGhenis deleted the fix-oh-modified-agi-addbacks branch October 9, 2026 03:52
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.

Ohio business income deduction

1 participant