State tax docs / Later years
Later tax years: how the engine projects the rules
The engine's rules are those of tax year 2026. A later year is estimated by projecting each dollar amount and each
birth-year age cutoff the way the state's own law moves it: indexed by the index the statute names, tied to an indexed federal amount,
fixed in law, or following a schedule the legislature has enacted. The retirement planner, the API's projection and the
library all use the same function (state_tax_project_config(), backend/src/state_tax.c:6370).
Two modes; the law by default
As the law sets them ("law") is the default everywhere: the planner's
stateThresholdIndexing, the API's projection.indexing and the library. Everything below describes it.
Rise with inflation ("inflation") is an option: the convention QuantCalc's
planner used before September 2026, reproduced exactly. Of the 901 dollar amounts in the registry it multiplies 567 by
the factor, unrounded, whatever the law says (252 of them are fixed in law), and holds the other 334 at their
2026 figures (cap_loss_limit, cap_loss_limit_mfs, blind_exemption among them; 28 of those the law does move). Enacted schedules and derived
amounts are not applied, and the API does not refuse a result for an amount no official source settles, because the assumption is the
caller's. Birth-year age cutoffs move one year per year in both modes. The response says which mode ran (projection.indexing;
the planner's stateTaxProjection.indexing, whose heldAtRulesYear lists what this mode holds) and, in
"inflation" mode, lists each schedule it did not apply under enactedChangesNotApplied.
The method
- The rules year itself (2026, at a factor of 1) is the 2026 configuration, unchanged.
- Indexed amounts are the 2026 amount times the caller's cumulative CPI factor, with the increase rounded the statute's way (to the nearest dollar, down to a multiple of $50, and so on). The one factor stands in for every index a statute names (CPI-U, chained CPI-U, a state CPI, the maximum Social Security benefit, the poverty guideline).
- Where the engine carries the 2025 figure because the state has not published the 2026 one, a projection adds that year of indexing at the factor's average annual rate.
- Tied to an indexed federal amount (a state that uses the federal standard deduction, say): projected like an indexed amount, with the federal rounding.
- Fixed in law: the same nominal amount in every year.
- Enacted schedule (a phase-in, a sunset): the value the statute sets for the year; after the
last scheduled year the last value, held or indexed as the statute says. The response marks such a year
afterSchedule. Where the statute switches to an indexed amount that is known only in an earlier year's dollars (Maine's standard deduction is the federal one from 2027; its 2026 amount is scheduled), the scheduled value is indexed from that year in every year it applies (scheduleValueYear). - Birth-year cutoffs (Utah's credit for people born in 1952 or earlier, say) move one year per year; attained-age tests (65 or older) do not.
- Defined from another amount (Ohio's tax at the zero-bracket threshold is the statute's 1.27448% of the threshold): recomputed from the projected amount and rounded as the statute prints it, so it moves in the other amount's steps.
- Rates, percentages and the rules themselves are the 2026 ones, with one exception: where the statute
prints the whole bracket table for a later year (Hawaii for 2027 and 2029, Montana for 2027), that table applies in its years, rates
included, as an enacted schedule. Other rate changes and new or repealed rules a state has already enacted for later years are listed
on its page and in each projected response (
projection.enactedChangesNotApplied); the projection does not apply them. - Not established: an amount whose later-year treatment no official source settled is held
in the planner at its 2026 value, because a plan cannot stop at year twelve; the planner's response names every such amount of
the plan's state (
stateTaxProjection.heldNotEstablished, with the enacted changes it does not apply).POST /api/state-taxrefuses a projected request whose result depends on one (400) rather than present a guess as an estimate: a single-year answer can be refused, the caller can ask for the rules year instead, and a flag on an otherwise normal-looking number is easy to miss. - A factor below 1 lowers indexed amounts; a statute's floor against a decrease is not modelled.
Each projected response says so (projected: true for a year after 2026, rulesYear, projectedYear) and lists every amount
that bore on the result with its rules-year and projected values, the rule, and the rule's sources, so a caller can show the figure as an
estimate on 2026 rules (API reference).
The registry
Every nonzero dollar amount and age test of every state's configuration, and every dollar table the engine holds in code, is in exactly one rule of the indexing registry (download), each rule with an official source and the wording quoted exactly as the source prints it; the weekly source check re-reads those quotes. A build gate fails on an amount in no rule, a rule without a source, or an engine build that does not carry the registry as it stands. 1047 amounts in all: 214 indexed, 94 tied to an indexed federal amount, 577 fixed in law, 35 enacted schedule, 5 birth-year cutoff, 106 attained age, 3 defined from another amount, 13 not established.
| Jurisdiction | Indexed | Federal | Fixed | Scheduled | Birth year | Age | Derived | Not established | Enacted changes not applied |
|---|---|---|---|---|---|---|---|---|---|
| Alabama | 0 | 0 | 17 | 0 | 0 | 2 | 0 | 0 | 0 |
| Arizona | 3 | 0 | 15 | 1 | 0 | 2 | 0 | 0 | 0 |
| Arkansas | 7 | 0 | 6 | 0 | 0 | 4 | 0 | 9 | 0 |
| California | 18 | 0 | 10 | 2 | 0 | 1 | 0 | 0 | 0 |
| Colorado | 0 | 7 | 9 | 4 | 0 | 2 | 0 | 0 | 1 |
| Connecticut | 0 | 0 | 28 | 0 | 0 | 1 | 0 | 0 | 0 |
| Delaware | 0 | 0 | 18 | 1 | 0 | 6 | 0 | 0 | 1 |
| District of Columbia | 1 | 7 | 8 | 0 | 0 | 2 | 0 | 0 | 0 |
| Georgia | 0 | 0 | 16 | 2 | 0 | 5 | 0 | 0 | 3 |
| Hawaii | 0 | 0 | 9 | 6 | 0 | 1 | 0 | 0 | 0 |
| Idaho | 7 | 7 | 7 | 1 | 0 | 3 | 0 | 0 | 0 |
| Illinois | 3 | 0 | 11 | 0 | 0 | 1 | 0 | 0 | 0 |
| Indiana | 0 | 0 | 23 | 0 | 0 | 4 | 0 | 0 | 0 |
| Iowa | 0 | 7 | 12 | 1 | 0 | 3 | 0 | 0 | 0 |
| Kansas | 0 | 0 | 16 | 0 | 0 | 0 | 0 | 0 | 1 |
| Kentucky | 4 | 0 | 6 | 0 | 0 | 1 | 0 | 0 | 0 |
| Louisiana | 5 | 5 | 4 | 0 | 0 | 2 | 0 | 0 | 0 |
| Maine | 22 | 4 | 10 | 3 | 0 | 2 | 0 | 0 | 0 |
| Maryland | 7 | 4 | 21 | 0 | 0 | 9 | 0 | 0 | 1 |
| Massachusetts | 2 | 0 | 20 | 0 | 0 | 1 | 0 | 0 | 0 |
| Michigan | 10 | 0 | 5 | 0 | 3 | 2 | 0 | 2 | 2 |
| Minnesota | 28 | 0 | 23 | 0 | 0 | 2 | 1 | 0 | 0 |
| Mississippi | 0 | 0 | 14 | 0 | 0 | 2 | 0 | 0 | 1 |
| Missouri | 5 | 11 | 11 | 0 | 0 | 3 | 0 | 0 | 2 |
| Montana | 2 | 7 | 2 | 6 | 0 | 1 | 0 | 1 | 0 |
| Nebraska | 13 | 0 | 2 | 0 | 0 | 1 | 0 | 0 | 1 |
| New Jersey | 0 | 0 | 23 | 0 | 0 | 8 | 0 | 0 | 0 |
| New Mexico | 0 | 7 | 32 | 0 | 0 | 3 | 0 | 0 | 0 |
| New York | 0 | 0 | 25 | 0 | 0 | 3 | 0 | 0 | 2 |
| North Carolina | 0 | 0 | 9 | 0 | 0 | 1 | 0 | 0 | 1 |
| North Dakota | 4 | 7 | 5 | 1 | 0 | 0 | 1 | 0 | 0 |
| Ohio | 4 | 4 | 13 | 0 | 0 | 5 | 1 | 0 | 0 |
| Oklahoma | 0 | 5 | 22 | 0 | 0 | 4 | 0 | 0 | 1 |
| Oregon | 10 | 0 | 16 | 4 | 0 | 2 | 0 | 0 | 0 |
| Pennsylvania | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0 |
| Rhode Island | 20 | 0 | 4 | 0 | 0 | 1 | 0 | 0 | 3 |
| South Carolina | 4 | 0 | 19 | 0 | 0 | 5 | 0 | 0 | 1 |
| Utah | 4 | 7 | 13 | 0 | 1 | 1 | 0 | 0 | 0 |
| Vermont | 12 | 5 | 18 | 1 | 0 | 1 | 0 | 0 | 0 |
| Virginia | 2 | 0 | 22 | 2 | 1 | 3 | 0 | 0 | 0 |
| Washington | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| West Virginia | 1 | 0 | 11 | 0 | 0 | 1 | 0 | 1 | 1 |
| Wisconsin | 15 | 0 | 17 | 0 | 0 | 5 | 0 | 0 | 0 |
Amounts not established
- Arkansas:
high_income_adj_start,high_income_adj_step,high_income_adj_width. The bracket-adjustment table for net income $94,701-$97,600 ($290 falling $10 per $100 band) is part of the (a)(4) tables that are adjusted annually under 26-51-201(d); whether that method moves the adjustment amounts, the $10 step or the $100 band width (versus only the income ranges) is not established because 26-51-201(d) was not read. Engine 1.12.0 re-check: 26-51-201(d) moves 'the minimum and maximum dollar amounts for each rate bracket' only and says nothing of the (a)(4)(C) adjustment table; DFA's 2025 table kept the $100 band and $10 step with a shifted start, but no official text states the method, so the fields stay unknown (held; a projection that depends on them is refused). - Arkansas:
exemption_credit_per,senior_credit_per,blind_credit,senior_special_credit_per,dep_credit. The personal credits ($20 individual / $40 joint base, $29 per exemption in 2025-2026 DFA forms) are CPI-adjusted (vs 2001, nearest dollar) only in a year when the May general-revenue forecast shows at least 4.2% growth and further conditions in 26-51-501(f) hold; the statute's additional credits for blind/deaf and 65+ read as a flat $20 while DFA applies $29. Whether and when these credits rise cannot be established from the statute alone (revenue-conditional). Engine 1.12.0 re-check: the 26-51-501(f) revenue conditions were readable only in an unofficial copy and no official text explains DFA's $29 for the additional credits, so the fields stay unknown (held; projections depending on them are refused). - Arkansas:
ar-low-income-tables(a table held in code). The low-income tax tables (DFA booklet) are published each year; the statute governing their annual recomputation was not read, so the indexing method is not established. Engine 1.12.0 re-check: no official text of the governing statute (26-51-301) could be reached; unknown is kept. - Michigan:
blind_exemption_disabled_max_age,dep_disabled_exemption_max_age. The statute defines 'totally and permanently disabled' by Social Security Act disability (42 USC 416, MCL 206.522), which ends at full retirement age; Treasury's 2025 instructions bar the disabled exemption for those who reached 66 by February 28, 2025. Full retirement age rises to 67 for people born in 1960 or later, and no Treasury rule for later years was found, so the future cutoff (66 vs 67, and its date convention) is not established. Engine 1.12.0 re-check: MCL 206.30(3)(a) and 206.522 set no age (disability as defined in 42 USC 416); the 66 is Treasury's TY2025 date test, and no TY2026 rule is published, so the future cutoff stays unknown. - Montana:
mt-2ec(a table held in code). MCA 15-30-2337 to 2341 could not be read; whether the $12,600 exclusion, the $1,150 cap and the $45,000 limit move after 2025 is not established (the engine carries the 2025 figures). - West Virginia:
wv-heptc(a table held in code). The HEPTC income test is 300% of the federal poverty guideline for the household size, which the U.S. Department of Health and Human Services sets each year; the engine carries the 2025 figures and how later years move is the guideline's, not a CPI rule.
Limits of an estimate
- The factor is the caller's assumption; the index a state uses will differ from it, and a statute measures it over its own period.
- The increase is applied to the 2026 amount; a statute that rounds each year's amount from the year before can land one rounding step away.
- The federal side is projected by the federal engine's own registry (federal engine 2.0: how the
federal amounts move):
computeFederalwithprojectionprices the federal return of the same year with the same factor and indexing, and the planner's one setting moves the federal and the state amounts alike.