diff --git a/changelog.d/il-hbwd-premium-band-edges.fixed.md b/changelog.d/il-hbwd-premium-band-edges.fixed.md new file mode 100644 index 00000000000..1102a687b4b --- /dev/null +++ b/changelog.d/il-hbwd-premium-band-edges.fixed.md @@ -0,0 +1 @@ +Key the Illinois Health Benefits for Workers with Disabilities premium bands at the chart's band starts, so income of exactly $250, $500 and so on pays the lower band's premium. diff --git a/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/earned.yaml b/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/earned.yaml index 0d71a038a63..8ceb71a31d4 100644 --- a/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/earned.yaml +++ b/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/earned.yaml @@ -6,91 +6,98 @@ metadata: period: month label: Illinois HBWD earned income premium component reference: - # Illinois presents the table as a matrix, but the values can be summed between row 1 and column 1. - - title: 89 Ill. Admin. Code § 120.510 (n) + # Summing the first column (earned) and first row (unearned) reproduces 434 of the 441 + # cells in 120.510(n)(3); see issue 10471 for the others. + # Thresholds are the chart's band starts (0-250, 251-500, ..., 4751-5000, 5000+), so income of + # exactly $250 stays in the first band; $5,000 falls in the 4751-5000 band. + # Bands start at whole dollars, so income with cents stays in the band of its whole-dollar + # amount, as IDHS PM 15-04-03 drops cents. + - title: 89 Ill. Admin. Code § 120.510(n)(3) href: https://www.law.cornell.edu/regulations/illinois/Ill-Admin-Code-tit-89-SS-120.510 + - title: Illinois HFS, Health Benefits for Workers with Disabilities Premium Chart + href: https://hfs.illinois.gov/content/dam/soi/en/web/hfs/medicalprograms/hbwd/documents/hfsweb004.pdf brackets: - threshold: 2022-04-01: 0 amount: 2022-04-01: 0 - threshold: - 2022-04-01: 250 + 2022-04-01: 251 amount: 2022-04-01: 6 - threshold: - 2022-04-01: 500 + 2022-04-01: 501 amount: 2022-04-01: 13 - threshold: - 2022-04-01: 750 + 2022-04-01: 751 amount: 2022-04-01: 19 - threshold: - 2022-04-01: 1_000 + 2022-04-01: 1_001 amount: 2022-04-01: 25 - threshold: - 2022-04-01: 1_250 + 2022-04-01: 1_251 amount: 2022-04-01: 31 - threshold: - 2022-04-01: 1_500 + 2022-04-01: 1_501 amount: 2022-04-01: 38 - threshold: - 2022-04-01: 1_750 + 2022-04-01: 1_751 amount: 2022-04-01: 44 - threshold: - 2022-04-01: 2_000 + 2022-04-01: 2_001 amount: 2022-04-01: 50 - threshold: - 2022-04-01: 2_250 + 2022-04-01: 2_251 amount: 2022-04-01: 56 - threshold: - 2022-04-01: 2_500 + 2022-04-01: 2_501 amount: 2022-04-01: 63 - threshold: - 2022-04-01: 2_750 + 2022-04-01: 2_751 amount: 2022-04-01: 69 - threshold: - 2022-04-01: 3_000 + 2022-04-01: 3_001 amount: 2022-04-01: 75 - threshold: - 2022-04-01: 3_250 + 2022-04-01: 3_251 amount: 2022-04-01: 81 - threshold: - 2022-04-01: 3_500 + 2022-04-01: 3_501 amount: 2022-04-01: 88 - threshold: - 2022-04-01: 3_750 + 2022-04-01: 3_751 amount: 2022-04-01: 94 - threshold: - 2022-04-01: 4_000 + 2022-04-01: 4_001 amount: 2022-04-01: 100 - threshold: - 2022-04-01: 4_250 + 2022-04-01: 4_251 amount: 2022-04-01: 106 - threshold: - 2022-04-01: 4_500 + 2022-04-01: 4_501 amount: 2022-04-01: 113 - threshold: - 2022-04-01: 4_750 + 2022-04-01: 4_751 amount: 2022-04-01: 119 - threshold: - 2022-04-01: 5_000 + 2022-04-01: 5_001 amount: 2022-04-01: 125 diff --git a/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/unearned.yaml b/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/unearned.yaml index e62138f1811..ce20aaa5162 100644 --- a/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/unearned.yaml +++ b/policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/unearned.yaml @@ -6,91 +6,98 @@ metadata: period: month label: Illinois HBWD unearned income premium component reference: - # Illinois presents the table as a matrix, but the values can be summed between row 1 and column 1. - - title: 89 Ill. Admin. Code § 120.510 (n) + # Summing the first column (earned) and first row (unearned) reproduces 434 of the 441 + # cells in 120.510(n)(3); see issue 10471 for the others. + # Thresholds are the chart's band starts (0-250, 251-500, ..., 4751-5000, 5000+), so income of + # exactly $250 stays in the first band; $5,000 falls in the 4751-5000 band. + # Bands start at whole dollars, so income with cents stays in the band of its whole-dollar + # amount, as IDHS PM 15-04-03 drops cents. + - title: 89 Ill. Admin. Code § 120.510(n)(3) href: https://www.law.cornell.edu/regulations/illinois/Ill-Admin-Code-tit-89-SS-120.510 + - title: Illinois HFS, Health Benefits for Workers with Disabilities Premium Chart + href: https://hfs.illinois.gov/content/dam/soi/en/web/hfs/medicalprograms/hbwd/documents/hfsweb004.pdf brackets: - threshold: 2022-04-01: 0 amount: 2022-04-01: 0 - threshold: - 2022-04-01: 250 + 2022-04-01: 251 amount: 2022-04-01: 19 - threshold: - 2022-04-01: 500 + 2022-04-01: 501 amount: 2022-04-01: 38 - threshold: - 2022-04-01: 750 + 2022-04-01: 751 amount: 2022-04-01: 56 - threshold: - 2022-04-01: 1_000 + 2022-04-01: 1_001 amount: 2022-04-01: 75 - threshold: - 2022-04-01: 1_250 + 2022-04-01: 1_251 amount: 2022-04-01: 94 - threshold: - 2022-04-01: 1_500 + 2022-04-01: 1_501 amount: 2022-04-01: 113 - threshold: - 2022-04-01: 1_750 + 2022-04-01: 1_751 amount: 2022-04-01: 131 - threshold: - 2022-04-01: 2_000 + 2022-04-01: 2_001 amount: 2022-04-01: 150 - threshold: - 2022-04-01: 2_250 + 2022-04-01: 2_251 amount: 2022-04-01: 169 - threshold: - 2022-04-01: 2_500 + 2022-04-01: 2_501 amount: 2022-04-01: 188 - threshold: - 2022-04-01: 2_750 + 2022-04-01: 2_751 amount: 2022-04-01: 206 - threshold: - 2022-04-01: 3_000 + 2022-04-01: 3_001 amount: 2022-04-01: 225 - threshold: - 2022-04-01: 3_250 + 2022-04-01: 3_251 amount: 2022-04-01: 244 - threshold: - 2022-04-01: 3_500 + 2022-04-01: 3_501 amount: 2022-04-01: 263 - threshold: - 2022-04-01: 3_750 + 2022-04-01: 3_751 amount: 2022-04-01: 281 - threshold: - 2022-04-01: 4_000 + 2022-04-01: 4_001 amount: 2022-04-01: 300 - threshold: - 2022-04-01: 4_250 + 2022-04-01: 4_251 amount: 2022-04-01: 319 - threshold: - 2022-04-01: 4_500 + 2022-04-01: 4_501 amount: 2022-04-01: 338 - threshold: - 2022-04-01: 4_750 + 2022-04-01: 4_751 amount: 2022-04-01: 356 - threshold: - 2022-04-01: 5_000 + 2022-04-01: 5_001 amount: 2022-04-01: 375 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_person.yaml index 19124990d6f..2c4185062ae 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_person.yaml @@ -7,11 +7,11 @@ il_hbwd_countable_earned_income: 1_000 il_hbwd_countable_unearned_income: 1_200 output: - il_hbwd_person: -100 - # Premium: $100 (earned $25 + unearned $75) - # Earned $1,000 → bracket 4 → $25 - # Unearned $1,200 → bracket 4 → $75 - # Benefit: -$100 (cost to individual) + il_hbwd_person: -94 + # Premium: $94 (earned $19 + unearned $75) + # Earned $1,000 → 751-1000 band → $19 + # Unearned $1,200 → 1001-1250 band → $75 + # Benefit: -$94 (cost to individual) - name: Case 2, HBWD person not eligible. period: 2024-01 @@ -31,4 +31,4 @@ il_hbwd_countable_unearned_income: 0 output: il_hbwd_person: 0 - # Both income in first bracket → $0 premium + # Both incomes in the 0-250 band → $0 premium diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_premium.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_premium.yaml index a45e67f3de7..529eac111de 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_premium.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/il_hbwd_premium.yaml @@ -7,10 +7,10 @@ il_hbwd_countable_earned_income: 2_000 il_hbwd_countable_unearned_income: 0 output: - il_hbwd_premium: 50 - # Earned $2,000 → bracket 8 (2001-2250) → $50 - # Unearned $0 → bracket 0 → $0 - # Total: $50 + il_hbwd_premium: 44 + # Earned $2,000 → 1751-2000 band → $44 + # Unearned $0 → 0-250 band → $0 + # Total: $44 - name: Case 2, premium with earned and unearned. period: 2024-01 @@ -21,10 +21,10 @@ il_hbwd_countable_earned_income: 1_000 il_hbwd_countable_unearned_income: 1_200 output: - il_hbwd_premium: 100 - # Earned $1,000 → bracket 4 (1001-1250) → $25 - # Unearned $1,200 → bracket 4 (1001-1250) → $75 - # Total: $25 + $75 = $100 + il_hbwd_premium: 94 + # Earned $1,000 → 751-1000 band → $19 + # Unearned $1,200 → 1001-1250 band → $75 + # Total: $19 + $75 = $94 - name: Case 3, premium with higher income. period: 2024-01 @@ -35,27 +35,26 @@ il_hbwd_countable_earned_income: 3_000 il_hbwd_countable_unearned_income: 2_000 output: - il_hbwd_premium: 225 - # Earned $3,000 → bracket 12 (3001-3250) → $75 - # Unearned $2,000 → bracket 8 (2001-2250) → $150 - # Total: $75 + $150 = $225 + il_hbwd_premium: 200 + # Earned $3,000 → 2751-3000 band → $69 + # Unearned $2,000 → 1751-2000 band → $131 + # Total: $69 + $131 = $200 -- name: Case 4, premium capped at $500. +- name: Case 4, income above $5,000 of each type pays the chart's highest premium. period: 2024-01 absolute_error_margin: 0.01 input: state_code: IL il_hbwd_eligible: true - il_hbwd_countable_earned_income: 5_000 - il_hbwd_countable_unearned_income: 5_000 + il_hbwd_countable_earned_income: 5_001 + il_hbwd_countable_unearned_income: 5_001 output: il_hbwd_premium: 500 - # Earned $5,000+ → bracket 20 → $125 - # Unearned $5,000+ → bracket 20 → $375 - # Uncapped: $500 - # Capped: $500 + # Earned above $5,000 → 5000+ band → $125 + # Unearned above $5,000 → 5000+ band → $375 + # Total: $500, the chart's highest premium -- name: Case 5, no premium in first bracket. +- name: Case 5, no premium in the 0-250 band. period: 2024-01 absolute_error_margin: 0.01 input: @@ -65,11 +64,11 @@ il_hbwd_countable_unearned_income: 0 output: il_hbwd_premium: 0 - # Earned $200 → bracket 0 (0-250) → $0 - # Unearned $0 → bracket 0 → $0 + # Earned $200 → 0-250 band → $0 + # Unearned $0 → 0-250 band → $0 # Total: $0 -- name: Case 6, verify bracket boundary at $250. +- name: Case 6, income of exactly $250 is in the 0-250 band. period: 2024-01 absolute_error_margin: 0.01 input: @@ -78,10 +77,10 @@ il_hbwd_countable_earned_income: 250 il_hbwd_countable_unearned_income: 250 output: - il_hbwd_premium: 25 - # Earned $250 → bracket 1 (251-500) → $6 - # Unearned $250 → bracket 1 (251-500) → $19 - # Total: $6 + $19 = $25 + il_hbwd_premium: 0 + # Earned $250 → 0-250 band → $0 + # Unearned $250 → 0-250 band → $0 + # Total: $0 - name: Case 7, married couple both disabled, each premium uses only their own withholding. period: 2025-01 @@ -116,6 +115,188 @@ il_hbwd_countable_earned_income: [1_802.61, 1_802.61] il_hbwd_countable_unearned_income: [0, 0] il_hbwd_premium: [44, 44] - # Earned $1,802.61 → bracket 7 (1751-2000) → $44 - # Unearned $0 → bracket 0 → $0 + # Earned $1,802.61 → 1751-2000 band → $44 + # Unearned $0 → 0-250 band → $0 # Deducting the couple's combined withholding would give 1,710.41 → $38 + +- name: Case 8, income of exactly $5,000 is in the 4751-5000 band, not the 5000+ band. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: IL + il_hbwd_eligible: true + il_hbwd_countable_earned_income: 5_000 + il_hbwd_countable_unearned_income: 5_000 + output: + il_hbwd_premium: 475 + # Earned $5,000 → 4751-5000 band → $119 + # Unearned $5,000 → 4751-5000 band → $356 + # Total: $119 + $356 = $475 + +- name: Case 9, earned income at each band start (251, 501, ..., 5,001) pays that band's premium. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 251, il_hbwd_countable_unearned_income: 0} + person2: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 501, il_hbwd_countable_unearned_income: 0} + person3: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 751, il_hbwd_countable_unearned_income: 0} + person4: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_001, il_hbwd_countable_unearned_income: 0} + person5: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_251, il_hbwd_countable_unearned_income: 0} + person6: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_501, il_hbwd_countable_unearned_income: 0} + person7: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_751, il_hbwd_countable_unearned_income: 0} + person8: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_001, il_hbwd_countable_unearned_income: 0} + person9: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_251, il_hbwd_countable_unearned_income: 0} + person10: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_501, il_hbwd_countable_unearned_income: 0} + person11: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_751, il_hbwd_countable_unearned_income: 0} + person12: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_001, il_hbwd_countable_unearned_income: 0} + person13: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_251, il_hbwd_countable_unearned_income: 0} + person14: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_501, il_hbwd_countable_unearned_income: 0} + person15: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_751, il_hbwd_countable_unearned_income: 0} + person16: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_001, il_hbwd_countable_unearned_income: 0} + person17: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_251, il_hbwd_countable_unearned_income: 0} + person18: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_501, il_hbwd_countable_unearned_income: 0} + person19: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_751, il_hbwd_countable_unearned_income: 0} + person20: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 5_001, il_hbwd_countable_unearned_income: 0} + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, + person11, person12, person13, person14, person15, person16, person17, person18, person19, person20] + state_code: IL + output: + il_hbwd_premium: [6, 13, 19, 25, 31, 38, 44, 50, 56, 63, 69, 75, 81, 88, 94, 100, 106, 113, 119, 125] + # First column of the chart, bands 251-500 through 5000+. + +- name: Case 10, earned income one dollar below each band start (250, 500, ..., 5,000) pays the lower band's premium. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 250, il_hbwd_countable_unearned_income: 0} + person2: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 500, il_hbwd_countable_unearned_income: 0} + person3: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 750, il_hbwd_countable_unearned_income: 0} + person4: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_000, il_hbwd_countable_unearned_income: 0} + person5: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_250, il_hbwd_countable_unearned_income: 0} + person6: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_500, il_hbwd_countable_unearned_income: 0} + person7: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 1_750, il_hbwd_countable_unearned_income: 0} + person8: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_000, il_hbwd_countable_unearned_income: 0} + person9: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_250, il_hbwd_countable_unearned_income: 0} + person10: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_500, il_hbwd_countable_unearned_income: 0} + person11: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 2_750, il_hbwd_countable_unearned_income: 0} + person12: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_000, il_hbwd_countable_unearned_income: 0} + person13: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_250, il_hbwd_countable_unearned_income: 0} + person14: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_500, il_hbwd_countable_unearned_income: 0} + person15: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 3_750, il_hbwd_countable_unearned_income: 0} + person16: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_000, il_hbwd_countable_unearned_income: 0} + person17: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_250, il_hbwd_countable_unearned_income: 0} + person18: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_500, il_hbwd_countable_unearned_income: 0} + person19: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 4_750, il_hbwd_countable_unearned_income: 0} + person20: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 5_000, il_hbwd_countable_unearned_income: 0} + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, + person11, person12, person13, person14, person15, person16, person17, person18, person19, person20] + state_code: IL + output: + il_hbwd_premium: [0, 6, 13, 19, 25, 31, 38, 44, 50, 56, 63, 69, 75, 81, 88, 94, 100, 106, 113, 119] + # First column of the chart, bands 0-250 through 4751-5000. + +- name: Case 11, unearned income at each band start (251, 501, ..., 5,001) pays that band's premium. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 251} + person2: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 501} + person3: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 751} + person4: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_001} + person5: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_251} + person6: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_501} + person7: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_751} + person8: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_001} + person9: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_251} + person10: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_501} + person11: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_751} + person12: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_001} + person13: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_251} + person14: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_501} + person15: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_751} + person16: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_001} + person17: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_251} + person18: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_501} + person19: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_751} + person20: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 5_001} + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, + person11, person12, person13, person14, person15, person16, person17, person18, person19, person20] + state_code: IL + output: + il_hbwd_premium: [19, 38, 56, 75, 94, 113, 131, 150, 169, 188, 206, 225, 244, 263, 281, 300, 319, 338, 356, 375] + # First row of the chart, bands 251-500 through 5000+. + +- name: Case 12, unearned income one dollar below each band start (250, 500, ..., 5,000) pays the lower band's premium. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 250} + person2: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 500} + person3: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 750} + person4: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_000} + person5: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_250} + person6: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_500} + person7: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 1_750} + person8: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_000} + person9: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_250} + person10: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_500} + person11: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 2_750} + person12: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_000} + person13: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_250} + person14: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_500} + person15: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 3_750} + person16: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_000} + person17: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_250} + person18: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_500} + person19: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 4_750} + person20: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 5_000} + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8, person9, person10, + person11, person12, person13, person14, person15, person16, person17, person18, person19, person20] + state_code: IL + output: + il_hbwd_premium: [0, 19, 38, 56, 75, 94, 113, 131, 150, 169, 188, 206, 225, 244, 263, 281, 300, 319, 338, 356] + # First row of the chart, bands 0-250 through 4751-5000. + +- name: Case 13, income with cents stays in the band of its whole-dollar amount. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 250.99, il_hbwd_countable_unearned_income: 0} + person2: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 5_000.99, il_hbwd_countable_unearned_income: 0} + person3: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 250.99} + person4: {il_hbwd_eligible: true, il_hbwd_countable_earned_income: 0, il_hbwd_countable_unearned_income: 5_000.99} + households: + household: + members: [person1, person2, person3, person4] + state_code: IL + output: + il_hbwd_premium: [0, 119, 0, 356] + # $250.99 → 0-250 band; $5,000.99 → 4751-5000 band (IDHS PM 15-04-03 drops cents). + +- name: Case 14, HFS 3792 Example 1, $900 from work and $1,000 from Social Security. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: IL + il_hbwd_eligible: true + il_hbwd_countable_earned_income: 900 + il_hbwd_countable_unearned_income: 1_000 + output: + il_hbwd_premium: 75 + # HFS 3792 (R-03-13), Example 1: the monthly premium is $75. + # Earned $900 → 751-1000 band → $19 + # Unearned $1,000 → 751-1000 band → $56 + # Total: $19 + $56 = $75 diff --git a/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/integration.yaml index 75ddb4826f1..5ba4a5bc04f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/il/hfs/hbwd/integration.yaml @@ -19,14 +19,14 @@ # Income calculation il_hbwd_gross_earned_income: 2_000 # 24,000 / 12 il_hbwd_countable_income: 2_728.13 - # Earned: $2,000 - $211.55 (expenses) - $50 (exemptions) = $1,738.45 - # Unearned: $1,000 - $10 (remaining flat exemption) - # Total: ~$2,728.13 + # Earned: $2,000 - $221.87 (withheld taxes) - $50 (exemption) = $1,728.13 + # Unearned: $1,000 (counted gross) + # Total: $2,728.13 # Premium calculation - il_hbwd_premium: 113 - # Earned $1,713.45 → bracket 6 (1501-1750) → $38 - # Unearned $1,000 → bracket 4 (1001-1250) → $75 - # Total: $38 + $75 = $113 + il_hbwd_premium: 94 + # Earned $1,728.13 → 1501-1750 band → $38 + # Unearned $1,000 → 751-1000 band → $56 + # Total: $38 + $56 = $94 - name: Case 2, couple with one eligible member. period: 2024-01 @@ -112,11 +112,13 @@ il_hbwd_employment_eligible: true il_hbwd_eligible: true il_hbwd_income_eligible: true - # Total income after deductions: ~$4,089 + # Countable income: $3,498.62 earned + $400 unearned = $3,898.62 # 350% FPL for single (2024): ~$4,393 # Just under limit → eligible il_hbwd_premium: 100 - # Premium: $100 + # Earned $3,498.62 → 3251-3500 band → $81 + # Unearned $400 → 251-500 band → $19 + # Total: $81 + $19 = $100 - name: Case 5, eligible with high income after exemptions. period: 2024-01 @@ -133,7 +135,7 @@ il_hbwd_employment_eligible: true il_hbwd_asset_eligible: true il_hbwd_income_eligible: true - # Countable income after expenses and exemptions: ~$4,618 + # Countable income after expenses and exemptions: $4,378.95 # With exemptions, now under 350% FPL limit il_hbwd_eligible: true @@ -157,13 +159,13 @@ # Income calculation il_hbwd_gross_earned_income: 1_000 il_hbwd_countable_income: 2_349.95 - # Earned after expenses and exemptions: ~$850 + # Earned after expenses and exemptions: $849.95 # Unearned: $1,500 - # Total: ~$2,349.95 - il_hbwd_premium: 132 - # Earned $824.95 → bracket 3 (751-1000) → $19 - # Unearned $1,500 → bracket 6 (1501-1750) → $113 - # Total: $19 + $113 = $132 + # Total: $2,349.95 + il_hbwd_premium: 113 + # Earned $849.95 → 751-1000 band → $19 + # Unearned $1,500 → 1251-1500 band → $94 + # Total: $19 + $94 = $113 - name: Case 7, ineligible too young. period: 2024-01 diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index e06355446bb..8b36bed506f 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2164,6 +2164,48 @@ candidates: state: ruled note: Statute text is in the Axiom corpus; registering needs a pdftotext capture of the official instructions page. +- id: us-il:hbwd-premium-earned-1251-unearned-501-cell + program: medicaid + years: + from: 2009 + type: calendar + question: Is the Illinois Health Benefits for Workers with Disabilities premium for countable earned income of + $1,251-1,500 and gross unearned income of $501-750 $79, as 89 Ill. Adm. Code 120.510(n)(3) prints, or $69, as + the HFS premium chart prints? + sources: + - kind: regulation + citation: 89 Ill. Adm. Code 120.510(n)(3) + url: https://ilga.gov/commission/jcar/admincode/089/089001200I05100R.html + - kind: form + citation: HFS HBWD Premium Chart (one page, June 2009) + url: https://hfs.illinois.gov/content/dam/soi/en/web/hfs/medicalprograms/hbwd/documents/hfsweb004.pdf + - kind: guidance + citation: HFS 3792 (R-03-13), Health Benefits for Workers with Disabilities brochure, premium table + url: https://hfs.illinois.gov/medicalprograms/hbwd/hfs3792hbwd.html + readings: + statute: No statute is supplied; the regulation's table prints 79 for earned income 1251-1500 and unearned + income 501-750, in the text effective February 1, 2009 (33 Ill. Reg. 1681) and unchanged by the amendment + effective March 25, 2022 (46 Ill. Reg. 5705). + other: The HFS premium chart (June 2009) and the HFS 3792 brochure print 69 for the same cell, which PE-US + gives (31 + 38). + example: Countable earned income of $1,300 and gross unearned income of $600 a month give a $79 premium under the + regulation and a $69 premium under the chart and in PE-US. + pe_us: + follows: conflicting-source + code: + - policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/earned.yaml + - policyengine_us/parameters/gov/states/il/hfs/hbwd/premium/unearned.yaml + - policyengine_us/variables/gov/states/il/hfs/hbwd/il_hbwd_premium.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10372 + state: ruled + note: 'Ruled 2026-10-27 for the regulation''s 79 by the project lead for the Medicaid fixes; the ruling record is + https://github.com/PolicyEngine/policyengine-us/pull/10372#issuecomment-6451385205. Under "Regulations are law" the + regulation binds, and the written canons have no exception for an apparent typesetting error, so the 69 in the + HFS chart and the HFS 3792 brochure does not override it. PE-US gives 69 because its premium adds an earned + component (31) and an unearned component (38), which cannot represent a cell that departs from that sum. Issue + 10471, which encodes the full 21 x 21 table, will make PE-US follow the ruling. The other 440 cells of the + regulation and the chart agree.' - id: us-il:joint-childless-eitc-dependency-skip program: income-tax years: