Repository navigation
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
Fixes #8947
What and why
Four verified model bugs from the statute-first backlog (statute governs, forms fill gaps; ruled 2026-10-19). Each section gives the source, the change, a witness, and the years.
1. NYC school tax credit rate reduction amount: statutory second-band bases (
us-nyc-school-tax-credit-rate-reduction-base, 2017+)rate_reduction/amount/{threshold,base}(by filing status) and{first_band_rate,excess_rate}, from 2017-01-01. The formula is 0.171% x T for T not over the threshold, else base + 0.228% x (T - threshold). Income equal to the threshold stays in the first band. Eligibility and the $500,000 limits are unchanged.income_tax_elimination/integration.yamlre-enables thenyc_school_tax_creditandnyc_income_taxassertions that were commented out because of this bug. 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: 998.64 to 999.12; single $272,000: 613.32 to 613.80; joint $482,950: 1,088.81 to 1,088.878), the two NYC school tax credit reform files undercontrib/local/nyc/stc/, andspm_unit_local_tax.yaml(single, $100,000 wages: NYC tax down $0.48).2. Indiana supplemental homestead credit: qualification, homestead base, referendum exclusion (
us-in-supplemental-homestead-proxies, 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 (7.7(e): no application is required);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): main's amount, less 10% of the earlier credits where they apply. The referendum exclusion stays at 0 until the data supplies it.3. Virginia Commonwealth Savers deduction: per-account cap and carryforward (
us-va-529-deduction-owner-and-line, 2024+)va_529_plan_deduction_capped_amount(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 (
us-wa-pte-disability-proxy, 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; parametersveteran/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 leaves the source-conflict ratchet'sKNOWN_UNMARKED, since the "in practice" comment is gone.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.is_disabledis the proxy.wa_pte_wholly_service_connected_disabilitymakes the proxy visible and overridable: it defaults tois_disabledoris_fully_disabled_service_connected_veteran.is_fully_disabled_service_connected_veteran(from 2016; and, throughis_disabled, to disabled veterans before 2016). 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);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.us-ny:nyc-school-tax-credit-fixed-amount-rounding.rate_reduction/amount/{single,joint,separate,head_of_household,surviving_spouse}scales are gone, as the changelog now says. Saved policies that edit them need the newthreshold/baseparameters.ruff format/ruff checkon changed files.changelog.d/.Proposed follow-up (not in this PR)
age_threshold.yamluses 62 before 2020, but the 2008 and 2015 texts of RCW 84.36.381(3)(a) already say sixty-one.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 a comment (per-account caps and carryforward; encoder approval and form-source re-pin); TheAxiomFoundation/rulespec-us#1862 queued (IN 2026 liability-source ingestion and re-pin); TheAxiomFoundation/rulespec-us#1863 queued (WA dated-source ingestion and re-pin).
Generated by Claude Code