Skip to content

Virginia 2026 Appropriation Act tax provisions (HB 30)#9031

Merged
DTrim99 merged 4 commits into
PolicyEngine:mainfrom
DTrim99:va-standard-deduction-2026-budget
Jul 14, 2026
Merged

Virginia 2026 Appropriation Act tax provisions (HB 30)#9031
DTrim99 merged 4 commits into
PolicyEngine:mainfrom
DTrim99:va-standard-deduction-2026-budget

Conversation

@DTrim99

@DTrim99 DTrim99 commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Encodes the individual-income-tax provisions of Virginia's 2026 Appropriation Act (HB 30, Special Session I, Chapter 1), verified against the enacted conference-report language and the VA Dept. of Taxation 2026 Legislative Summary.

1. Standard deduction increase (Item 4-14 #1c)

Filing status TY2026 (unchanged) TY2027 TY2028–2029 TY2030 (sunset)
Single / separate / HoH / surviving spouse $8,750 $9,200 (+$450) $9,300 $3,000
Married filing jointly $17,500 $18,400 (+$900) $18,600 $6,000

2. Refundable EITC extension (3rd enactment clause)

Extends the 20% refundable EITC match through TY2029; it expires (0%) for tax years beginning on/after Jan 1, 2030.

  • eitc/match/refundable.yaml: 20% now runs 2025–2029, then 0 in 2030.
  • Correction: the prior parameter reverted to 15% in 2027. Per Va. Code § 58.1-339.8 (refundable credit specified only through TY2026) and the legislative summary ("scheduled to expire"), the refundable credit expires to 0 — it does not revert to 15%. This is corrected here.

3. Eligible educator expense deduction (Va. Code § 58.1-322.03)

Reinstates the deduction of the lesser of $500 or eligible educator expenses not claimed federally, for TY2026+ (was TY2022–2024; did not apply TY2025).

  • New va_educator_expense_deduction_person, wired into VA subtractions.
  • Modeled as an explicit input (defaults to $0) because the excess-over-federal amount isn't identified in the baseline data — the federal educator deduction is above-the-line and already in federal AGI, so a flat min($500, educator_expense) would double-count. This matches the Ohio educator-deduction treatment. Reviewer note: happy to instead model a bounded min($500, educator_expense) if the team prefers a non-zero microsim estimate over strict statutory accuracy.

4. IRC conformity change (HB 29 / HB 30) — no PE change

The 2026 budget replaces rolling IRC conformity with a fixed Dec 31, 2025 date (generally conforming to OBBBA / P.L. 119-21 for individuals). This needs no PE change:

  • VA's individual base is federal AGI (va_agi.py), so individual OBBBA conformity flows in automatically.
  • The business/corporate deconformity items (QPP §168(n), R&E §174A, §179, and the §163(j) business-interest subtraction reduction 50%→20%) are not modeled in PE-US's individual model.
  • VA continues to apply the Pease itemized-deduction reduction, which PE already models and which is unchanged.

Tests

Standard deduction (TY2027/2028/2030), refundable EITC (TY2029 at 20%, TY2030 expired), and the educator deduction (default $0; input flows into VA subtractions).

🤖 Generated with Claude Code

DTrim99 and others added 2 commits July 14, 2026 10:48
The 2026 Appropriation Act (HB 30, Special Session I, Chapter 1), Item
4-14 #1c, raises Virginia's standard deduction to $9,200 (single) /
$18,400 (joint) for tax year 2027 and $9,300 / $18,600 for tax years
2028-2029, and moves the sunset to the pre-2019 amounts ($3,000 / $6,000)
to tax year 2030.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Refundable EITC: extend the 20% match through TY2029 and expire (0%) for
  TY2030+, per HB 30's third enactment clause. This also corrects the prior
  2027 value (0.15): the statute and legislative summary state the refundable
  credit expires, it does not revert to 15%.
- Eligible educator expense deduction (Va. Code 58.1-322.03): add a VA
  subtraction of up to $500 for expenses not claimed federally, reinstated for
  TY2026+. Modeled as an explicit input (defaults to $0) because the excess-
  over-federal amount is not identified in the baseline data, matching the
  Ohio educator-deduction treatment.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@DTrim99 DTrim99 changed the title Raise Virginia standard deduction (2026 Appropriation Act, HB 30) Virginia 2026 Appropriation Act tax provisions (HB 30) Jul 14, 2026
@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (3ee920d) to head (07e1fcc).
⚠️ Report is 11 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9031   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            1         3    +2     
  Lines           10        40   +30     
=========================================
+ Hits            10        40   +30     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@DTrim99 DTrim99 marked this pull request as ready for review July 14, 2026 17:52
@DTrim99 DTrim99 requested a review from daphnehanse11 July 14, 2026 17:52
@daphnehanse11

Copy link
Copy Markdown
Collaborator

PR Review

Four-validator review (regulatory accuracy, reference quality, code patterns, test coverage) run against the PR head in a clean worktree. No critical issues found — the substantive legal claims were independently verified as correct.

✅ Verified correct

  • Standard deduction (parameters/gov/states/va/tax/income/deductions/standard.yaml): TY2027 $9,200/$18,400, TY2028–2029 $9,300/$18,600, TY2030 sunset to $3,000/$6,000 — all confirmed against HB 30 Item 4-14 #1c and Va. Code § 58.1-322.03(1)(b). TY2026 correctly inherits $8,750/$17,500 with no new entry needed.
  • Refundable EITC expires to 0%, not 15% (eitc/match/refundable.yaml): confirmed. § 58.1-339.8(B)(3) authorizes the refundable option only in discrete year windows (no residual 15% floor), and Item 4-14 #1c extends the sunset "before January 1, 2030." The prior 2027-01-01: 0.15 encoding was wrong; this PR's correction is right. Leaving the permanent 20% non-refundable credit (§ 58.1-339.8(B)(2)) untouched is also correct.
  • IRC conformity — no PE change: reasoning is sound (VA starts from federal AGI; the date advance introduces no individual-side deconformity PE models).
  • Ohio precedent claim: verified — oh_educator_expense_deduction_person is structurally identical (raw input, default 0, no cap, no year gating).
  • All new test arithmetic checks out, and CI is fully green.

🟡 Should address

  1. Educator deduction has no year gatingva_educator_expense_deduction_person is added to subtractions.yaml from 2021-01-01 unconditionally, so a nonzero input flows into va_subtractions in TY2021 and TY2025, years the deduction was not in law (statute: TY2022–2024 and TY2026+ only). Default-0 means baseline runs are unaffected, but it's a latent accuracy gap. Since input variables can no longer carry formulas (per the pure-leaf-inputs check), gating would need to live in the va_subtractions aggregation or a gated derived variable — or at minimum document the unenforced windows with a TY2025 test.
  2. Missing boundary tests for the exact values this PR changes:
    • Refundable EITC TY2027 and TY2028 at 20% — these are the years the PR changes from the prior 15% reversion, and neither is tested (only 2029 and 2030 are).
    • Standard deduction TY2029 (last year at $9,300/$18,600 before the sunset) and TY2026 (regression guard that HB 30 leaves $8,750/$17,500 unchanged).
  3. Reference precision (values are correct; the links don't land on them):
    • refundable.yaml: the budget.lis.virginia.gov/bill/2026/2/HB30/Introduced/ link resolves to a portal outline with no enactment-clause text. Cite the Item 4-14 #1c amendment URL (which does display the EITC sunset language) or the chaptered bill PDF page.
    • The three 2026 Legislative Summary PDF references (refundable.yaml, standard.yaml, and the variable) lack #page= anchors, unlike the older references in the same files.
    • Both budget links use the /Introduced/ path while the titles say "Chapter 1" — cite the enacted/chaptered version.
    • The Va. Code hrefs point to the full Article 2 listing; the precise section URL exists: https://law.lis.virginia.gov/vacode/title58.1/section58.1-322.03/ (matching the pattern already used for § 58.1-339.8).
  4. Deduction routed through the subtractions aggregate — § 58.1-322.03 is a deduction, but the variable is added to subtractions.yaml (§ 58.1-322.02), so it reduces va_agi rather than entering at the deductions step. Anything keyed off VAGI (age-deduction phaseout, low-income credit) would see the reduced value. Worth confirming this placement is intended (Ohio files its educator variable under deductions/).
  5. Changelog fragment location — the three fragments use root-level name.{type}.md naming; the dominant repo convention is changelog.d/{added,changed}/{PR#}.md. Content style is fine — confirm the root-infix form is accepted by the changelog tooling or move them.
  6. refundable.yaml: trailing whitespace on the final line.

🟢 Suggestions

  1. The $500 statutory cap is un-parameterized and unenforced (an input of $800 flows through). This matches the Ohio precedent and there's no formula to hard-code into, so it's consistent with repo standards — but a cap parameter + capped derived variable would enforce § 58.1-322.03's "lesser of $500" language (the PR description already offers this).
  2. educator_expense/ subfolder holds a single file; sibling person-level VA subtractions sit directly in subtractions/.
  3. default_value = 0 is redundant for a float (Ohio does it too; harmless).
  4. standard.yaml reference title embeds dollar amounts ("…$9,200/$18,400 for TY2027…"); titles conventionally carry the citation only.
  5. Nice-to-have tests: SEPARATE/HOH/SURVIVING_SPOUSE for a new year, non-VA defined_for gating on the educator input, and an integration case asserting the educator input reduces va_agi/va_taxable_income rather than stopping at va_subtractions.

Validation summary

Check Result
Regulatory accuracy 0 critical — key claims verified; 1 should-fix (year gating)
Reference quality 0 critical — all values corroborated; 4 precision issues
Code patterns 0 critical — 4 should-fix, 4 suggestions
Test coverage 5 high-priority gaps (EITC 2027/2028, SD 2026/2029, educator TY2025)
CI status ✅ All 36 checks passing

Overall: COMMENT — no blocking issues; the legal substance is right. The main asks are the boundary-year tests for the values this PR actually changes, and a decision on educator-deduction year gating.

🤖 Generated with Claude Code

@daphnehanse11 daphnehanse11 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

commented. just nits

Educator deduction (should-address PolicyEngine#1, PolicyEngine#4; suggestions PolicyEngine#1, PolicyEngine#2):
- Reclassify as a deduction (Va. Code 58.1-322.03), not a subtraction: move
  from subtractions.yaml into va_taxable_income atop itemized (like the CDCC
  deduction), so it no longer reduces VAGI.
- Enforce the $500 per-educator cap and year-gate it (0 for TY2025 and pre-
  2022) via a cap parameter, with eligible expenses as a raw input.

Tests (should-address PolicyEngine#2; suggestion PolicyEngine#5): add refundable EITC TY2027/TY2028
(20%), standard deduction TY2026 regression and TY2029, other filing statuses
for TY2027, and educator cap/year-gate/per-educator/non-VA/va_taxable_income
integration cases.

References (should-address PolicyEngine#3, PolicyEngine#6; suggestion PolicyEngine#4): precise section URLs,
#page anchors on the 2026 legislative summary, better HB 30 amendment link,
trimmed the standard-deduction title, removed trailing whitespace.

Changelog fragments kept at changelog.d root per CLAUDE.md (top-level files,
no type subdirectories), which supersedes the review's move-to-subdir note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator Author

Fixes applied (@daphnehanse11 review)

Thanks — addressed everything. No critical issues; the substance was verified. Details:

🟡 Should address — all fixed

  1. Educator deduction reclassified + year-gated. It's a deduction (§ 58.1-322.03), so I moved it out of subtractions.yaml and into va_taxable_income atop itemized (mirroring va_child_dependent_care_expense_deduction) — it no longer reduces VAGI. It's now year-gated (cap = $0 for TY2025 and pre-2022) and the $500 per-educator cap is enforced, via a cap parameter with eligible expenses as a raw input (va_educator_expenses).
  2. Boundary tests added: refundable EITC TY2027 & TY2028 (20%), standard deduction TY2026 regression ($8,750/$17,500 unchanged) and TY2029 ($9,300/$18,600).
  3. Reference precision: precise § URLs (.../section58.1-322.03/, .../section58.1-339.8/), #page=9/#page=10 on the 2026 Legislative Summary, replaced the refundable.yaml portal link with the Item 4-14 #1c amendment URL.
  4. Placement (§ 58.1-322.03 deduction vs § 58.1-322.02 subtraction): fixed as in Basic prototype #1 — now enters at the deductions step.
  5. Changelog location: kept at changelog.d/ root (name.type.md). Per this repo's CLAUDE.md, fragments must be top-level files with no type subdirectories, which supersedes the move-to-subdir suggestion.
  6. Trailing whitespace on refundable.yaml removed.

🟢 Suggestions — applied

  1. $500 cap now parameterized and enforced (deductions/educator_expense/cap.yaml) via the derived deduction variable.
  2. Educator files now sit in deductions/educator_expense/ (3 files: cap param + raw input + deduction), no longer a single-file subfolder.
  3. Dropped the redundant default_value = 0.
  4. Trimmed dollar amounts from the standard-deduction reference title.
  5. Added the nice-to-have tests: SEPARATE/HoH/surviving-spouse (TY2027), non-VA defined_for gating, and a va_taxable_income integration case (educator input reduces taxable income, not just subtractions).

CI re-running; I'll confirm green.

@daphnehanse11

Copy link
Copy Markdown
Collaborator

Re-review of 9148f00 ("Address Daphne's review")

The restructure resolves nearly everything from the previous review. Verified against the delta:

✅ Resolved

  • Year gating, $500 cap, and statutory routing — all fixed at once by the new architecture: va_educator_expenses (person-level input) → va_educator_expense_deduction (tax-unit formula, min_ against the new educator_expense/cap.yaml, summed per eligible educator) → subtracted directly in va_taxable_income. The cap parameter's 2025-01-01: 0 entry correctly encodes the TY2025 gap year, and the deduction no longer flows through the § 58.1-322.02 subtractions aggregate.
  • All high-priority test gaps closed — EITC 2027/2028 at 20%, standard deduction 2026 regression guard and 2029 pre-sunset year, SEPARATE/HOH/SURVIVING_SPOUSE, plus educator tests covering the cap binding ($800→$500), below-cap, TY2025 unavailability, non-VA gating, per-educator cap ($500×2→$1,000), and flow-through to va_taxable_income.
  • References — refundable EITC now cites the Item 4-14 #1c amendment URL (which displays the sunset language), the legislative-summary PDFs have #page= anchors, the Va. Code links use the precise section URL, the value-laden reference title was cleaned up, and the trailing whitespace is gone.

🟡 Two remaining items

  1. cap.yaml has no value before 2022-01-01, and va_taxable_income now computes the educator deduction unconditionally. policyengine-core's Parameter._get_at_instant returns None for instants before the first defined value, so any VA taxable-income calculation for 2021 or earlier hits min_(expenses, None) and errors. The formula comment says the cap is "0 for TY2025 (and before TY2022)", but the parameter only encodes the former. Fix: add an early zero entry (e.g. 2021-01-01: 0 or earlier) to cap.yaml.
  2. Wrong subdivision in the cap.yaml reference title: it cites "Code of Virginia § 58.1-322.03.14", but the eligible educator expense deduction is subdivision 18 of § 58.1-322.03 (verified against law.lis.virginia.gov: "For taxable years beginning on and after January 1, 2022, but before January 1, 2025, and for taxable years beginning on and after January 1, 2026, the lesser of $500 or the actual amount paid or incurred for eligible educator qualifying expenses").

CI on this commit was still in progress at review time (18 checks passed, full-suite shards pending, none failing).

🤖 Generated with Claude Code

- Add 2021-01-01: 0 to the educator cap so VA taxable-income calculations
  before 2022 do not hit min_(expenses, None) and error (va_taxable_income
  now computes the deduction unconditionally). Adds 2021 and 2024 regression
  tests.
- Correct the cap reference subdivision: the eligible educator expense
  deduction is Va. Code 58.1-322.03 subdivision 18, not 14.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Jul 14, 2026

Copy link
Copy Markdown
Collaborator Author

Two follow-up fixes

  1. Pre-2022 cap floor (would error): va_taxable_income now computes va_educator_expense_deduction unconditionally, and the cap had no value before 2022-01-01 — so any VA taxable-income calc for 2021 or earlier hit min_(expenses, None) and errored. Added 2021-01-01: 0 to cap.yaml (making the formula comment's "0 … before TY2022" true), plus 2021 and 2024 regression tests (2021 asserts the deduction is $0 and va_taxable_income computes cleanly).
  2. Statute subdivision: corrected the cap reference from § 58.1-322.03.14 to .18 — the eligible educator expense deduction is subdivision 18.

Thanks for the sharp catches. Pushed.

@daphnehanse11 daphnehanse11 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@DTrim99 DTrim99 merged commit 7cdedca into PolicyEngine:main Jul 14, 2026
35 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants