PolicyEngine / PolicyEngine/policyengine-us
NYC school tax credit rate reduction should preserve rounded second-band base amounts
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
Axiom's NYC oracle comparison found a systematic sub-dollar difference in PolicyEngine's `nyc_school_tax_credit_rate_reduction_amount` for second-band cases.
The IT-201 instructions state rounded second-band base amounts directly:
- joint / surviving spouse: `$37 plus 0.228% of excess over $21,600`
- single / separate: `$21 plus 0.228% of excess over $12,000`
- head of household: `$25 plus 0.228% of excess over $14,400`
PolicyEngine currently models these as marginal-rate schedules, so the carry-in is derived from the first band:
- joint: `21,600 * 0.00171 = 36.936` instead of `$37`
- single/separate: `12,000 * 0.00171 = 20.52` instead of `$21`
- head of household: `14,400 * 0.00171 = 24.624` instead of `$25`
This creates constant second-band differences of about `$0.064`, `$0.48`, and `$0.376` respectively. PolicyEngine's own baseline tests appear to acknowledge this by using a `$1` error margin on second-band cases.
This is not a large fiscal difference, but it prevents exact component parity against source-backed encodings. Suggested fix: represent the printed second-band base amounts explicitly, or document the marginal carry-in convention if preserving it intentionally.
Contributor guide
Research direction
Locate the nyc_school_tax_credit_rate_reduction_amount implementation and the baseline tests that cover second-band cases. Compare their marginal-rate schedule with the rounded amounts in the IT-201 instructions; done means the intended carry-in convention is represented and the second-band results match the source-backed values or are explicitly documented.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 62/100