Repository navigation
Use Louisiana's RIB 26-019 2026 standard deduction and retirement exemption - #9791
Merged
Merged
Conversation
…mption LDR Revenue Information Bulletin 26-019 (2026-09-28) sets the 2026 standard deduction at $12,838 single/separate and $25,676 joint, head of household and surviving spouse, and the age-65 retirement income exemption at $12,324: each 2025 amount times a 2.7% CPI-U multiplier, rounded to the dollar, with the joint amount twice the rounded single amount. PolicyEngine carried a self-computed $12,835 / $25,670 (PR #8411, unrounded 2.677%) and held the retirement cap at $12,000. Later years follow La. R.S. 47:294(B) and 47:44.1(A): the prior year's amount times the prior calendar year's CPI-U increase. The new extend_la_cpi_u_indexed_amounts reproduces RIB 26-019 from the 2025 amounts (BLS's one-decimal December-over-December change, decimal half-up rounding, joint = 2 x single) and replaces the plain CPI-U metadata uprating, which had no joint-doubling or rounding rule. The February 20, 2026 Louisiana Register reference is dropped from the return-deduction parameter: it is LDR's withholding formula ($12,875), not the return amount. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d ones Review of #9791 found two problems in the Louisiana projection: - BLS reports the CPI-U December-over-December change from the not seasonally adjusted index, but the model's cpi_u is seasonally adjusted from January 2024. 2025 rounded to 2.7% by a 0.004-point margin, and 2022 and 2023 would round to 6.4% and 3.3% instead of BLS's 6.5% and 3.4%. Add gov.bls.cpi.cpi_u_nsa_december (CUUR0000SA0, 2012-2025) and use it whenever both Decembers are published. - An unobserved December read the last observation, so 2027 got only January-June 2026 inflation (2.0%). Interpolate geometrically from the last observation toward CBO's calendar-year projection points, placed halfway between June and July of their year (#9608); 2027 is now 3.1%. Also round the percentage in Decimal, raise a descriptive error if the age-65 bracket is missing, note that reforms to the single amount do not carry through, and pin half-dollar float traps and BLS's published 2013-2025 changes in tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9791 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 1 -3
Lines 76 17 -59
Branches 2 0 -2
=========================================
- Hits 76 17 -59
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Round-2 review of #9791: when monthly CPI-U data ends at February Y, the February instant holds an observation but was read as CBO's calendar-year Y average anchored halfway through Y, moving later projected percentages by about 0.4 points until the next refresh. Only Februaries in years after the last observation's year are now anchors, so no branch reads an instant a refresh could turn from projection into observation. Also add a tripwire that cpi_u_nsa_december keeps up with the monthly series, test the missing age-65 bracket error, note that cpi_u.yaml's "# YYYY value" comments are tax-year labels, and mention the NSA series in the changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add 17 end-to-end, boundary and retirement-exemption cases to the Louisiana integration tests that mirror the companion tests proposed in TheAxiomFoundation/rulespec-us#1493, with expectations from the same RIB 26-019 amounts: federal AGI 50,000 for every filing status, the 12,838 / 25,676 boundaries (25,676 rejects 25,000 x 1.027), the 12,324 cap at, below and above, and retirement income flowing through la_agi to tax, including a public pension exempted under sources.yaml that does not use the R.S. 47:44.1 amount. Also clarify that the February anchor rule only matters when CPI-U observations end in January. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mutation run at 498b776 found that switching the dollar rounding to half-even survived: each deterministic half-dollar case (12,837.50, 10,311.50, 20,725.50) rounds up to an even dollar, so banker's rounding agrees with half-up on all of them, and the Hypothesis property only catches it when it draws an exact half. Add 10,100 x 1.005 = 10,150.50, which rounds up to 10,151 but to the even 10,150 under half-even (and under float prior x (1 + p / 100)). Also note that the retirement end-to-end cases set federal AGI directly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Hand-off to the US + core hub
|
Contributor
Author
|
Landed by the US + core hub, after session 4be2b2e0 handed it off, at head Gates:
The Axiom side (rulespec-us#1493) and its signed dispatch (cos d971) don't block this merge. |
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
Louisiana Department of Revenue Revenue Information Bulletin 26-019, dated September 28, 2026, publishes the 2026 inflation-adjusted amounts. This PR encodes them and projects later years with the statute's annual CPI-U adjustment.
deductions/standard/amount.yaml: replaces the self-computed 2026 entries from Update Louisiana 2026 standard deduction #8411 ($12,500 × 324.054 / 315.605) with RIB 26-019's amounts. It cites the RIB and keeps the R.S. 47:294 reference. It drops the February 20, 2026 Louisiana Register reference: that page is LDR's withholding formula,W = (S − (12875 / N)) * .0309, i.e. the $12,875 withholding amount (LAC 61:I.1501, LR 52:749). That amount does not apply to the return deduction.exempt_income/retirement/cap.yaml: adds2026-01-01: 12_324to the 65+ bracket and cites the RIB.extend_la_cpi_u_indexed_amountsinparameters/uprating_extensions.pyhandles both parameters. It follows the pattern ofextend_or_ctc_parametersandextend_wa_millionaires_standard_deduction, and replaces the standard deduction's plainuprating: gov.bls.cpi.cpi_u. The retirement cap previously had no uprating, so every year after 2025 stayed at $12,000.gov.bls.cpi.cpi_u_nsa_december: BLS's not seasonally adjusted December CPI-U (CUUR0000SA0), 2012–2025. BLS reports the 12-month change from this series. The model'scpi_uis seasonally adjusted from January 2024, so it cannot reproduce BLS's reported percentage (see the review section).la_retirement_exemption_person.pystill described the cap as $6,000.What the statute and the bulletin say (verified 2026-10-05)
f22663cde2ebdf56eed6688779d25583e1c8fb86feaa773c8454b8735dd71067(matches). Its table shows 2025 amounts of $12,500 / $25,000 / $12,000, a "CPI-U Multiplier" of 2.7%, and 2026 amounts of $12,838 / $25,676 / $12,324. A RIB "does not have the force and effect of law". Here it is the agency's published computation of the statutory amount.Projection method for 2027 onward
For each year after the last published amount,
extend_la_cpi_u_indexed_amountssets:Decimal);pis the CPI-U December-over-December change for the prior calendar year, rounded half up to one decimal inDecimaland floored at 0, since "percentage increase" excludes a decrease. Its source depends on what is published:Both Decembers published:
pcomes fromcpi_u_nsa_december. It reproduces BLS's published change for every year 2013–2025 (2021 7.0, 2022 6.5, 2023 3.4, 2024 2.9, 2025 2.7).Otherwise: both Decembers come from the model's
cpi_u, never one from each series. An unobserved December is interpolated geometrically by month from the last observation toward CBO's projection points. Those points are calendar-year averages (CPI projection points in c_cpi_u.yaml and cpi_u.yaml are calendar-year averages, not the 12-months-ending-August averages their comment describes #9608), so each is placed halfway between June and July of its year; past the last point the index holds flat.With observations through June 2026, December 2026 interpolates to 336.26 against an observed 326.03 for December 2025, so 2027 gets 3.1%. Carrying June forward would give 2.0%, about six months of inflation.
Each future RIB should still be encoded when published, and published YAML values take precedence over the projection for their years. Like the other extension-projected parameters, the projection is fixed when the parameter tree is built, so a reform to the single amount does not carry through to the other statuses or later years (documented in the docstring).
Floating-point note: 12,500 × 1.027 is 12,837.4999… in binary, so float rounding gives $12,837. The back-test caught this, and a parametrized test pins three half-dollar cases that misround under float arithmetic, including (20,500, 1.1%), which misrounds under both
prior × (1 + p/100)andprior × (100 + p)/100.Projected values on the current CPI-U series (these move with BLS/CBO refreshes):
Main's plain uprating ratios CPI-U at January 1 against January 2026, without the dollar rounding or the 200% rule. Its 2027 value reads June 2026, so it gets about six months of inflation.
Invariants (stated and tested)
policyengine_us/tests/policy/baseline/gov/states/la/tax/income/test_la_cpi_u_indexing.py(32 tests) checks these:pequals BLS's published December-over-December change for every year 2013–2025.adjust(prior year, p(prior calendar year)), for the standard deduction and the retirement cap (through the scale'scalc).cpi_uis refreshed past a December thatcpi_u_nsa_decemberlacks.pis ≥ 0, has one decimal, is within 0.05 of the true change, and is monotone in the December index.498b776.p;ROUND_HALF_EVENsurvived. Every half-dollar case then in the module rounds up to an even dollar, so banker's rounding agreed with half-up on all of them.f9a82d6adds 10,100 × 1.005 = 10,150.50, which goes to 10,151 under half-up and to the even 10,150 under half-even. Re-run, the mutant now fails.psurvived. It is an equivalent mutant on published indexes.pis computed exactly inDecimal. With 3-decimal December indexes, a ratio within float error of an x.x5 tie must be an exact tie, and at every exact tie from 0.05 to 39.95 the float path agrees with half-up (checked exhaustively).Tests
la_standard_deduction.yaml: 2026 cases for all five filing statuses (12,838 / 25,676).integration.yaml: the 2026 single case becomes 12,838 / 27,162 / 814.86, i.e. 3% × (40,000 − 12,838), down from 814.95.la_retirement_exemption_person.yaml: a 2025 above-cap case (12,000), and 2026 cases above the cap (12,324), between the 2025 and 2026 caps (12,200), and a head and spouse pair (0 for the under-65 head, 12,324 for the spouse).integration.yaml: 17 more cases that mirror the Axiom companion tests in Repair Louisiana's 2026 standard deduction and encode the indexed retirement exemption (LDR RIB 26-019; R.S. 47:294, 47:44.1) TheAxiomFoundation/rulespec-us#1493, from the same RIB ground truth. They cover:la_agito tax (745.14 for a 65+ single; 890.28 for a 65+ couple);sources.yamlthat does not use the 47:44.1 amount (64.86).test_uprating_extensions.py, the Oregon extension tests and the BLS CPI actuals tests: 65 passed;tests/code_health: 136 passed.tests/corehad one failure in the combined local run, intest_ald_determinism.py::test_household_float32_deductions_are_identical_across_hash_seeds.tests/core.Impact
Every figure is a policyengine-us microsimulation on the default dataset: two full runs per year, this branch against a reform restoring main's values.
microsim_impact.py; its output is kept with the evidence.51cfffe. No later commit changes a 2026 value: the projection only fills years after the last published one. The 2027 runs used the final projection code.The largest cuts reconcile with the parameter changes for a 65+ joint couple whose tax is 3% of taxable income:
PolicyBench. The audit PolicyEngine/policybench#192 (
reference_audit/2026-10-05-louisiana, branchla-2026-standard-deduction) found the engine's $12,835 within $0.09 of RIB 26-019 on PolicyBench's two scored Louisiana outputs. PolicyBench builds references from the newest policyengine-us release. Once this merges, a later reference rebuild will see scenario_051 and scenario_077 move by −$0.09, within the $1 tolerance. The audit also found that the $12,324 retirement cap changes none of the 1,984 outputs. How PolicyBench's publication convention treats an amount announced after its 2026-07-03 freeze is pending Max's ruling on that audit. This PR encodes the law regardless.Review
Independent review was by Subfleet Opus 5.5, in four rounds:
51cfffe: REQUEST_CHANGES.pcame from the model's seasonally adjusted CPI-U. 2025 cleared the 2.65 rounding boundary by 0.004 points, and 2022 and 2023 would round to 6.4% and 3.3% instead of BLS's 6.5% and 3.4%.33ba01b, by addingcpi_u_nsa_decemberand the interpolation.33ba01b: REQUEST_CHANGES. A February observation (data ending exactly at February) would be read as a calendar-year anchor. Fixed in498b776, along with its nits.498b776: APPROVE.0240a16(the 17 mirrored test cases and a docstring): APPROVE. Its nits: a comment on AGI inputs, now added; some person-level cases overlap the unit file, kept so the set stays a one-to-one mirror of the Axiom cases.f9a82d6(the half-even test case and the comment): APPROVE, at the current head.Axiom
axiom: TheAxiomFoundation/rulespec-us#1493 queued
The Axiom side is wrong today:
us-la:statutes/47:294encodes only the 2025 base and defers the indexed deduction.us-la:policies/income_tax/2026_resident_coreuses the 2026 IT-540ESi estimated-tax amounts ($12,875 / $25,750), which are the withholding figures, as the return deduction.None of it can be fixed by a PR:
2026_resident_corehas no signed edit path today;#1493 is dispatch-ready. It has:
review_findingtext for 47:44.1 and the RIB module;Its 41-case resident-core test file passes on the pinned Axiom engine (scratch copy), and its negative controls fail on 12,875, 12,835 and 25,675.
🤖 Generated with Claude Code