PolicyEngine / PolicyEngine/policyengine-us

NYC school tax credit rate reduction should preserve rounded second-band base amounts

Open
#8,947 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.