Add discrete per-filing-status AGI schedule to MD/OH dependent exemption contrib#8800
Conversation
…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>
PolicyEngine Review: PR #8800RecommendationCOMMENT / 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. FindingsNo code findings requiring changes. CI Note
Scope ReviewedPR #8800 adds first-class contrib schedules for Maryland and Ohio dependent exemption reforms:
Fresh worktree: Regulatory And Source ReviewMaryland:
Ohio:
PDF artifacts:
Code ReviewMaryland:
Ohio:
No vectorization, aggregation, period, or code-organization defect found. Test ReviewChanged tests cover:
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.yamlResult: Report Files
|
Resolves #8799.
Problem
The dashboard drives most states' dependent exemption through the
gov.contrib.states.{st}.dependent_exemptioncontrib (us#8696). That contrib offers a flatamount(or-1sentinel reading baseline), a single linear phase-out, andage_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
schedulesub-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):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).schedule/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
schedulerather than the baseline params. Defaults equal baseline, so:-1amountsentinel remains a no-op at default (verified by the existing no-op tests),amountstill overrides the schedule,phaseoutstill applies on top.Tests
Added to each state's contrib reform test file:
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