Build out local income taxes: registry + Yonkers, Wilmington, KY Louisville/Lexington#8751
Open
DTrim99 wants to merge 3 commits into
Open
Build out local income taxes: registry + Yonkers, Wilmington, KY Louisville/Lexington#8751DTrim99 wants to merge 3 commits into
DTrim99 wants to merge 3 commits into
Conversation
programs.yaml previously listed only 3 local entries (NYC income tax, SF WFTC, Montgomery County EITC) despite many local taxes being fully modeled. Add registry entries for the modeled-but-unregistered local taxes so they appear on the model coverage page / /us/metadata: - Philadelphia wage tax - Kansas City and St. Louis earnings taxes - Indiana county income tax (LIT) - Maryland county income tax - Multnomah County Preschool for All tax - Denver / Glendale / Greenwood Village / Sheridan occupational privilege taxes No calculation logic changes; registry metadata only. Each entry references an existing household-facing variable (verified) and matches the existing entry schema. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
New local income/occupational taxes that fit existing geography (residence-only sourcing): - NY Yonkers: resident surcharge (16.75% of NY State tax) + nonresident earnings tax (0.5%), gated by an in_yonkers input flag - DE Wilmington: 1.25% earned income tax (residents on all earnings; nonresidents on Wilmington-source earnings), gated by in_wilmington - KY Louisville/Jefferson County (1.45%) and Lexington/Fayette County (2.25%) occupational license fees, assigned via county_str (consolidated city-counties). School-district occupational taxes (JCPS/FCPS) not yet modeled. Wiring: Wilmington -> local_income_tax (SALT) + local_income_tax_before_ refundable_credits (levy). KY -> local_occupational_tax. Yonkers -> local_income_tax_before_refundable_credits only (excluded from the SALT measure to avoid a circular dependency, since its surcharge reads NY State tax which depends on the federal SALT deduction). Registered all in programs.yaml; added YAML tests and a changelog fragment. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8751 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 11 11
Lines 171 121 -50
=========================================
- Hits 171 121 -50
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:
|
Collaborator
Author
Program Review — PR #8751 (Build out local income taxes)Scope & method
🔴 Critical (Must Fix)
🟡 Should Address
🟢 Suggestions
Value Audit (rates)
Validation Summary
Review Severity: REQUEST_CHANGESTwo must-fix items: the Louisville residence rate (2.20% vs 1.45%) and the Fayette 404 reference. Aggregation wiring and the SALT/cycle workaround are sound. Other rates verified correct. Next StepsTo auto-fix: 🤖 Generated with Claude Code |
…ting, tests - CRITICAL: Louisville/Jefferson occupational rate 1.45% -> 2.20% (the tax is assigned by residence; 2.20% = 1.25% Metro + 0.20% TARC + 0.75% school board. 1.45% was the nonresident rate.) JCPS 0.75% wage cap not modeled (noted). - CRITICAL: fix Fayette dead reference URL (.../finance/division-revenue -> .../departments/revenue) in both the param and the variable. - Gate the Yonkers/Wilmington nonresident-earnings term on non-residence so a resident is never charged both the resident and nonresident amounts. - Add defined_for (NY/DE); drop disallowed documentation field on input vars; point Yonkers refs to Form IT-360.1-I / Y-203-I; update programs.yaml note. - Tests: Jefferson now 1,100 (50k*2.2%); add end-to-end household-tax rollup and SALT-asymmetry (Wilmington in local_income_tax, Yonkers out) tests, plus Fayette zero-case, self-employment, and multi-earner cases. 24 pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Collaborator
Author
Fixes Applied (commit
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this does
Builds out local income tax capability in two parts.
1. Registry cleanup (metadata)
programs.yamlpreviously listed only 3 local entries despite many local taxes being modeled. Registers the modeled-but-unregistered taxes so they surface on the coverage page //us/metadata: Philadelphia wage tax; Kansas City & St. Louis earnings taxes; Indiana county LIT; Maryland county income tax; Multnomah Preschool for All; and the 4 Colorado occupational privilege taxes. (Investigated cleanup items that needed no action: Aurora CO isn't modeled; the Mamdani NYC proposal is correctly reform-only; MD/IN/Multnomah already have tests.)2. New local taxes on existing geography (residence-only sourcing)
in_yonkersinput flagin_wilmingtoninput flagcounty_str(consolidated city-county)county_str(consolidated city-county)Each: parameters with references, a variable, programs.yaml entry, YAML tests, changelog.
Implementation notes
local_income_taxis the SALT-deductible measure;local_income_tax_before_refundable_creditsis the levy measure that rolls into household tax (Philadelphia is in both). Wilmington is in both. Yonkers is in the levy measure only, deliberately excluded from the SALT measure — its surcharge reads NY State tax, which depends on the federal SALT deduction, so including it inlocal_income_taxcreates a circular dependency. Documented in the variable; minor SALT understatement for the Yonkers portion.Verification
household_tax; no circular dependency.ruff format+ruff checkclean.Deferred (roadmap)
Larger Tier-1 gaps needing sub-county geography + workplace sourcing — Ohio municipal + school-district, Michigan cities, PA Act 32 EIT — are out of scope here.
🤖 Generated with Claude Code