Skip to content

Match Vermont renter credit base amounts for Franklin and Grand Isle to the department's tables - #10130

Merged
MaxGhenis merged 4 commits into
mainfrom
fix-vt-renter-credit-franklin-fmr
Oct 13, 2026
Merged

MaxGhenis merged 4 commits into
mainfrom
fix-vt-renter-credit-franklin-fmr

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Summary

PE's Vermont renter credit for Franklin and Grand Isle was $1 above the Department of Taxes' published tables in these county-size groups:

  • 2022, sizes 4–8: PE $1,774 vs published $1,773.
  • 2023, size 3: PE $1,750 vs published $1,749.
  • 2025, size 1: PE $1,270 vs published $1,269.
  • 2025, size 3: PE $2,026 vs published $2,025.

This PR stores reconstructed statewide-average monthly rents to the cent for 2022, 2023 and 2025, and rounds the base credit to whole dollars before applying the income phase-out. It also rounds the final credit half up, matching the department calculators and retaining coverage of exact 50-cent ties.

Independent review verified all 560 full-credit county × household-size × year outcomes against the official 2021–2025 workbooks. The final-rounding correction also applies beyond those years, including the existing temporary 12.5% rate in 2027.

Published amounts and historical reconstructions

32 V.S.A. §6061(7)(C) defines fair market rent as HUD's FMR for the claimant's area as of June 30 of the taxable year. For Franklin or Grand Isle, it specifies the statewide average. For 2021–2025, §6066(b) bases the credit on 10% of annual fair market rent, subject to the $2,500 cap.

For other counties, the 2021–2025 published full-credit amounts match MIN(ROUND(HUD monthly FMR × 12 × 10%, 0), 2,500), using HUD's fiscal-year file containing June 30 and the rent for min(household size, 4) bedrooms. The 2021 calculator explicitly computes this rounded base amount. Chittenden's capped rents are represented in PE as $2,083 per month.

The following historical reconstructions reproduce all four published Franklin/Grand Isle amounts for each year. The 2022–2025 workbooks hard-code their credit tables; they do not contain formulas establishing the averaging methods below as department rules. In particular, excluding Addison in 2022 and capping Burlington's four-bedroom rent in 2023 are inferred reconstructions, not instructions to carry into another year.

Tax year Reconstruction reproducing the published table Monthly FMR, 1–4 bedrooms Published credit, sizes 1–4
2021 Mean of 12 HUD FMR areas, rounded to whole dollars, matching the calculator's FMR table 810; 1,000; 1,291; 1,419 972; 1,200; 1,549; 1,703
2022 Mean of 11 areas excluding Addison, retained to cents 838.36; 1,035.36; 1,334.91; 1,477.91 1,006; 1,242; 1,602; 1,773
2023 Mean of 12 areas, with Burlington's four-bedroom rent held to 2,083.33, retained to cents 919.50; 1,131.83; 1,457.83; 1,586.94 1,103; 1,358; 1,749; 1,904
2024 Mean of 12 areas, rounded to whole dollars 1,045; 1,283; 1,663; 1,800 1,254; 1,540; 1,996; 2,160
2025 Mean of 12 areas, retained to cents 1,057.75; 1,298; 1,687.17; 1,828.75 1,269; 1,558; 2,025; 2,195

The 12 areas are the 11 nonmetro counties and the Burlington–South Burlington MSA, which includes Franklin and Grand Isle. Means over the 14 counties or 255 towns do not reproduce the published tables. The plain 12-area mean in 2022 produces credits of $1,010, $1,251, $1,611 and $1,777; omitting any area other than Addison reproduces none of the four published cells. Without the reconstructed Burlington cap in 2023, the four-bedroom credit would be $1,913.

Whole-dollar rounding does not explain the previous 2025 size-3 rent of $1,688: the reconstructed mean is $1,687.17 and rounds to $1,687. The origin of $1,688 remains unexplained. This PR instead uses the rent that reproduces the published $2,025 credit.

The calculators apply the phase-out to their whole-dollar base credit and round the resulting credit half up with ROUND(..., 0): Calculator!G16 in 2021 and 2022, and Calculator!G17 in 2023, 2024, and 2025. The 2023 workbook is cited through its archived official URL.

Changes

  • parameters/.../renter/fair_market_rent.yaml: changes 46 numeric cells, exclusively Franklin and Grand Isle for 2022, 2023 and 2025; labels the inferred averaging methods as reconstructions; corrects the 2022 renter calculator reference; and adds statutory, calculator, report and HUD references.
  • variables/.../renter/vt_renter_credit.py: rounds the base with np.floor(fmr * MONTHS_IN_YEAR * p.fmr_rate + 0.5) before phase-out, and rounds the final non-negative credit with np.floor(unrounded + 0.5). Unsubsidized partial credits multiply the whole-dollar base by the income difference before dividing by the phase-out band, preserving exact half-dollar results for whole-dollar inputs.
  • test_vt_renter_credit_amounts.py: removes the grid and Hypothesis exclusions for final-rounding ties, so those scenarios are checked against the calculator's half-up formula.
  • vt_renter_credit.yaml: adds explicit final-rounding ties for Franklin and Lamoille in 2025, a non-midpoint tie for Caledonia in 2022, and a 2027 full-credit tie in Addison.

The 2025 four-bedroom statewide-average base is itself a tie: $1,828.75 × 12 × 10% = $2,194.50, rounded to $2,195 before phase-out.

The formula continues to apply in 2027 and later. The existing rate parameter temporarily rises to 12.5% in 2027 and returns to 10% in 2028, under 2026 Vt. Acts No. 169, §§8 and 10. At the 2027 rate, Addison's one-person base becomes $1,655 instead of $1,654. Static comparison with main counts 37 full-credit county-size cells outside Franklin and Grand Isle that change in 2027, including the tested Addison cell; each increases by $1. Half-up base and final rounding continue after the rate returns to 10% in 2028.

Tests

vt_renter_credit.yaml contains 14 new cases relative to main. The original ten expectations were independently recomputed against the 2022, 2023 and 2025 calculators: five full-credit cases cover the corrected cells and the $2,194.50 base tie; five partial-credit cases cover phase-out from a whole-dollar base, including Addison's $924 credit instead of $923.

The four fix-round cases are:

County and year Household and income Arithmetic Expected credit
Franklin, 2025 One person, $36,065; unshared and unsubsidized $1,269 × ½ = $634.50, half up $635
Lamoille, 2025 One person, $34,495; unshared and unsubsidized $1,169 × ½ = $584.50, half up $585
Addison, 2027 One person, $5,000 $1,103 × 12 × 12.5% = $1,654.50, half up $1,655
Caledonia, 2022 One person, $23,500; unshared and unsubsidized $924 × (30,000 − 23,500)/(30,000 − 18,000) = $500.50, half up $501

The 2022 calculator, Calculator!G16, gives $501 for Caledonia. Dividing before multiplying produces the floating-point value 500.49999999999994; multiplying before dividing preserves 500.5 and allows the final half-up operation to return $501.

test_vt_renter_credit_amounts.py uses independent reference amounts extracted from the five calculator tables. It checks all 560 full-credit cells, partial credits on the existing 2,800-income grid for each year, and Hypothesis-generated incomes. The grid includes both income limits, their adjacent dollars, and 19 points between them; its existing $37 offset is retained. The invariants check the published base below the extremely low-income limit, the calculator's half-up phase-out formula, nonincreasing credit as income rises, and identical Franklin/Grand Isle outcomes. Exact 50-cent ties are no longer excluded; the YAML cases provide deterministic tie coverage.

The Python file verifies independent workbook-based references and randomized invariants; deterministic policy examples remain in YAML. It remains in the existing sequential Rest policy group. A passing run has 30 Simulation constructions: five full-credit batches, five income-grid batches, and 20 Hypothesis examples, each reusing the imported system's read-only policy state. Restoring ties adds no batches or CI runners. The existing Makefile records 185 seconds for the broader policy group from CI run 37198184683; no new CI benchmark was triggered.

Single local macOS/Python 3.13.9 measurements, including model loading and setup: before restoring ties, 12 passed in 330.26 seconds wall time; afterward, 12 passed in 508.12 seconds with 0.949 GiB peak RSS. The baseline peak RSS was unavailable because the sandbox denied the system query used by time -l; the final run measured child RSS with resource.getrusage. These are local samples with differing cache state and generated inputs, not Linux CI measurements or a controlled performance comparison. Logs and resource records are untracked in hub-evidence/.

Validation runs each file in a separate foreground process with all requested thread caps set to 4 and OMP_WAIT_POLICY=PASSIVE:

File Result
vt_renter_credit.yaml 25 passed
vt_renter_credit_countable_tax_exempt_ss.yaml 2 passed
vt_renter_credit_integration.yaml 2 passed
test_vt_renter_credit_amounts.py 12 passed

make format (Ruff formatting and lint) and git diff --check passed. test_vt_renter_credit_amounts.py is the only Python test file in the PR. Partner contract files are untouched.

Hub microsimulation impact (current head)

A real microsimulation on the default dataset, main at the merge base 065d0e9560 against this PR's head bd06003799, for 2024 and 2025 and 2026. The runs went one at a time under the shared heavy-job lock. Sums are weighted.

Output 2024 change 2025 change 2026 change 2024 records changed (weighted) 2025 records changed (weighted) 2026 records changed (weighted)
state_income_tax +0 +0 +0 0 (0) 0 (0) 0 (0)
income_tax +0 +0 +0 0 (0) 0 (0) 0 (0)
household_net_income +0 +0 +0 0 (0) 0 (0) 0 (0)
household_benefits +0 +0 +0 0 (0) 0 (0) 0 (0)

Run on the standard outputs only: without #10116's guard, requesting vt_renter_credit across the whole population crashes on both sides. Its only consumer is taxsim_state_property_tax_credit (the TAXSIM export), so household tax, income and benefit outputs do not change in any year.

Comparison files are in fixes/10130-impact/ on the hub host.

Impact and follow-ups

The historical household/grid comparisons identify changes of at most $1 per tax unit, including other counties' partial credits and final-rounding ties. The static 2027 comparison also finds 12 Franklin/Grand Isle full-credit cells decreasing by $1 through the corrected rents carried forward, in addition to the 37 other-county cells increasing by $1 through half-up base rounding: 49 full-credit cells change in total. No aggregate microsimulation was run for this change; the hub's full-file impact run remains required.

Shared-credit rounding order remains a separate follow-up: the calculator rounds before halving a shared credit, while PE halves before final rounding. Months-rented and subsidized-month proration also remain unmodeled. Final-rounding ties are fixed and covered in this PR.

Evidence (scripts, HUD and department sources with sha256, outputs): ~/reviews/vt-renter-fmr-2026-10. Fix-round validation evidence: hub-evidence/.

Related: #10125 (income limits) and #10116 (size cap and county guard) also change vt_renter_credit.yaml and land separately; they may require test-file conflict resolution.

axiom: TheAxiomFoundation/rulespec-us#1678 queued (extended with the credit-amount rounding rule, the Franklin/Grand Isle averages and companion tests: TheAxiomFoundation/rulespec-us#1678 (comment))

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 11, 2026 17:13
Store the department's state-average fair market rents for Franklin and
Grand Isle (32 V.S.A. 6061(7)(C)) to the cent for 2022, 2023 and 2025, and
round the credit amount to whole dollars, half up, before the income
phase-out, as the department's calculator does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…calculators

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

The CI run on this pull request was cancelled at 23:27Z on 2026-10-11 to free the organization's shared GitHub runners for an urgent fix in another repository. The US + core hub will re-run it automatically (cancelled jobs only; jobs that had passed are kept). Nothing in this pull request changed. Please don't push or reopen just to restart CI.

@codecov

codecov Bot commented Oct 12, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (bd06003).
⚠️ Report is 443 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10130   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         1    -3     
  Lines           76        34   -42     
  Branches         2         0    -2     
=========================================
- Hits            76        34   -42     
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.

@MaxGhenis
MaxGhenis merged commit 2f3053c into main Oct 13, 2026
28 checks passed
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10130 at bd06003799e223a999ddd24a988d354ec478dd67 (squash): Match Vermont renter credit base amounts for Franklin and Grand Isle to the department's tables.

@MaxGhenis
MaxGhenis deleted the fix-vt-renter-credit-franklin-fmr branch October 13, 2026 09:08
MaxGhenis added a commit that referenced this pull request Oct 13, 2026
Main's #10130 changed vt_renter_credit.py (base rounded to whole dollars,
final credit half up) and appended cases to vt_renter_credit.yaml. Every case
from both sides is kept; a rounding audit shows none of this PR's nine
expectations change under main's rounding. 590 tests pass on this tree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

1 participant