Update New Jersey Stay NJ property tax relief baseline#8734
Update New Jersey Stay NJ property tax relief baseline#8734daphnehanse11 wants to merge 5 commits into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8734 +/- ##
============================================
- Coverage 100.00% 81.59% -18.41%
============================================
Files 5 9 +4
Lines 73 163 +90
============================================
+ Hits 73 133 +60
- Misses 0 30 +30
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:
|
Program Review — PR #8734 (NJ Stay NJ / ANCHOR / Senior Freeze property tax relief)New Jersey unifies Stay NJ, ANCHOR, and Senior Freeze under a new Source Documents
Critical (Must Fix)C1 — Ungated income formula reads a 2025-only list parameter → TypeError crash for any pre-2025 simulation.
C2 — Broken HTML anchor Should AddressS1 — Missing session-law / statute citations on new variables. S2 — Retroactive ANCHOR cap is a baseline change for prior years (2022–2025). Capping ANCHOR by property taxes paid changes baseline outputs for 2022–2025, not just going forward. Note for reviewers: the "Household API Partners" CI job passed, which empirically clears the partner-test risk for this baseline change — but the prior-year behavior change should be acknowledged in the PR description. S3 — Test coverage gaps (the PAS-1 income logic is the weakest area):
S4 — Param description verb is non-standard. Suggestions
PDF / Income Audit Summary
No double-counting: Validation Summary
Investigated & cleared (not findings)
Review Severity: REQUEST_CHANGESTwo must-fix items (one latent crash, one broken anchor) block merge; the income definition and offset logic are otherwise substantively correct. Next StepsRun 🤖 Generated with Claude Code |
Re-review — PR #8734 (NJ Stay NJ / ANCHOR / Senior Freeze) — updated after fix commit
|
| Prior critical | Status |
|---|---|
Pre-2025 TypeError (ungated income formula reading a 2025-only list param) |
✅ Fixed — nj_property_tax_relief_income is now formula_2026, so it's never evaluated before its param exists; pre-2026 inactivity is now tested |
Broken HTML anchor #PAS1IncomeCalculation |
✅ Fixed — now #collapsePAS in both additional_sources.yaml and nj_property_tax_relief_income.py |
🟡 Should — mostly addressed
- Citations (partial):
nj_property_tax_relief.py/nj_capped_senior_freeze.pynow cite P.L. 2023 c.75 (Stay NJ) and the PTR page. The literal permanent-statute stringN.J.S.A. 54:4-8.67is still absent — minor nit. - Test coverage (substantially added): per-source income isolation (tax-exempt interest, tax-exempt IRA, Social Security, pre-FRA disability), pre-2026 inactivity, age-65 just-below-limit eligibility, and the ANCHOR-cap non-binding direction.
🟢 Suggestions (optional)
additional_sources.yamlbase date is2025-01-01while the consumer is gated to 2026 — harmless (never read before 2026), but a2026-01-01base or a comment would make intent explicit.- One remaining test gap: a Senior-Freeze full-absorption case isolated from the property-tax cap.
- Roth IRA line-c naming is broader than the form line; an explicit combined cap
min_(anchor + sf + staynj, property_taxes)would be more self-documenting; a comment notingtotal_disability_paymentsexcludes VA/military disability.
Confirmed still correct
Offset ordering (ANCHOR → Senior Freeze → Stay NJ residual), combined property-tax cap, ANCHOR homeowner cap, and the PAS-1 income definition (unchanged this update; maps 1:1 to lines a–e, SS is gross Box 5, no double-counting).
Verification
- NJ credit tests: 170 passed, 0 failed locally; CI states-non-ny shards green. Only
codecov/project(coverage) is red — non-blocking.
Updated severity: APPROVE
Both blocking criticals are fixed and tests pass. Remaining items are a minor citation nit and optional clarity/test suggestions — none blocking.
Summary
Closes #8733.
Tests
uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/anchor/nj_anchor.yaml -c policyengine_usuv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/staynj/nj_staynj.yaml policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/staynj/nj_capped_senior_freeze.yaml policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/property_tax_relief/nj_property_tax_relief.yaml policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/property_tax_relief/nj_property_tax_relief_income.yaml policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/staynj/nj_staynj_eligible.yaml -c policyengine_usuv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/property_tax_credit/nj_property_tax_credit.yaml policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/property_tax_credit/nj_property_tax_credit_eligible.yaml policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/deductions/property_tax/nj_potential_property_tax_deduction.yaml -c policyengine_usuv run pytest policyengine_us/tests/test_parameter_files.pygit diff --check