Repository navigation
Fix Arkansas 2025 and 2024 income tax minus-adjustment schedules against the DFA cards - #9624
Merged
Merged
Conversation
2025: the reduction scale jumped from the $26,400 row ($420) straight to $95,001, skipping DFA's $94,701-$94,800 ($399.30), $94,801-$94,900 ($389.30) and $94,901-$95,000 ($379.30) rows, so taxable income in that band was undertaxed by $20.70-$40.70. The column also carried rounded amounts (112/224/288/420, 369...89) instead of DFA's published cents (111.98/223.97/287.97/419.96, 369.30...89.30). Re-keyed the whole 2025 column to the 2025 Indexed Tax Brackets card; its rows now line up with the 2026 Act 1 rows, and the two newly finite 2025 rows keep their explicit 2026 .inf, so 2026 is unchanged. 2024: the column ignored the card's asterisked $94,301-$94,500 row, so $94,401-$95,500 each took the next $10 step down ($10 overtax). Verified every integer taxable income 0-110,000 for 2021-2025 against the DFA TaxBrackets cards and 2026 against Act 1 of 2026: 0 mismatches (upstream/main: 1,100 in 2024, 104,403 in 2025). Loaded rate and reduction scales for 2015-2035 are otherwise identical. Also points the 2025 booklet reference at the Regular Income Tax Table (PDF page 30; #page=26 was the printed page number) and cites the 2025 TaxBrackets card in rate.yaml and reduction.yaml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Compares rate.calc(ti) * ti - reduction.calc(ti) at every integer taxable income 0-150,000 against an independent transcription of each DFA Indexed Tax Brackets card (2021-2025) and Act 1 of 2026, and checks that tax is non-negative, never falls except the statutory $2.66 drop Act 1 of 2026 writes at $94,700 -> $94,701, and that reduction thresholds strictly increase. On upstream/main the 2024 and 2025 differential cases fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…cale The loaded scale can't show a duplicated or out-of-order row: add_bracket sorts thresholds and sums duplicate amounts. Reading each bracket's own threshold flags the pre-#9026 2023 duplicates (91,701 and 91,801), which the previous check passed. Caught in independent review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Admin-merged (squash, --match-head-commit 3045506) under Max's 2026-09-26 ruling (d399: obvious improvements need no permission; admin-merge when the only block is a required review only Max could give). Gates: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
rates/main/reduction.yamljumped from the $26,400 row ($420) straight to $95,001. It skipped the three DFA rows for $94,701–$95,000, so taxable income in that band got the $420 reduction instead of $399.30, $389.30 or $379.30 and was undertaxed by $20.70–$40.70. The 2025 column also used whole-dollar amounts instead of DFA's published cents: 112, 224, 288, 420, then 369, 359, … 89 instead of 111.98, 223.97, 287.97, 419.96, then 369.30, 359.30, … 89.30. This PR re-keys the whole 2025 column to the 2025 Indexed Tax Brackets card.reduction.yamlandrate.yamlfrom#page=26to#page=30.#page=26matched the printed page number, but PDF page 26 is "For Taxpayers' Information". The Regular Income Tax Table starts at PDF page 30. Both files now also cite the 2025 TaxBrackets card.policyengine_us/tests/test_ar_income_tax_schedule.py; see "Invariants" below.Before and after
ar_income_tax_before_non_refundable_credits_indiv, computed as 3.9% × taxable income − the row's minus adjustment:"Table" is DFA's Regular Income Tax Table value for the $100 band. DFA computes it at the band's midpoint and rounds to the dollar: 2025, 2024.
Why DFA's cents, not whole dollars
The rounded 2025 amounts weren't a documented choice. #7362 cited the booklet's whole-dollar tax table, not the TaxBrackets card. The 2021–2024 columns all carry DFA's cents. The card says "If you use a formula to calculate Arkansas income tax, the results must match the table exactly", and its worked examples subtract the cents amount (
$75,950 x .039 = $2,962.05 - $419.96).The rounded amounts don't reproduce DFA's table either. I parsed all 949 bands of the 2025 Regular Income Tax Table (PDF pages 30–34) and evaluated the model at each band's midpoint, rounding half up:
The same check on 2024: upstream/main misses the 11 bands from $94,401 to $95,501; this PR misses none.
Rows are shared across years
After the fix, 2025 rows 5–36 hold $94,701 + $100k with amount $399.30 − $10k. They line up exactly with the 2026 rows from Act 1 of 2026 ($94,701 + $100k, amount $369.90 − $10k). The two rows that became finite in 2025 ($97,701 and $97,801) already had explicit
2026-01-01: .inf, so 2026 inherits nothing new.Verification
Every integer taxable income, 0–110,000 (plus 150,000 and 1,000,000), compared with the source. 2021–2025 use the DFA Indexed Tax Brackets cards. 2026 uses Act 1 of 2026 § 1 (A.C.A. § 26-51-201(a)(4)(A)–(C)):
Independent agents re-parsed each year's source with pdfplumber and pdftotext. They found 0 mismatches on this branch for 2021–2025 and the same upstream/main mismatch ranges.
Loaded scales, 2015–2035 (Jan 1 and Jul 1 of each year): only the 2024 and 2025 reduction scales change.
rate.yaml's loaded values are identical; only its references changed.rate.yamlneeds no new rows, because the rate is a flat 3.9% from $26,400 up in both years.Tests:
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ar→ 513 passed.Open PRs nearby:
rates/main. All 25 of its findings are the rows Fix duplicate 2024 Arkansas low-income table threshold and guard scale thresholds #9599 itself fixes.reduction.yamlandrate.yaml.git merge-treeof the two PRs has no conflicts, and the merged tree still has 0 mismatches for 2021–2026.Citation check: arkleg's status page says "Notification that HB1001 is now Act 1" (5/6/2026), so the existing Act 1 citation is correct.
Invariants
policyengine_us/tests/test_ar_income_tax_schedule.pychecks these for every integer taxable income from 0 to 150,000 (plus 250,000 and 1,000,000) in 2021–2026:rate × TI − reductionequals an independent, compact transcription of each DFA card or Act 1 of 2026. The transcription is the base rows plus a $100/$10 ladder with explicit asterisked $200 rows. The check allows at most half a cent. It catches this whole class of bug: skipped rows, ignored asterisked rows, shifted rows.reduction.yamlrows carry strictly increasing finite thresholds, with every.infrow after them. The test reads each row's own threshold. The loaded scale can't reveal a mis-keyed row, becauseadd_bracketsorts thresholds and sums duplicate amounts. This check flags the pre-AR 2023 bracket-adjustment column mistranscribed: missing $89,901 row, un-encoded asterisked $200 ranges, duplicate 91,701/91,801 thresholds (40/44 rows off) #9026 2023 duplicates (91,701 and 91,801), which a loaded-scale check passes. The independent review caught that the first version of this test checked the loaded scale.Not changed
axiom: TheAxiomFoundation/rulespec-us#1410 debt. Axiom has Arkansas income tax only for TY2026 (the Act 1 of 2026 pilot, bounded to 2026). #1405 covers TY2014–2020. #1410 records the TY2021–2025 schedule, including these 2024 and 2025 rows.
🤖 Generated with Claude Code