Repository navigation
Follow the statute for the NYC school tax rate reduction, IN supplemental homestead, VA 529 and WA senior/disabled property tax exemption - #10330
Conversation
… reduction amount Tax Law § 606(ggg)(4-b)(A)-(C), as enacted by L.2017, ch. 59, Part C, § 2 for tax years from 2017, gives the amount over each threshold as a fixed base ($37 joint and surviving spouse, $25 head of household, $21 single and separate) plus 0.228% of the excess, not the first band carried forward at 0.171%. Fixes #8947. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…estead IC 6-1.1-20.6-7.7(b)-(d) (SEA 1 2025, SECTION 74) gives the credit only to a person who qualifies for the IC 6-1.1-12-37 homestead standard deduction (or that person's surviving spouse), computes it on the liability of that homestead, and leaves out referendum-approved taxes. Generic real_estate_taxes establish none of these, so qualification, the homestead liability and its referendum component become tax-unit inputs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…forward excess Va. Code § 58.1-322.03(7)(a) limits the deduction to $4,000 per contract or account and carries forward the excess until fully deducted; (7)(b) lets an owner aged 70 or older deduct the full amount less amounts previously deducted. Add va_529_plan_deduction_capped_amount (account-level result, defaulting to an even split across accounts) and va_529_plan_carryforward. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…led property tax exemption RCW 84.36.381(3)(a) admits a claimant under the age threshold only if retired from regular gainful employment by reason of disability, or as a veteran entitled to and receiving VA compensation at a total disability rating or, from collection year 2020, a combined rating of 80% (40% from 2027). Before 2016 the veteran text can be read more than one way, so generic disability is kept for veterans in those years. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
nyc_school_tax_credit.yaml and the NYC school tax credit reform tests asserted the first band carried forward at 0.171% (20.52 single, 36.936 joint) to 0.01; they now use the § 606(ggg)(4-b) bases of $21 and $37. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… base A single filer with $100,000 of wages has city taxable income of $92,000, so the rate reduction amount is $21 + 0.228% x 80,000 = $203.40, $0.48 more than before; NYC tax, SPM taxes and SPM net income move by $0.48. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Follow the statute for the NYC school tax rate reduction, IN supplemental homestead, VA 529 and WA senior/disabled property tax exemptionPR #10330 (author: MaxGhenis), head
The PR has no comments or reviews yet. It touches no partner test file. Path prefixes:
Sources read for this review (all fetched 2026-10-21):
SummaryWhat is right. All four changes follow the governing statute in the years the PR claims. None of them is a statute-versus-form conflict: in each case the agency's form or guidance agrees with the statute, and the old model matched neither.
There are no critical findings and three should-address items:
There are also six suggestions: Virginia default and guard, Virginia age-70 wording, Indiana citation and pre-2026 gating, NYC follow-ups including an unrecorded $62.50/$63 conflict, the Washington age threshold, and the PR body. Status.
Critical (must fix)None. Should addressS1. The Axiom line
|
DTrim99
left a comment
There was a problem hiding this comment.
All four changes follow the governing statute in the claimed years (NYC 606(ggg)(4-b), IN 6-1.1-20.6-7.7, VA 58.1-322.03(7), WA 84.36.381(3)(a)), and 22 expectations hand-check. Three should-address items: (1) the 'pending: hub files parity' axiom line is invalid; (2) the new IN and WA inputs default to off, so the IN credit is $0 and the WA disability and veteran pathways close for every household (microsim included) unless they're set, so derive the defaults; (3) pre-2016 WA veterans still qualify on generic is_disabled. Six suggestions. Full report in the comment above.
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
The new inputs defaulted to off, so the Indiana supplemental homestead credit was $0 and Washington's disability and veteran pathways closed for every household that didn't set them, microsimulation included. Each is now a formula that a supplied value overrides: - IN qualification: real_estate_taxes > 0, the Over 65 credit's homeowner proxy (the credit needs no application). - IN homestead liability: real_estate_taxes less the Over 65 and Blind/Disabled credits, which IC 6-1.1-20.6-3(3) applies first. - WA retired by reason of disability: SSDI receipt, SSA's finding under the 42 U.S.C. 423(d)(1)(A) definition RCW 84.36.383(6) adopts. - WA VA compensation and total rating: a fully disabled service-connected veteran. Before collection year 2016 the veteran pathway now reads a documented input, wa_pte_wholly_service_connected_disability, which defaults to the is_disabled proxy (or a fully disabled service-connected veteran), so the assumption is visible and overridable without closing the pathway. Also: count a carryforward-only Virginia account and bound a supplied capped amount by what is available; say the VA instructions are silent on the age-70 carryforward; record the NYC fixed-amount rounding as a source-conflict candidate; name the removed NYC parameters in the changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review Head: Picked up at
What the item asked for2. The new IN and WA inputs default to offEach input is now a formula that a supplied value overrides, with the default documented in its Indiana:
Washington:
Microsimulation-facing behaviour, before → after (no microsimulation run here; from the formulas and which inputs the household and microdata supply):
3. Pre-2016 WA veterans on generic
|
| Mutant | Result |
|---|---|
| M1 IN liability ignores earlier credits | killed (1 failed) |
| M2 IN default qualification off | killed (2) |
| M3 WA SSDI default off | killed (1) |
| M4 WA total-rating default inverted | killed (2) |
M5 WA pre-2016 back to bare is_disabled |
killed (2) |
| M6 VA carryforward-only account not counted | killed (1) |
| M7 VA under-70 bound removed | killed (1) |
7 of 7 killed.
CI
Pull request run 41418693987 at b403e928f1: success, all 34 jobs passed, including Microsimulation and Household API Partners.
Judgment calls
- Defaults that read other variables. As DTrim99 notes (from Fix Montana disability exclusion repeal, elderly credit receipt timing and occupancy tests #10331), supplying one of these inputs for one unit gives other units the default array, not the formula. I left them as single variables, as he allows.
- The pre-2016 default also accepts
is_fully_disabled_service_connected_veteran. That veteran meets the ruling's reading (wholly service-connected, under the Social Security definition), so it only adds people the statute admits. - Indiana
defined_for. I addeddefined_for = StateCode.INto the two IN defaults, so they read Indiana-only credits and are 0 elsewhere. The credit itself was already Indiana-only. - Unverified. The statutory phrasings in the new docstrings (7.7(e), § 3(3), RCW 84.36.383(6) and the 2008 text) come from DTrim99's report and the PR's references. I couldn't fetch iga.in.gov or leg.wa.gov here.
Proposed follow-up issue
Washington senior/disabled exemption: settle the age threshold and its period before 2020. age_threshold.yaml uses 62 before 2020, though the 2008 and 2015 texts of RCW 84.36.381(3)(a) say sixty-one, tested at December 31 of the filing year. Since the exemption applies to the following collection year, decide whether the model's period is the filing or the collection year, and set the pre- and post-2020 values on that basis.
Reply to DTrim99
Thanks for the review. Taking each item in turn:
- S1, the axiom line. The hub's.
- S2, defaults. Every new input now has an overridable default, as you suggested.
- IN qualification:
real_estate_taxes > 0. - IN liability:
real_estate_taxesless the Over 65 and Blind/Disabled credits (§ 3(3)). - WA disability retirement: SSDI receipt.
- WA VA compensation and total rating:
is_fully_disabled_service_connected_veteran. - New default cases: IN Cases 12–14, WA Cases 22–24.
- The IN aggregates now derive 1,850 and 1,725.
- The before and after microsim behaviour is above.
- IN qualification:
- S3, pre-2016 veterans. The hub ruled on this: before collection year 2016 the statute means Social Security's definition, wholly service-connected. The model has no service-connection input for that, so
is_disabledis the proxy, which keeps the pathway open rather than closing it for every veteran.- So I kept the reading but made it explicit.
wa_pte_wholly_service_connected_disabilitydefaults tois_disabled(oris_fully_disabled_service_connected_veteran), documents that it over-includes non-service-connected cases, and can be set to false. - Case 20 still expects true. Case 25 covers the service-connected input and Case 26 the override.
- So I kept the reading but made it explicit.
- G1. Both changes taken, with two cases.
- G2. Wording fixed in the YAML header and the body.
- G3. Citation added. The pre-2026 gate is skipped: it predates the PR, and the umbrella excludes the credit.
- G4. (a) skipped (predates the PR). (b) and (c) taken, (c) as a candidate.
- G5. Proposed as a follow-up issue.
- G6. The body is updated. The bill names are unchanged, because I couldn't verify ESSB / EHB from here.
Generated by Claude Code
|
Hub review in progress (finished) The final review is at #10330 (comment) and supersedes these interim notes. Generated by Claude Code |
|
Ready for hub review The head is unchanged since the hand-off. It merges cleanly into current METHODOLOGY_CHOICE: yes because of one item. Before collection year 2016 the PR reads RCW 84.36.381(3)(b)'s "one hundred percent service-connected disability as provided in 42 U.S.C. Sec. 423(d)(1)(A)" as a wholly service-connected disability under the Social Security definition. It proxies that with No P1.
FindingsP2-1. The PR body has no
|
| Item | Status at head | Evidence |
|---|---|---|
| S1 axiom line | Resolved in form | The line now uses encoded-correct and queued entries, the forms the template allows. The NYC claim names the module and companion cases, as CONTRIBUTING requires. I can't read rulespec-us from this session, so the existence and labels of #1452, #1510, #1862 and #1863 are unchecked. |
| S2 defaults | Resolved | Every new IN and WA input except the referendum tax and the combined rating has a formula default that a supplied value overrides. Probes at the head: IN, 2026, $2,000 of tax → 200; a disabled filer with $1,000 → 87.5. WA, 2024, age 45: SSDI 12,000 → eligible; is_veteran and is_fully_disabled_service_connected_veteran → eligible. The default cases are Cases 12-14 (IN) and Cases 22-24 (WA), and the IN aggregates now derive 1,850 and 1,725. Mutants M1-M4 are killed. |
| S3 pre-2016 veterans | Resolved by hub ruling | The code implements the ruling: earlier_veteran reads wa_pte_wholly_service_connected_disability, which defaults to is_disabled | is_fully_disabled_service_connected_veteran. It is overridable (Case 26) and its over-inclusion is documented. Compared with main it is narrower: main let any is_disabled person qualify, and the head requires is_veteran (probe: 2015, is_disabled non-veteran, true on main, false at the head). DTrim99's code change (bare is_fully_disabled_service_connected_veteran, Case 20 → false) was not taken, because the hub ruled the other way. M5 and M12 are killed. |
| G1 VA | Taken | va_529_plan_deduction_capped_amount.py:39 and va_529_plan_deduction_person.py:35-38. Probe: a $3,000 carryforward alone → 3,000. M6 and M7 are killed. |
| G2 VA wording | Taken | va_529_plan_deduction.yaml:171-180 and the body. |
| G3 IN | Citation taken; gate skipped | The skip holds. main and the head both give the standalone credit 200 in 2025 for $2,000 of tax, and only the 2026 block of state_property_tax_credits.yaml lists it. |
| G4 NYC | (a) skipped, (b) and (c) taken | (a): main's scales start 2022-01-01 and extrapolate back, so pre-2017 values predate the PR. (b): the changelog names the five removed paths, and nothing in the repo references them (grep over .py, .yaml, .md, .ipynb and .json). (c): us-ny:nyc-school-tax-credit-fixed-amount-rounding is in candidates.yaml, and the guard passes. |
| G5 WA age | Follow-up | See "WA age threshold" below. |
| G6 body | Taken, except the bill names | P3-3. |
Every should-address item (S1-S3) is resolved, so the hub can dismiss the CHANGES_REQUESTED review with a note. S3 is resolved by the hub's ruling, and S1's issue references can't be checked from here.
The new defaults against their statutes
I couldn't fetch IC 6-1.1-20.6-7.7, RCW 84.36.381 or RCW 84.36.383(6) (see "What I couldn't check"). This compares the docstrings with the statutory text as DTrim99's report quotes it.
in_supplemental_homestead_credit_eligible=real_estate_taxes > 0.- 7.7(b) ties the credit to the IC 6-1.1-12-37 standard deduction, and 7.7(e), per the report, says no application is required.
- The same proxy is in
in_over_65_property_tax_credit_eligible.py:44. - The docstring says it over-includes non-homestead tax and can be overridden. That is sound.
in_homestead_property_tax_liability=max_(real_estate_taxes − over-65 credit − blind/disabled credit, 0).- § 3(3), as quoted, uses the liability "after application of all credits and deductions under this article ..., including the credit granted by section 7 or 7.5 ..., but not including the credits granted under section 7.7 or 8.5".
- The model's Blind/Disabled credit cites IC 6-1.1-51.3-2. That is still a credit "under this article" (article 1.1), so subtracting it fits § 3(3). The hand-off's gloss ("after the section 7 and 7.5 credits") names the wrong sections for the model's two credits, but the code and its comment are right.
wa_pte_retired_due_to_disability=social_security_disability > 0.- Per the report, RCW 84.36.383(6) gives "disability" the meaning in 42 U.S.C. 423(d)(1)(A). A web search snippet of a 2025 WA DOR form says the same. A county form there numbers the subsection (7), so check the number on the current RCW.
- SSDI is SSA's finding under that definition, so the default under-includes rather than over-includes.
- Probe: an SSI-only disabled adult with no SSDI goes from eligible on
mainto ineligible at the head. "Retired from regular gainful employment" supports leaving out someone never employed, so I treat this as a defensible default, not a defect.
wa_pte_receives_va_disability_compensationandwa_pte_va_total_disability_rating=is_fully_disabled_service_connected_veteran. A fully disabled veteran whose disability is service-connected is consistent with a total rating and with receipt of compensation. It is a pure input that defaults to false.
Judgment calls
- The pre-2016 default also accepts
is_fully_disabled_service_connected_veteran. This holds. Under the ruling's reading (wholly service-connected, meeting the Social Security definition), that person is the clearest case the 2008 text admits. Adding them only widens the default toward the statute. Case 25 pins it, and M12 (|→&) is killed by Cases 20 and 25. defined_for = StateCode.INon the two IN defaults. This holds. Probe: for a Washington household the eligibility default isFalse. The only reader,in_supplemental_homestead_credit, is itself IN-only. Supplied values still override, since inputs bypass the formula.
WA age threshold
The PR leaves age_threshold.yaml as main has it (62 before 2020, 61 from 2020). Cases 5 and 6 (2019: 61 ineligible, 62 eligible) are already on main.
What the PR changes. It removes the is_disabled route that used to mask the threshold for one group:
| Probe | main |
Head |
|---|---|---|
2015, age 61, is_disabled, no SSDI |
true | false |
2019, age 61, is_disabled, no SSDI |
true | false |
Whether that is worse depends on the period convention.
- The new veteran parameters are keyed by collection year.
- The 2008 test, as quoted, is "sixty-one ... on December 31st of the year in which the exemption claim is filed".
- So in collection year Y the claimant must have been 61 at the end of Y−1, which makes them 62 in Y. Under that convention 62 before 2020 is right, and the newly visible results are correct.
- It is the post-2020 value of 61 that would then be a year early.
I found no source confirming the 2019 c 332 change that age_threshold.yaml cites; secondary search results describe 61 throughout. Not made worse by this PR. The hand-off's follow-up, "settle the age threshold and its period", is the right home for it.
Impact (baseline outputs the diff from main moves)
NYC, every year the model computes NYC tax. The head's parameters start 2017-01-01 and main's 2022-01-01; both extrapolate back.
- What moves:
nyc_school_tax_credit_rate_reduction_amountrises for eligible filers whose city taxable income is above the threshold: +$0.064 joint and surviving spouse, +$0.376 head of household, +$0.48 single and separate. - Downstream:
nyc_school_tax_creditand the household's net income rise by the same amount, andnyc_income_taxfalls by it. The two STC contrib reforms move too. - Probes,
main→ head: 2017 HoH at $20,000: 37.392 → 37.768. 2025 joint at $30,000: 56.088 → 56.152. 2025 single at $20,000: 38.76 → 39.24. At $12,000 single, 20.52 on both sides.
Indiana, 2026+.
- What moves:
in_supplemental_homestead_creditfalls by up to 10% of the Over 65 and Blind/Disabled credits (at most $27.50) where the credit is under the $300 cap. Probe: disabled filer, $1,000 of tax, 100 → 87.5. - Unchanged: qualification adds no new zeros, because
main's 10% of zero tax was already 0. Pre-2026 values are unchanged. - Reach: the credit feeds only
taxsim_state_property_tax_credit(viastate_property_tax_credits.yaml) and its aliasstate_property_tax_credit. Nothing reads those, so household net income doesn't move.
Virginia: no baseline change. With no carryforward and no supplied capped amount, the head computes min(contributions, 4,000 × accounts) under 70 and contributions from 70, which is main's per-person formula exactly. Probe: $8,000 across two accounts gives 8,000 on both sides.
Washington, collection years 2008+.
- What moves:
wa_pte_categorical_eligible,wa_pte_eligibleandwa_senior_disabled_property_tax_exemption:- people under the age threshold who are
is_disabledwithout SSDI lose eligibility, except veterans before collection year 2016, who keep it; - SSDI recipients without
is_disabledgain it; - from 2016, people marked both
is_fully_disabled_service_connected_veteranandis_veterangain it.
- people under the age threshold who are
- Probe: 2024, age 45,
is_disabled, $5,000 of tax: the exemption goes from 1,500 to 0. - Reach: nothing reads
wa_senior_disabled_property_tax_exemption, so household net income doesn't move.
Population check for the hub:
- NYC: the count of eligible NYC tax units above the threshold, by filing status. The total is bounded by $0.48 per unit.
- IN 2026: the count of tax units with an Over 65 or Blind/Disabled credit and the credit under the cap.
- WA: counts of people under the threshold with
is_disabledand no SSDI (losers), with SSDI and notis_disabled(gainers), and with bothis_fully_disabled_service_connected_veteranandveterans_benefits > 0.is_veteranisveterans_benefits > 0. A person marked fully disabled service-connected but with no VA benefits stays closed out (probe: false).- Whether the microdata populates
is_fully_disabled_service_connected_veteranat all decides whether the veteran pathway opens in microsimulation.
Checked and sound
-
Defect reproduced at
main(6145ad4513, probes withSimulation):- NYC 2017 HoH at $20,000 gives 37.392, but § 606(ggg)(4-b)(B) as quoted gives 25 + 0.00228 × 5,600 = 37.768.
- IN: no qualification gate and no earlier-credit ordering (disabled filer, $1,000: 100).
- WA: generic
is_disabledqualifies a working 45-year-old (true).
-
Hand values, computed before reading the formulas, all matched at the head:
- NYC:
- 37.768;
- 56.152;
- 39.24;
- 20.52 at the single threshold;
- 21.00228 at $12,001;
- 37.00228 surviving spouse at $21,601;
- 0 at negative income.
- The steps at the threshold are 0.064, 0.376 and 0.48.
- IN:
- 200;
- 0 when qualification is set to false;
- 87.5;
- min(0.1 × (2,000 − 1,000), 300) = 100.
- VA:
- 5,000 (capped amount supplied);
- 3,000 (carryforward only);
- min(9,000, 2,500) = 2,500;
- 1,000 + 6,000 = 7,000 at age 70.
- WA: the eligibility results listed above.
- NYC:
-
Code paths:
- NYC covers all five filing statuses through
p.threshold[filing_status]andp.base[filing_status], and>keeps the threshold in the first band. - The IN credit is
eligible × min(0.1 × max(liability − referendum, 0), 300). - The WA
whereon the scalarrating_requirement_in_effectbroadcasts. - The mixed vector cases pass (Case 21; the NYC mixed case).
- NYC covers all five filing statuses through
-
Tests at the head, one file per process, all passing:
test_source_conflicts.py: 103.- NYC:
income_tax_elimination/integration.yaml: 6;nyc_school_tax_credit.yaml: 5;nyc_school_tax_credit_rate_reduction_amount.yaml: 16;test_nyc_school_tax_credit_income_test_invariants.py: 6;- the STC contrib files: 9 and 2;
spm_unit_local_tax.yaml: 4.
- IN:
- the two IN aggregate files: 2 and 2;
in_supplemental_homestead_credit.yaml: 14.
- VA:
va_529_plan_deduction.yaml: 18;- VA
plan_529/integration.yaml: 3; test_va_529_invariants.py: 2.
- WA:
- WA
integration.yaml: 14; wa_pte_categorical_eligible.yaml: 26;wa_pte_eligible.yaml: 9;wa_senior_disabled_property_tax_exemption.yaml: 18.
- WA
- These match the body's counts.
-
The guard on the merge with current
main.test_source_conflicts.pyon a local merge of the head into6145ad4513gives 103 passed.mainchangedcandidates.yamland the guard after433fccbb1e, and the merge is clean. -
Mutants. Each ran in its own process on a scratch worktree, and the tree was restored and
git statuswas clean after each.Mutant Result Killed by M1 IN liability ignores earlier credits killed IN Case 14 M2 IN default qualification off killed IN Cases 12, 14 M3 WA SSDI default off killed WA Case 22 M4 WA total-rating default inverted killed WA Cases 12, 24 M5 WA pre-2016 back to bare is_disabledkilled WA Cases 25, 26 M6 VA carryforward-only account not counted killed "Without account-level amounts, a carryforward-only account counts as one account" M7 VA under-70 bound removed killed "A supplied capped amount is bounded by contributions plus carryforward" M8 (mine) rating requirement 2016 → 2018 survives proposed Case 27 (P2-2) M9 (mine) 80% threshold 2020 → 2021 survives proposed Case 28 (P2-2) M10 (mine) NYC >→>=at the thresholdkilled 5 NYC threshold cases, including "2017 separate filer at the threshold stays in the lower branch" M11 (mine) WA drop is_veteran &killed WA Cases 15, 19 M12 (mine) pre-2016 default |→&killed WA Cases 20, 25 M13 (mine) compensation default → is_veteransurvives proposed Case 29 (P3-1) The hand-off's 7 of 7 kills reproduce.
-
Readers of each changed variable (grep outside tests):
in_supplemental_homestead_credit→state_property_tax_credits.yaml→taxsim_state_property_tax_credit→state_property_tax_credit, which nothing reads.- The IN inputs are read only inside the credit's folder.
va_529_plan_deduction_capped_amountandva_529_plan_carryforward→va_529_plan_deduction_person→va_529_plan_deduction.- The WA inputs →
wa_pte_categorical_eligible→wa_pte_eligible→wa_senior_disabled_property_tax_exemption, which nothing reads. nyc_school_tax_credit_rate_reduction_amount→nyc_school_tax_creditand the two STC reforms.- Nothing references the removed NYC parameter paths.
- No reader is made reachable and worse. The age-61 group is discussed above.
-
CI. Pull request run 41418693987 at
b403e928f1: 34 jobs, allsuccess, including Microsimulation and Household API Partners. None was skipped or cancelled. -
Scope.
- The diff from
maintouches nothing under.github/orpolicyengine_us/tests/policy/baseline/partners/. - Overlap: Fix WA property tax exemption crash for households outside Washington #10113 (open) edits
wa_senior_disabled_property_tax_exemption.yaml, in a different hunk (its own county-lookup cases). Follow state statutes where forms differ: NM medical exemption, VT CDCC, NY/NYC household credit, PR EITC #10300, Fix Montana disability exclusion repeal, elderly credit receipt timing and occupancy tests #10331 and other open PRs editcandidates.yamlandtest_source_conflicts.py, both append-style files. No open PR touches the other changed files (REST issue search per file name).
- The diff from
-
Changelog. There is one top-level
fixedfragment, and it names the removed parameter paths. -
Body claims checked: the witnesses (all reproduce), the invariants, the test counts, the removed paths and the candidate id.
Fixes #8947is the NYC second-band issue, and it matches item 1.
What I couldn't check
- Primary law. This session's network refuses every primary host: leg.wa.gov (app., lawfilesext., lawfilestestext.), iga.in.gov, in.gov (DLGF), nysenate.gov, tax.ny.gov, law.lis.virginia.gov, govinfo.gov, uscode.house.gov and ecfr.gov.
- So I didn't fetch IC 6-1.1-20.6-7.7 or § 3(3), RCW 84.36.381, RCW 84.36.383(6), the 2008, 2015, 2019 and 2025 session laws, § 606(ggg), Va. Code § 58.1-322.03, 42 U.S.C. 423 or 38 CFR 3.340.
- Hand values follow the statutory text as DTrim99's report quotes it. Web search results corroborate only in part (the 383 cross-reference, 7.7(e)'s no-application rule, the ESSB/EHB designations). Those are secondary, and I don't rely on them as law.
- rulespec-us. The existence, labels and contents of rulespec-us What program participation can affect one's eligibility for the Affordable Connectivity Program? #1452, Allow data tests to work without a policyengine_us package being installed #1510, Portland, Oregon Arts Income Tax #1862 and Formula for
ca_is_qualifying_child_for_caleitc#1863, which theaxiom:line cites. That repository is outside this session's access. - The microdata. Whether it populates
is_fully_disabled_service_connected_veteran,social_security_disabilityorveterans_benefitsfor WA, and the population impact. The hub's run covers both.
Generated by Claude Code
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
Bring the branch up to date with main before the round 1 fixes; no conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FTzhwSszCc1DcqdbZ
Round 1 review found three surviving mutants: moving the rating requirement to 2018, moving the 80% threshold to 2021, or defaulting VA compensation from is_veteran all left the WA tests green. Cases 27-29 kill each one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FTzhwSszCc1DcqdbZ
- wa_pte_wholly_service_connected_disability: quote RCW 84.36.381(3)(b)'s 'one hundred percent service-connected disability' instead of calling it a 'total' disability, since from 2016 the statute uses 'total disability rating' as a VA term. - combined_rating_threshold: the enrolled session laws are ESSB 5160 (2019 c 453) and EHB 1106 (2025 c 200). - candidates.yaml: record the 2026-10-21 ruling on the pre-2016 veteran pathway (us-wa:pte-veteran-pathway-pre-2016), with is_disabled as the overridable proxy, so the reading is in the shared backlog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FTzhwSszCc1DcqdbZ
|
Ready for hub review Round 1 fixes from the review at Commits
Items
|
PolicyEngine follows the administering agency's reading only where the text and the canons leave a reading open. On 2026-10-21 it settled the pre-2016 veteran pathway from the statute's words: the cross-reference to 42 U.S.C. 423(d)(1)(A), and the move to VA-rating language from collection year 2016. A WA DOR practice, if one turned up, would not override that reading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
GitHub reported a conflict with main (ba9bfde). Only source_conflicts/candidates.yaml conflicted. Main rewrote the note on us-ny:household-credit-claimable-spouse and added us-ny:household-credit-separate-return-halving after it. This branch added us-ny:nyc-school-tax-credit-fixed-amount-rounding at the same spot. The resolution keeps main's note and both new items, in id order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review This head merges What the item asked for
TestsOne file per process on the merged tree, at most three at a time.
Total: 21 files, 352 passed, 1 failed. The one failure predates this PR.
CIThe Judgment calls
Proposed follow-upConnecticut's recapture step can make $1 of income lower SPM net income by $49. Generated by Claude Code |
|
David, here's where each item of your review stands at
An independent AI review of these changes agreed at 🤖 Generated with Claude Code |
The changes since this review answer each item, and the reply above maps each one to its commit and file or gives the reason for declining it.
|
US + core hub merge audit, us#10330 at
🤖 Generated with Claude Code |
Fixes #8947
What and why
This PR makes four state and local rules follow the statutes that govern them.
1. NYC school tax credit rate reduction amount: statutory second-band bases (2017+)
rate_reduction/amount/{threshold,base}(by filing status) and{first_band_rate,excess_rate}replace the scales from 2017-01-01. The amount equals 0.171% x T for T not over the threshold, and base + 0.228% x (T - threshold) above it. Income equal to the threshold stays in the first band. Eligibility and the $500,000 limits don't change.income_tax_elimination/integration.yamlrestores thenyc_school_tax_creditandnyc_income_taxassertions that this bug had kept commented out. The differential invariant test's tolerance drops from 0.5 to 0.001. Tests that had pinned the old carry-in to 0.01 now use the statutory bases:nyc_school_tax_credit.yaml: single $441,000 from 998.64 to 999.12, single $272,000 from 613.32 to 613.80, and joint $482,950 from 1,088.81 to 1,088.878;contrib/local/nyc/stc/;spm_unit_local_tax.yaml: single with $100,000 of wages, NYC tax down $0.48.2. Indiana supplemental homestead credit: qualification, homestead base, referendum exclusion (2026+)
real_estate_taxes, $300), with no qualification gate, no homestead-only base and no referendum exclusion.in_supplemental_homestead_credit_eligible(7.7(b) qualification),in_homestead_property_tax_liability(the homestead's liability after earlier credits and before this one) andin_homestead_referendum_property_tax. Credit = eligible x min(0.1 x max(liability - referendum, 0), $300). The first two have overridable defaults:real_estate_taxes > 0, the Over 65 credit's homeowner proxy, since 7.7(e) requires no application;real_estate_taxesless the Over 65 and Blind/Disabled credits, floored at 0, the order IC 6-1.1-20.6-3(3) (SEA 1 SECTION 73) sets.real_estate_taxes$3,000, qualification set to false: $0 (main: $300).real_estate_taxesgets min(10% × (taxes − Over 65 − Blind/Disabled credits), $300). This PR lowers main's amount by up to 10% of the earlier credits, and leaves it unchanged where both amounts reach the $300 cap. The referendum exclusion stays at 0 until the data supplies it.3. Virginia Commonwealth Savers deduction: per-account cap and carryforward (2024+)
va_529_plan_deduction_capped_amount, the sum over owned accounts of min($4,000, contributions + undeducted carryforward), andva_529_plan_carryforward.4. Washington senior and disabled persons property tax exemption: statutory disability and veteran pathways (2008+)
age >= threshold | is_disabled: a working 45-year-old withis_disabledqualified, and a compensated 80% veteran withoutis_disableddid not.wa_pte_retired_due_to_disability,wa_pte_receives_va_disability_compensation,wa_pte_va_service_connected_ratingandwa_pte_va_total_disability_rating. It adds two parameters,veteran/combined_rating_threshold(none before 2020, 0.8 from 2020, 0.4 from 2027) andveteran/rating_requirement_in_effect(from 2016). Every VA pathway requiresis_veteran.wa_pte_retired_due_to_disabilitydefaults to SSDI receipt (social_security_disability > 0), SSA's finding under the 42 U.S.C. 423(d)(1)(A) definition that RCW 84.36.383(6) adopts.wa_pte_receives_va_disability_compensationandwa_pte_va_total_disability_ratingdefault tois_fully_disabled_service_connected_veteran. The combined rating defaults to 0.wa_pte_categorical_eligible.pyentry from the source-conflict ratchet'sKNOWN_UNMARKED, since it deletes the "in practice" comment.is_disabled, not retired, $5,000 tax on a $500,000 home: not eligible, $0 (main: $3,600). Retired by reason of disability: $3,600.us-wa:pte-veteran-pathway-pre-2016insource_conflicts/candidates.yaml. The model has no service-connection input for that definition, sois_disabledstands in for it.wa_pte_wholly_service_connected_disabilitymakes the proxy visible and overridable: it defaults tois_disabledoris_fully_disabled_service_connected_veteran.is_veteranandis_fully_disabled_service_connected_veteran. Before 2016 it admits veterans the data marksis_disabledoris_fully_disabled_service_connected_veteran. The combined-rating route below a total rating stays closed until the data supplies ratings.Invariants
test_va_529_invariants.py).is_disabledalone never qualifies a non-veteran.Test plan
ce9377ee80before the fix.b403e928f1(mainmerged), one file per process:wa_pte_categorical_eligible.yaml: 26 passed (5 new default and pre-2016 cases);d46ac9be1dlater adds Cases 27-29, which pin the 2016 rating requirement, the 2020 80% threshold and the VA-compensation default;integration.yaml: 14 passed;wa_pte_eligible.yaml: 9;wa_senior_disabled_property_tax_exemption.yaml: 18;in_supplemental_homestead_credit.yaml: 14 passed (3 new default cases);in_supplemental_homestead_credit_in_aggregate.yamlandin_blind_disabled_property_tax_credit_in_aggregate.yaml: 2 and 2 passed (liability now derived: 1,850 and 1,725);va_529_plan_deduction.yaml: 18 passed (2 new); VAplan_529/integration.yaml: 3;nyc_school_tax_credit_rate_reduction_amount.yaml: 16;nyc_school_tax_credit.yaml: 5;income_tax_elimination/integration.yaml: 6;spm_unit_local_tax.yaml: 4;contrib/local/nyc/stc/files: 9 and 2;test_nyc_school_tax_credit_income_test_invariants.py: 6;test_va_529_invariants.py: 2;test_source_conflicts.py: 103.mainatba9bfdea75(merge8fe868beb4).8fe868beb4passed all 36 jobs on GitHub's merge with main833c28bb47.source_conflicts/candidates.yamlrecords as the ruled candidateus-wa:pte-veteran-pathway-pre-2016. The adjacent NYC fixed amount ($62.50 in § 606(ggg)(4-a)(B), $63 on the IT-201-I) now has its own candidate,us-ny:nyc-school-tax-credit-fixed-amount-rounding.rate_reduction/amount/{single,joint,separate,head_of_household,surviving_spouse}scales, and the changelog says so. Saved policies that edit them need the newthreshold/baseparameters.ruff format/ruff checkon changed files.changelog.d/.Microsimulation impact
We estimate that this PR raises New York City's school tax credit rate reduction amount by $0.64m (0.16%) and lowers Indiana's supplemental homestead credit by $0.77m (0.65%) in 2026 on the default dataset. We compared
mainatba9bfdea75with this branch at8fe868beb4.The rate reduction amount rises for 874 sampled tax units (2.03m weighted), by at most $0.48 each, and Indiana's credit falls for 21 sampled tax units (56,952 weighted), by at most $27.50. Household net income rises by $619,180 for 638 sampled households (1.61m weighted), and federal income tax rises by $18,649 for 162 sampled tax units (342,550 weighted), by at most $0.20 each. Only the
taxsim_state_property_tax_credittotal reads Indiana's credit, and no household's net income falls. Virginia's Commonwealth Savers deduction comes to $0 on main and on this branch, so Virginia income tax doesn't change. State income tax and household benefits don't change. No other variable readswa_senior_disabled_property_tax_exemption, so we left it out of the comparison.nyc_school_tax_credit_rate_reduction_amountin_supplemental_homestead_creditva_529_plan_deduction_personva_income_taxstate_income_taxincome_taxhousehold_net_incomehousehold_benefitsProposed follow-up (not in this PR)
age_threshold.yamluses 62 before 2020 and 61 from 2020. The 2008 and 2015 texts of RCW 84.36.381 require a claimant aged sixty-one or older on December 31 of the filing year, and exempt the taxes due the following year. In a collection-year period, which the veteran parameters use, the same claimant reaches 62 by the end of the period. So the follow-up first has to settle which year the model's period stands for, because under a collection-year period the 61 used from 2020 may need to change.impact: NYC school tax credit rate reduction amount +$0.64m (+0.16%) and Indiana supplemental homestead credit −$0.77m (−0.65%) in 2026 (874 and 21 sampled tax units); household net income +$0.62m; state income tax and household benefits don't change
axiom: us-ny:policies/tax/it-201-instructions/nyc-school-tax-credit-rate-reduction#nyc_school_tax_credit_rate_reduction_amount encoded-correct (TY2025+ amount tables only; companion tests joint_return_first_band, single_second_band, head_of_household_second_band, above_final_bounded_row); TheAxiomFoundation/rulespec-us#1452 queued, extended with a comment (TY2017-2024 statutory amount tables; dated-source ingestion and re-pin); TheAxiomFoundation/rulespec-us#1510 queued, extended with two comments (per-account caps and carryforward; encoder approval and form-source re-pin); TheAxiomFoundation/rulespec-us#1862 queued, extended with a comment (IN 2026 liability-source ingestion and re-pin); TheAxiomFoundation/rulespec-us#1863 queued, extended with a comment (WA dated-source ingestion and re-pin).
🤖 Generated with Claude Code