Skip to content

Add discrete per-filing-status AGI schedule to MD/OH dependent exemption contrib#8800

Merged
DTrim99 merged 1 commit into
PolicyEngine:mainfrom
DTrim99:md-oh-dependent-exemption-schedule
Jul 1, 2026
Merged

Add discrete per-filing-status AGI schedule to MD/OH dependent exemption contrib#8800
DTrim99 merged 1 commit into
PolicyEngine:mainfrom
DTrim99:md-oh-dependent-exemption-schedule

Conversation

@DTrim99

@DTrim99 DTrim99 commented Jun 30, 2026

Copy link
Copy Markdown
Collaborator

Resolves #8799.

Problem

The dashboard drives most states' dependent exemption through the gov.contrib.states.{st}.dependent_exemption contrib (us#8696). That contrib offers a flat amount (or -1 sentinel reading baseline), a single linear phase-out, and age_limit — which fits RI cleanly. MD and OH don't fit, because their dependent exemption is a discrete, income-stepped, per-filing-status schedule, so consumers had to reach into baseline brackets instead.

Change

Give MD and OH a first-class schedule sub-tree in their contrib, mirroring the baseline, so the discrete step-down is adjustable entirely through the contrib (aligned with the rest of the us#8696 family):

  • MD — per-filing-status bracket params schedule/{single,separate,joint,head,surviving_spouse}.yaml, mirroring the baseline §10-211 AGI step-down ($3,200 → $1,600 → $800 → $0 with filing-status-specific cutoffs).
  • OHschedule/amount.yaml, a MAGI-stepped bracket param mirroring the baseline §5747.025 schedule ($2,400 → $2,150 → $1,900 → $0).

The reform's dependent-exemption maximum now reads the stepped per-dependent amount from the contrib schedule rather than the baseline params. Defaults equal baseline, so:

  • the -1 amount sentinel remains a no-op at default (verified by the existing no-op tests),
  • a non-negative flat amount still overrides the schedule,
  • the linear phaseout still applies on top.

Tests

Added to each state's contrib reform test file:

  • default schedule reproduces the AGI/MAGI step-down — a higher-income unit lands on a lower step purely through the contrib (MD single AGI 130k → $800/exemption; OH MAGI 50k → $2,150/exemption).
  • schedule per-dependent amount is adjustable — overriding schedule.single[0].amount (MD) / schedule.amount[0].amount (OH) changes only the dependent portion, leaving the baseline personal portion intact.

All existing no-op / flat-amount / phase-out / age-limit cases are unchanged.

🤖 Generated with Claude Code

…ion contrib

Resolves PolicyEngine#8799. MD's and OH's dependent exemption is a discrete, income-stepped,
per-filing-status schedule that the us#8696 contrib reform could only approximate
with a flat amount plus a single linear phase-out. Add a first-class `schedule`
sub-tree to each state's `gov.contrib.states.{st}.dependent_exemption` contrib:

- MD: per-filing-status bracket params (single/separate/joint/head/
  surviving_spouse), mirroring the baseline §10-211 AGI step-down.
- OH: a single MAGI-stepped bracket param mirroring the baseline §5747.025
  schedule.

The reform's dependent-exemption maximum now reads the stepped per-dependent
amount from the contrib schedule instead of the baseline params. Defaults mirror
baseline, so the `-1` amount sentinel remains a no-op; a non-negative flat
`amount` still overrides the schedule. This lets the Child Poverty Impact
Dashboard drive MD/OH through the same contrib mechanism as RI and the rest of
the family, rather than reaching into baseline brackets.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@DTrim99 DTrim99 marked this pull request as ready for review July 1, 2026 14:30
@DTrim99 DTrim99 requested a review from daphnehanse11 July 1, 2026 14:31
@daphnehanse11

Copy link
Copy Markdown
Collaborator

PolicyEngine Review: PR #8800

Recommendation

COMMENT / rerun Quick Feedback before merge.

I found no code, source-value, reference, or test-coverage defects in the PR itself. The only blocking status is the red Quick Feedback check, whose log shows a GitHub runner shutdown/cancellation rather than a test assertion failure. Full suite, lint, changelog, and metadata checks passed.

Findings

No code findings requiring changes.

CI Note

  • Quick Feedback (Selective Tests + Coverage) is red.
  • Log evidence: selective tests started, collected 26 items, printed Maryland pass dots and Ohio pass dots, then reported: runner received a shutdown signal / operation was canceled.
  • Local targeted run of the two changed contrib test files reached: 26 passed, 1 warning in 215.09s (0:03:35).
  • Required action before merge: rerun Quick Feedback so the PR has a green required check.

Scope Reviewed

PR #8800 adds first-class contrib schedules for Maryland and Ohio dependent exemption reforms:

  • Maryland: gov.contrib.states.md.dependent_exemption.schedule.{single,separate,joint,head,surviving_spouse}.
  • Ohio: gov.contrib.states.oh.dependent_exemption.schedule.amount.
  • Reform logic now uses those contrib schedules when amount remains the negative sentinel, while flat non-negative amount overrides still work.
  • Tests add default schedule and schedule override scenarios for both states.

Fresh worktree: /tmp/policyengine-us-pr-8800-review at 68f292dc8bb6e98897c2affbc8dda53268db29ec.

Regulatory And Source Review

Maryland:

  • Official 2025 Resident Instruction Booklet, file page 12, Exemption Amount Chart (10A), supports:
    • single/separate: $3,200 up to $100,000; $1,600 over $100,000 through $125,000; $800 over $125,000 through $150,000; $0 above $150,000.
    • joint/head/surviving spouse: $3,200 up to $150,000; $1,600 over $150,000 through $175,000; $800 over $175,000 through $200,000; $0 above $200,000.
  • PR Maryland schedules match these values and use right=True, consistent with baseline md_personal_exemption and the source's "over / but not over" boundaries.

Ohio:

  • Official 2025 IT 1040 booklet, file page 17, supports:
    • $40,000 or less -> $2,400;
    • $40,001-$80,000 -> $2,150;
    • $80,001-$749,999 -> $1,900;
    • $750,000 or greater -> $0.
  • PR Ohio schedule matches the baseline schedule and the 2025 booklet. The 2026 $500,000 cutoff follows Ohio Rev. Code 5747.025.

PDF artifacts:

  • /tmp/pr-8800-review-pdf-md.pdf
  • /tmp/pr-8800-review-pdf-md-page12.txt
  • /tmp/pr-8800-review-pdf-md-page12-layout.txt
  • /tmp/pr-8800-review-pdf-md-page12.png
  • /tmp/pr-8800-review-pdf-oh.pdf
  • /tmp/pr-8800-review-pdf-oh-page17.txt
  • /tmp/pr-8800-review-pdf-oh-page17-layout.txt
  • /tmp/pr-8800-review-pdf-oh-page17.png

Code Review

Maryland:

  • The new filing-status dispatch mirrors baseline md_personal_exemption.
  • adjusted_gross_income is the same AGI measure used by baseline Maryland schedule logic.
  • Legal values are parameterized; no new hard-coded legal amounts in formulas.
  • The negative amount sentinel remains a no-op by default because the contrib schedule mirrors baseline.

Ohio:

  • oh_dependent_exemption_maximum uses p.schedule.amount.calc(agi), matching baseline Ohio schedule behavior.
  • oh_agi is consistent with baseline oh_personal_exemptions.
  • Flat amount override behavior is preserved.

No vectorization, aggregation, period, or code-organization defect found.

Test Review

Changed tests cover:

  • default schedule reproducing the AGI/MAGI step-down for Maryland and Ohio;
  • schedule override changing only the dependent portion;
  • existing no-op, flat override, phaseout, age-limit, and downstream-flow cases remain.

Local command:

uv run python -m policyengine_core.scripts.policyengine_command test -c policyengine_us policyengine_us/tests/policy/contrib/states/md/dependent_exemption_reform_test.yaml policyengine_us/tests/policy/contrib/states/oh/dependent_exemption_reform_test.yaml

Result: 26 passed, 1 warning in 215.09s (0:03:35). The process then hung in pytest cleanup (gc.collect()); I interrupted after the pass summary was emitted.

Report Files

  • /tmp/pr-8800-review-context.md
  • /tmp/pr-8800-review-pdf-manifest.md
  • /tmp/pr-8800-review-regulatory.md
  • /tmp/pr-8800-review-references.md
  • /tmp/pr-8800-review-code.md
  • /tmp/pr-8800-review-tests.md
  • /tmp/pr-8800-review-pdf-schedules.md
  • /tmp/pr-8800-review-pages.md

@DTrim99 DTrim99 merged commit 51d61ea into PolicyEngine:main Jul 1, 2026
52 of 54 checks passed
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.

MD/OH dependent-exemption contrib reforms can't represent the discrete per-filing-status AGI schedule

2 participants