Skip to content

Add Tennessee elderly property tax relief#8307

Open
daphnehanse11 wants to merge 11 commits into
PolicyEngine:mainfrom
daphnehanse11:codex/tn-elderly-property-tax-relief
Open

Add Tennessee elderly property tax relief#8307
daphnehanse11 wants to merge 11 commits into
PolicyEngine:mainfrom
daphnehanse11:codex/tn-elderly-property-tax-relief

Conversation

@daphnehanse11

@daphnehanse11 daphnehanse11 commented May 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add Tennessee Property Tax Relief for Elderly Homeowners.
  • Parameterize age, residential assessment rate, income limits, and qualifying property value cap.
  • Include 2025 and 2026 values: income limit 37,530 in 2025 and 38,470 in 2026; property value cap 32,700 for both years.
  • Add focused eligibility and amount tests.
  • Keep the rule household-calculator-only for now; this PR does not wire the relief into refundable or property-tax-credit aggregates while assessed-property-value data readiness is unresolved.

Modeling notes

  • Uses real_estate_taxes to preserve local tax-rate differences.
  • Converts the published full-market-value cap to an assessed-value cap using Tennessee's 25% residential assessment rate.
  • Uses adjusted gross income as the modeled tax-unit income proxy.

Tests

  • PYTHONPATH=. /Users/daphnehansell/Documents/GitHub/policyengine-us/.venv/bin/python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief -c policyengine_us
  • /Users/daphnehansell/Documents/GitHub/policyengine-us/.venv/bin/ruff check policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_relief

Closes #8203

@codecov

codecov Bot commented May 14, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (fbace93) to head (6650d99).
⚠️ Report is 18 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #8307   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            1         3    +2     
  Lines           23        47   +24     
=========================================
+ Hits            23        47   +24     
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.

@daphnehanse11 daphnehanse11 marked this pull request as draft May 14, 2026 20:29
@daphnehanse11 daphnehanse11 marked this pull request as ready for review May 18, 2026 20:04
@MaxGhenis MaxGhenis marked this pull request as draft May 19, 2026 13:23
@MaxGhenis

Copy link
Copy Markdown
Contributor

Converted this to draft for the same data-readiness reason as #8303, but scoped to property tax data. This PR relies on assessed_property_value, which is currently only a PolicyEngine-US input variable and is not present/imputed in policyengine-us-data; rent and real_estate_taxes are data-backed, but assessed value is not. The rule tests are still useful, but baseline wiring into refundable/property-tax-credit aggregates should wait until we either add an assessed-value data/imputation path or revise the formula to rely only on data-backed inputs.

daphnehanse11 and others added 3 commits May 19, 2026 12:18
Create tn_refundable_credits variable and refundable.yaml list, and
add tn_refundable_credits to household_refundable_state_credits. The
relief now flows through household_refundable_state_tax_credits to
household_net_income, mirroring the pattern used for WA Working
Families Tax Credit (also a state without an income tax).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@daphnehanse11 daphnehanse11 force-pushed the codex/tn-elderly-property-tax-relief branch from c276acb to 771f837 Compare May 19, 2026 16:20
@daphnehanse11 daphnehanse11 requested a review from hua7450 June 16, 2026 16:54
@daphnehanse11 daphnehanse11 marked this pull request as ready for review June 16, 2026 16:54

@hua7450 hua7450 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.

🔍 Program Review — Tennessee Elderly Property Tax Relief

Tennessee implements Tenn. Code Ann. § 67-5-702 property tax relief for low-income elderly homeowners (age ≥ 65) by prorating real-estate taxes over the relief-eligible portion of assessed value. The implementation is structurally sound and fully parameter-driven — eligibility operators, the 25% assessment mechanism, and the proration math all faithfully encode § 67-5-702. One confirmed CRITICAL value error remains, plus several should-address robustness, scoping, and test-coverage gaps.

Scope: PR changes only — 10 files (4 params, 3 variables, 2 tests, 1 changelog). Branch is 0 behind main.

Source Documents

Document Link
2025 TN Comptroller Tax Relief Brochure (TY2025 values, p.2) https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2
Tenn. Code Ann. §§ 67-5-701–704 (§ 702 on p.3) https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/tax%20relief%20tca.pdf#page=3
Robertson County Trustee — TY2026 values ($33,600 / $38,470) https://www.robertsoncountytn.gov/local_government/trustee/tax_relief.php

🔴 Critical (Must Fix)

C1. 2026 property-value cap is wrong — should be $33,600, not $32,700
policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/property_value_cap.yaml

values:
  2025-01-01: 32_700
  2026-01-01: 32_700   # WRONG — stale 2025 value frozen into 2026

§ 67-5-702(a)(3)(B) requires the cap to be CPI-adjusted every tax year. $32,700 is the TY2025 value. The TY2026 cap is $33,600, verified against primary sources:

  • Robertson County Trustee (program administrator): "payment of the tax on an 2026 appraised property value of up to $33,600."
  • Corroborated by Nashville/Davidson, Blount County, and the AARP-TN guide; consistent with the parallel income-limit rise ($37,530 → $38,470) and the statute's mandated annual adjustment ($32,700 × ~1.0275 ≈ $33,600).
  • The lone $32,700-for-2026 source (UT-MTAS) was last reviewed 12/11/2025, before the 2026 figures were set — it is stale.

Fix (one change, three coupled edits):

  2026-01-01: 33_600   # TY2026 COLA-adjusted cap
  • Assessed cap $8,175 → $8,400 (= $33,600 × 25%)
  • tn_elderly_property_tax_relief.yaml Case 1 (period 2026): relief $327 → $336, comment → "33,600 × 25% = 8,400"
  • Repoint the 2026 reference to a 2026-specific source (Robertson County trustee; the Comptroller's 2026 brochure isn't posted until Oct 2026)
  • ⚠️ Keep the 2026-01-01 entry — once corrected it is no longer a duplicate.

🟡 Should Address

Finding Location
S1 Unguarded / assessed_property_value0/0 = nan under vectorized microsim (defined_for masks output, not execution). Latent now (household-only), but SC/MS/KY all guard it. Fix: / max_(assessed_property_value, 1). (Rated CRITICAL by the code-pattern validator.) tn_elderly_property_tax_relief.py:27
S2 Assessed value + taxes summed over the whole tax unit incl. dependents; statute ties relief to the owner. SC/MS/KY scope to head/joint-spouse ...relief.py:19,25; ..._eligible.py:24-25
S3 Income uses adjusted_gross_income proxy — omits untaxed SS / muni interest vs statutory "income from all sources"; variable has no reference or explanatory comment ..._income.py:12
S4 2026 income limit (38_470, value correct) cites the Tax Freeze doc for a Tax Relief param — program/document mismatch; prefer the brochure or § 67-5-702(a)(2) income_limit.yaml:13-14
S5 Param PDF hrefs lack #page= anchors (correct: brochure #page=2, statute § 702 #page=3) all 4 param files
S6 assessment_rate cites § 67-5-801 (general); the operative 25% is in § 67-5-702(b)(2) — tighten primary citation assessment_rate.yaml
S7 2025 income limit only tested at $37,531 ($1 over); no at-/below-limit case and no 2025 positive-benefit case both test yamls
S8 Untested: assessed-value-at-cap boundary ($8,400 after C1); benefit var for a non-TN household; eligibility >0 gates as false both test yamls

🟢 Suggestions

  • G1. assessment_rate.yaml secondary ref is non-.gov Justia — prefer the .gov statute PDF as primary (pairs with S6).

PDF Audit: 5 confirmed correct, 1 confirmed mismatch

Parameter Repo Source Status
age_threshold 65 65
assessment_rate 0.25 25% (§ 702(b)(2))
income_limit 2025 / 2026 37_530 / 38_470 $37,530 / $38,470
property_value_cap 2025 32_700 $32,700 market
property_value_cap 2026 32_700 $33,600 ❌ mismatch

Formula integrity confirmed: cap stored as MARKET value, assessment_rate applied exactly once.

⚖️ Review Severity: REQUEST_CHANGES

One confirmed CRITICAL value error (2026 cap), with the assessed-cap and 2026-test-case updates required as part of the same fix.

@daphnehanse11 daphnehanse11 requested a review from hua7450 June 16, 2026 20:21
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.

Add Tennessee Property Tax Relief for Elderly Homeowners

3 participants