Skip to content

Add Rhode Island 2027 tax updates#8630

Open
daphnehanse11 wants to merge 10 commits into
PolicyEngine:mainfrom
daphnehanse11:codex/ri-current-law-ctc-surtax
Open

Add Rhode Island 2027 tax updates#8630
daphnehanse11 wants to merge 10 commits into
PolicyEngine:mainfrom
daphnehanse11:codex/ri-current-law-ctc-surtax

Conversation

@daphnehanse11

@daphnehanse11 daphnehanse11 commented Jun 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Add Rhode Island current-law Child Tax Credit beginning in tax year 2027.
  • Model the CTC as fully refundable, with $330 per eligible child age 18 or under and the enacted stepped AGI phase-out.
  • Add Rhode Island high-income surtax on taxable income over $1 million, phased in at 1% in 2027, 2% in 2028, and 3% in 2029 and later.
  • Remove the age gate from the Rhode Island Social Security subtraction for tax year 2027 and later while preserving the existing income limits.
  • Wire the CTC into Rhode Island refundable credits and add the surtax before non-refundable credits.

Sources

  • 2026 R.I. H 7127 Substitute A as amended, Article 6, Sections 4 and 5.
  • 2026 R.I. H 7127 Substitute A as amended, Article 6, Section 5, amendments to R.I. Gen. Laws § 44-30-12(c)(8)(ii).
  • Rhode Island General Assembly press release describing the CTC as fully refundable.

Tests

  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/credits/ctc/ri_ctc.yaml -c policyengine_us
  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/ri_high_earner_tax.yaml -c policyengine_us
  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml -c policyengine_us
  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml -c policyengine_us
  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.yaml -c policyengine_us
  • uv run python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/taxable_retirement_income/ri_retirement_income_subtraction_eligible.yaml -c policyengine_us
  • uv run pytest policyengine_us/tests/test_parameter_files.py
  • uv run pytest policyengine_us/tests/test_system_import.py
  • make format

@codecov

codecov Bot commented Jun 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (7857608) to head (2001bd8).
⚠️ Report is 133 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #8630   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            2         8    +6     
  Lines           36       127   +91     
=========================================
+ Hits            36       127   +91     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@daphnehanse11 daphnehanse11 force-pushed the codex/ri-current-law-ctc-surtax branch from bfa0122 to 5918537 Compare June 15, 2026 13:14
@daphnehanse11

Copy link
Copy Markdown
Collaborator Author

Updated the PR to address the reference issue from review.

Changes:

  • Replaced the broken H7127Aaa.pdf#page=131 and #page=143 references with the final amended bill HTML at Article 6.
  • Updated the refundable CTC press release reference title to match the official page title.
  • Left formulas, legal values, and tests unchanged.

Verification:

  • CTC YAML: 5 passed.
  • High-earner YAML: 5 passed.
  • Parameter files: 6 passed.
  • Changed Python variable compile check: passed.
  • ruff format: no files changed.
  • ruff check: passed.

@daphnehanse11 daphnehanse11 marked this pull request as ready for review June 15, 2026 13:16
@daphnehanse11 daphnehanse11 reopened this Jun 15, 2026
@daphnehanse11 daphnehanse11 requested a review from DTrim99 June 15, 2026 14:37
@DTrim99

DTrim99 commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #8630: Rhode Island CTC + High-Income Surtax

PR #8630 ("[codex] Add Rhode Island current-law CTC and surtax") implements two Rhode Island provisions effective in tax year 2027:

  • Child Tax Credit (R.I. Gen. Laws § 44-30-104): a refundable credit of $330 per qualifying child (age 18 or under at Dec 31), inflation-indexed from base year 2026, with an AGI phase-out reducing 20 percentage points per increment — $2,875 over $88,500 (single/HoH/MFS/QW) or $3,590 over $110,640 (MFJ).
  • High-income surtax (R.I. Gen. Laws § 44-30-2.6): an additional 1% (TY2027) / 2% (TY2028) / 3% (TY2029+) on Rhode Island taxable income over $1,000,000, raising the top effective bracket to 8.99% (5.99% base + 3%).

The model was validated against the enacted H 7127 Substitute A (Article 6) — not the Governor's original proposal. The dependent-exemption double-count concern was investigated and cleared: enacted Sub A removed the exemption-zeroing clause, the CTC is additive, and leaving ri_exemptions unchanged is correct.

Source Documents (H 7127 Substitute A — enacted)

References use the preferred dual-citation form (session law + codified section), and every value is strongly corroborated by authoritative RI sources (Governor McKee press release: "$330 per child… refundable… $47M to 70,000+ families"; Bloomberg Tax: "1% in tax year 2027 rising to 3% by 2029," "personal annual income over $1 million," "top bracket to 8.99%") and against the enacted Article 6 text itself.

Critical (Must Fix)

None. The PR is accurate and well-implemented. There are no genuine blockers.

CI failures on this PR are infrastructure-related, not PR defects (see CI note below) and are explicitly not classified as critical.

Should Address

  1. Missing boundary tests. Add unit tests at the regulatory edges:
    • CTC full phase-out to $0 (AGI high enough to exhaust the credit).
    • Surtax at and just above the $1M taxable-income threshold.
    • CTC phase-out increment boundary (start of a new $2,875 / $3,590 increment).
    • CTC with AGI exactly at the phase-out threshold ($88,500 / $110,640).
  2. Missing 2027+ CTC + surtax integration test. Add an end-to-end household test exercising both provisions in the same simulation for TY2027+.
  3. Currency test cases missing absolute_error_margin: 0.01. Dollar-valued expected outputs should carry a one-cent margin to avoid float-comparison flakiness.
  4. Shared #bookmark6 reference anchor across all 7 parameters. All files use the identical href …/H7127Aaa.html#bookmark6, which renders as the appropriations document and does not land on each distinct value (CTC amount vs. age vs. surtax rate vs. threshold). Prefer per-section anchors, or supplement with the codified-statute links (§ 44-30-104 / § 44-30-2.6) once published, so each link shows the parameter value.
  5. Surtax-threshold uprating ambiguity. The statute states a flat $1,000,000 threshold with no indexing. The implementation matches the statute; recommend team confirmation that the threshold should remain un-uprated before TY2029.
  6. Run make format. Cosmetic blank-line / formatting cleanup before merge (mandatory per project policy).

Reference note: the deep statutory sub-numbering (e.g. § 44-30-2.6(c)(3)(A)(I)(2), § 44-30-104(a)(1)/(b)/(c)) and the phase-out figures could not be independently verified from a fetchable copy of the enacted bill text in the reference-validator pass; however the budget-scan confirmed all numeric values against the enacted Article 6 text. (c)(3)(A) "Tax imposed" is the correct amendment target and § 44-30-104 is the consistent next CTC section in Part VI. A reviewer should confirm the exact deep numbering against the enacted text — do not guess-correct it.

Suggestions

  1. Description verbs. A few variable/parameter descriptions use verbs outside the strict approved list; align where convenient.
  2. "before refundable credits" label mismatch. Noted in the aggregation labeling — this is pre-existing, not introduced by this PR; flagging only for awareness.
  3. Verify § 44-30-104 refundability against the RI-1040 form. The enacted § 44-30-104 text says only "a tax credit … shall be allowed" — it does not literally state "refundable" (though the Governor's release calls it refundable). Confirm refundable treatment / schedule placement against the TY2027 RI-1040 form once published.

Budget Law Scan — Other Tax Provisions (per reviewer request)

A full scan of the enacted H 7127 Substitute A, Article 6 ("Relating to Taxes and Fees," six sections) was performed for other household-relevant tax provisions beyond the CTC and surtax this PR claims. No Title 44 income-tax amendments exist outside Article 6.

The one clear additional household-relevant gap:

  • Social Security modification — age-requirement removal (§ 44-30-12(c)(8)(ii)), effective TY2027+. New (c)(8)(ii) repeats the existing income tests (FAGI < $80,000 single/HoH/MFS; < $100,000 MFJ/QW, CPI-indexed from base 2000) but drops the age clause entirely — so any filer under the income caps gets the full Social-Security subtraction regardless of age starting TY2027. PolicyEngine already models this mechanism via ri_social_security_modification_eligible.py (gates on age_eligible = birth_year <= p.birth_year) and the gov.states.ri.tax.income.agi.subtractions.social_security.limit.birth_year parameter (currently populated only through 2025). Implement by setting the TY2027 birth_year threshold to a far-future sentinel (or branching the formula to drop age_eligible for 2027+), leaving the income test intact. A small, low-risk edit — recommend this PR or a fast follow-up.
    • Correction to honor: enacted Sub A does NOT include the 2028 income-cap raises or 2029 full exemption — those were the Governor's proposal only (no "2028"/"2029" references exist in § 44-30-12). Implement only the TY2027 age-gate removal.

Out of scope — correctly omitted (not household income-tax provisions):

  • Tax Amnesty Act of 2026 (new ch. 44-6.6) — 75-day administrative penalty/interest amnesty; no change to statutory household liability.
  • Business Corporation Tax OBBBA decoupling (§§ 44-11-2.2/2.3/11) — corporate income tax; PolicyEngine US is a household model.
  • Cigarette / OTP / ENDS (§§ 44-20-1/4.1/8.2) — enacted Section 3 has no rate change (only definitions/licensing/transactions); tobacco excise is not modeled regardless.
  • Estate/trust high-income surtax (§ 44-30-2.6, 1%/2%/3% over $36,427) — fiduciary returns, not household scope.
  • Governor's-version-only items not in enacted Article 6 (motor fuel 2-cent cut, MV excise reimbursement, Rebuild RI credit cap).

Uncertain / deferred:

  • Individual § 174A R&D add-back (§ 44-30-12(b)(10) / (c)(14)) — technically modifies ri_agi for self-employed/pass-through owners with domestic R&D spend, but depends on federal §174A-vs-§174 expensing PolicyEngine does not yet compute, and affects a narrow population. Defer (model federal R&D expensing first).

Bottom line: PR #8630 is reasonably scoped for what it claims. The Social Security age-gate removal is the one clear additional household-relevant provision from the same bill worth picking up (this PR or a fast follow-up).

Validation Summary

Validator Result Notes
Regulatory accuracy PASS (APPROVE) CTC and surtax match enacted Sub A; exemption double-count concern cleared
References PASS w/ warnings Every value referenced and corroborated; dual session-law + codified citation. Fix shared #bookmark6 anchor; confirm deep sub-numbering
Code patterns PASS Follows PolicyEngine conventions; run make format for cosmetics
Test coverage ADEQUATE w/ gaps Core RI tests pass; add boundary + 2027 integration tests + currency margins
CI INFORMATIONAL Failures are HuggingFace 429 + concurrency cancellation, not PR defects; PR's own RI tests passed
Budget-law scan COMPLETE One household-relevant gap (SS age-gate removal); rest correctly out of scope

Review Severity: COMMENT

No blocking issues. The PR is accurate and well-implemented; all recommendations are enhancements, not defects.

CI note: The CI failures are infrastructure-related, not PR defects. The one genuine failure ("Full Suite - Rest") was a HuggingFace HTTP 429 Too Many Requests while downloading datasets (county_fips_2020.csv.gz, cps_2023.h5); the remaining "failures" were concurrency cancellations (a newer merge-ref run superseded this one). The PR's own RI CTC + surtax tests passed (Quick Feedback: "10 passed"; baseline/contrib/state shards green). Recommended action: re-run the failed/cancelled jobs once HuggingFace rate limits clear (or push an empty commit). No code change to the PR is warranted for CI.

Next Steps

  • Run /fix-pr 8630 to apply the Should-Address fixes (boundary tests, 2027 integration test, currency margins, per-section reference anchors, make format).
  • Re-run the failed/cancelled CI jobs (infrastructure flakiness, not a code issue).
  • Confirm with the team whether the $1M surtax threshold is intended to remain un-uprated.
  • Open a follow-up (or add here) to extend the RI Social Security modification — remove the age/birth-year gate for TY2027+ via the existing social_security.limit.birth_year parameter (TY2027 only; not the Governor's 2028/2029 changes).

@daphnehanse11 daphnehanse11 changed the title [codex] Add Rhode Island current-law CTC and surtax Add Rhode Island 2027 tax updates Jun 15, 2026
@DTrim99

DTrim99 commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator

Program Review (re-review) — PR #8630: Rhode Island 2027 tax updates

This is a follow-up review after the PR was expanded since my earlier review. The author picked up the one household-relevant gap I flagged from the budget-law scan — the Social Security subtraction age-gate removal (§ 44-30-12(c)(8)) — and also addressed prior feedback (deep-link reference anchors replacing the shared #bookmark6, plus added CTC/surtax boundary tests and a combined integration case).

Scope of this pass: the new Social Security modification is reviewed in full against the enacted bill; the CTC and surtax are cosmetic-only this round (description rewordings, reference-anchor fixes, added tests — no value or logic changes), so their prior verdict carries forward. CI: all checks passing.

Critical (Must Fix)

None. The Social Security change correctly reflects enacted § 44-30-12(c)(8), and CI is green.

Should Address

  1. Hard-coded effective-date year 2027 in formula logic. Both ri_social_security_modification.py and ri_social_security_modification_eligible.py compute age_eligible = (birth_year <= p.birth_year) | (period.start.year >= 2027). The literal 2027 is a hard-coded year embedded in formula logic (the same class as the forbidden month >= 10), and it's duplicated across both files (DRY). Recommended fix (cleanest here): extend the existing …/social_security/limit/birth_year.yaml parameter — which already steps the SSA full-retirement birth-year cutoff +1/year (1955→1959 over 2021→2025) — by continuing the 2026 step and adding 2027-01-01: 9999 (a far-future sentinel = universal age eligibility), then revert both formulas to the parameter-only birth_year <= p.birth_year. This removes the literal and the duplication with no new files. (An in_effect boolean is also valid but heavier — it adds a param and keeps branching in both formulas.)
  2. Missing test: lower side of the effective-date cutoff. Tests cover the 2027 eligible side but not a 2026 under-age filer → ineligible case to pin the boundary (this also covers the pre-2027 no-regression check, currently only weakly tested at 2021/2025).
  3. Missing test: 2027 income-cap boundary. The 2027 cases use AGI $70k (far below) and $200k (far above); the actual cap boundary is untested. Note the $80k/$100k figures are 2016 base values that uprate (~$107k/$133,750 by 2025) — add at-cap → false and just-below → true cases for SINGLE and JOINT, asserting against the uprated 2027 cap with period 2027.
  4. Extend the integration test to include the SS subtraction. The new integration.yaml 2027 case combines CTC + surtax only (the filer is age 40 with no Social Security income). Add a 2027 filer carrying social_security + birth_year so all three 2027 provisions are exercised together.
  5. Pre-existing invalid absolute_error_margin: 2 on boolean cases. The five pre-existing 2025 boolean eligibility cases in ri_social_security_modification_eligible.yaml carry absolute_error_margin: 2, which makes true/false indistinguishable (a non-functional test). The PR's new 2027 boolean cases correctly omit the margin — recommend stripping the margin from the old cases while the file is open. (Pre-existing, not introduced by this PR.)

Suggestions

  1. Reference field should be a tuple, not a list. The SS variables now cite multiple references using a Python list []; the variable-patterns standard requires a tuple ().
  2. Changelog filename. The fragment text was updated for the broadened scope, but the filename is still ri-current-law-ctc-surtax.added.md while the PR is now titled "RI 2027 tax updates." Consider renaming. Cosmetic.
  3. Carry-forward (unchanged from prior review): the surtax's $1M threshold uprating remains a debatable design choice — the statute states a flat $1,000,000 with no indexing. Worth a one-line team confirmation that it should stay un-uprated before TY2029.

Validation Summary

Check Result
Regulatory accuracy (SS modification) PASS — matches enacted § 44-30-12(c)(8): 2027 age-gate removal, income caps retained, income gate still enforced, retirement subtraction still age-gated, no 2028/2029 changes, no pre-2027 regression
Code patterns (SS modification) 1 standards issue — hard-coded 2027 (parameterize) + tuple-reference + changelog filename
Test coverage (SS modification) Adequate but gaps — 2026 boundary, 2027 income-cap boundary, SS-in-integration; pre-existing boolean margin to strip
CTC / surtax Unchanged (cosmetic only) — prior verdict carries forward
CI status All checks passing

Review Severity: COMMENT

No blocking issues. The Social Security addition is regulatorily correct and the PR's prior CTC/surtax work is sound. The main standards item is the hard-coded 2027 (parameterize via the existing birth_year parameter); the rest are test-coverage and cosmetic items.

Next Steps

  • To apply these fixes: /fix-pr 8630 (parameterize the 2027 cutoff, add the boundary + integration tests, tuple references, strip the stale boolean margin).

@daphnehanse11

Copy link
Copy Markdown
Collaborator Author

Addressed David's follow-up review in 298cf0a:

  • moved the 2027 Social Security age-gate removal into social_security/limit/birth_year.yaml with 2027-01-01: 9999
  • removed the hard-coded period.start.year >= 2027 checks from the Social Security variables
  • switched the Social Security variable references to tuples
  • removed boolean-test error margins from ri_social_security_modification_eligible.yaml
  • added 2026 under-age and 2027 single/joint income-boundary tests
  • extended the RI integration case to assert the Social Security subtraction
  • renamed the changelog fragment to ri-2027-tax-updates.added.md

Local verification:

  • uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml -c policyengine_us -v
  • uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification.yaml -c policyengine_us -v
  • uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/integration.yaml -c policyengine_us -v
  • make format
  • uv run ruff check policyengine_us/variables/gov/states/ri/tax/income/agi/subtractions/social_security
  • git diff --check

@DTrim99

DTrim99 commented Jun 16, 2026

Copy link
Copy Markdown
Collaborator

Program Review (re-review) — PR #8630: Rhode Island 2027 tax updates

Follow-up after Daphne's latest changes. Headline: the failing CI check is unrelated flaky infrastructure, not a code problem, and the new changes correctly address the prior review.

❓ Why is "Full Suite - Rest (Python + variables/ YAMLs)" failing?

It's a transient HuggingFace rate-limit — not an actual test failure, not a timeout, and not caused by this PR.

  • The only failed test in the entire 11m42s log is tests/utilities/test_load_county_fips_dataset.py::...test_when_downloading_and_parsing_county_fips__result_is_correct, which raised:
    huggingface_hub.errors.HfHubHTTPError: 429 Too Many Requests for url:
      https://huggingface.co/api/models/policyengine/policyengine-us-data
    Exception: Unable to download dataset county_fips_2020.csv.gz from Hugging Face.
    
  • That test downloads a county-FIPS dataset from HuggingFace; it failed on a 429 rate-limit, before any assertion ran. The job's ~11m42s runtime just means the suite ran to completion — it is not a hung/timed-out job.
  • The failing file is unrelated to RI tax logic, and zero RI tests failed — the new birth_year parameters (including the 9999 sentinel), the retirement-income subtraction, CTC, and high-earner tax all passed validation and tests.
  • Action: click "Re-run failed jobs" — the 429 is transient and should clear. No code/parameter change is warranted. (If it recurs across many PRs, it's a repo-wide CI/HuggingFace-token issue, still independent of this PR.)

✅ Review of the new changes — prior feedback addressed

  1. Hard-coded 2027 removed (was my main standards item). period.start.year >= 2027 is gone from both ri_social_security_modification.py and ri_social_security_modification_eligible.py; they now use the parameter-only birth_year <= p.birth_year. The 2027 cutoff is encoded in social_security/limit/birth_year.yaml as 2026-01-01: 19602027-01-01: 9999 (far-future sentinel = universal age eligibility from 2027, income caps still applied). Clean fix.
  2. Retirement subtraction age gate correctly preserved (nicely handled). A separate new taxable_retirement_income/birth_year.yaml was added that stops at 2026-01-01: 1960 with no sentinel, and ri_retirement_income_subtraction_eligible.py was decoupled from the SS limit parameter so it reads its own birth_year. This was the right call — had it kept borrowing the SS parameter, it would have inherited the 9999 and wrongly granted universal retirement eligibility in 2027. A new test asserts a born-1990 filer is ineligible for the retirement subtraction in 2027. ✔
  3. Boundary tests added across the SS modification / eligible / retirement test files (2026-vs-2027 cutoff), and the stray absolute_error_margin entries on boolean cases were removed. ✔
  4. Changelog renamed to ri-2027-tax-updates.added.md to match the broadened scope. ✔
  5. CTC and surtax are byte-identical to the previous round (verified) — no logic or value changes; the earlier APPROVE verdict carries forward.

Remaining minor / carry-forward (non-blocking)

  • Surtax $1M threshold uprating (carry-forward, unchanged): the statute states a flat $1,000,000 with no indexing, but the implementation uprates it. Still worth a one-line team confirmation that it should remain un-uprated before TY2029.
  • Optional: confirm the 2027 income-cap boundary (at/just-above the uprated cap for SINGLE and JOINT) is among the added cases, and consider extending integration.yaml so a 2027 filer exercises the SS subtraction alongside CTC + surtax. Minor.
  • Optional: multiple references on the SS variables should use a tuple () rather than a list [] per the variable-patterns standard.

Validation Summary

Check Result
CI — "Full Suite - Rest" failure Unrelated flaky HuggingFace 429 (county-FIPS download); not a real failure, not a timeout, not PR-caused. Re-run to clear.
Regulatory (SS modification) PASS — matches enacted § 44-30-12(c)(8); retirement subtraction correctly still age-gated
Code patterns PASS — hard-coded 2027 now parameterized; retirement param correctly decoupled
Test coverage Improved — 2026/2027 boundary cases added; invalid boolean margins removed
CTC / surtax Unchanged (byte-identical) — prior verdict carries forward

Review Severity: APPROVE

No blocking issues. The failing check is transient CI infrastructure (re-run it), and Daphne's parameterization correctly resolves the prior standards finding while preserving the retirement-subtraction age gate. Remaining items are a carry-forward design question (surtax threshold uprating) and optional polish.

@PavelMakarchuk

Copy link
Copy Markdown
Collaborator

Generated by an automated multi-agent review (regulatory, references, code, tests, and PDF source audit agents consolidated).

Program Review — RI 2027 Tax Updates (PR #8630)

This PR adds three Rhode Island personal-income-tax provisions enacted in the FY2027 budget (2026 R.I. H 7127 Substitute A as amended, Article 6 §§4–5): a new refundable Child Tax Credit (§44-30-104), a high-income surtax over $1M (§44-30-2.6), and removal of the Social Security subtraction's full-retirement-age gate (§44-30-12(c)(8)).

Verdict on the three review concerns

  • Completeness — CONFIRMED. No personal-income-tax provision from Article 6 §§4–5 was missed. The CTC, surtax, and SS age-gate removal are all modeled. Article 6 Secs 1–3 (tax amnesty, business-corporation tax, cigarette/tobacco) and the estate/trust surtax table (§44-30-2.6(c)(3)(II)) are correctly out of scope for the household income-tax model.
  • Citations — CONFIRMED (one interpretive caveat). All 10 audited parameters carry a reference with title + href tracing to the enacted Substitute A (H7127Aaa), with verified text-fragment anchors. Zero superseded-draft contamination ($320 CTC / $261,000 phase-out from the introduced bill appear nowhere). The single soft spot: CTC refundability has no statutory wording in §44-30-104 and is currently sourced to a legislator press release (see Should Address Basic prototype #1).
  • Values — CONFIRMED, ZERO MISMATCHES. Every modeled value matches the enacted bill verbatim: CTC $330 / age ≤18 / $88,500 / $110,640 / $2,875 / $3,590 / 20pp per step; surtax 1%/2%/3% over $1,000,000 for TY2027/28/29; SS age gate removed 2027+ with $80k/$100k income limits retained.

Source Documents

  • Enacted bill (PRIMARY): 2026 R.I. H 7127 Substitute A as amended — https://webserver.rilegislature.gov/BillText26/HouseText26/H7127Aaa.pdf (393 pp; Art 6 §4 CTC p130–132, §5 surtax p143 and credit-ordering p147, §5 SS subtraction p151–152).
  • Senate Fiscal Office FY2027 Budget Report (as passed House Finance): https://www.rilegislature.gov/sfiscal/Budget%20Analyses/FY2027%20SFO%20Budget%20as%20passed%20by%20House%20Finance.pdf (p8 confirms all three provisions; calls the CTC "refundable").
  • Governor McKee signing press release: https://governor.ri.gov/press-releases/governor-mckee-signs-fiscal-year-2027-budget-advancing-key-affordability-all (confirms "$330/child, refundable").
  • Superseded for contrast only: introduced H 7127 (.../HouseText26/H7127.pdf, $320 CTC / $261,000 phase-out) — not cited by any parameter.

Critical (Must Fix)

None. No blocking defects. All parameter values match the enacted statute, citations trace to the correct version, wiring is correct (no double counts), and all local tests pass. The lone CI red — "Full Suite - Rest" — is a HuggingFace 429 (rate-limit) infrastructure flake with no RI dependency; re-running the job clears it.

Should Address

  1. Strengthen the CTC refundability citation.
    File: policyengine_us/parameters/gov/states/ri/tax/income/credits/refundable.yaml
    §44-30-104 never uses the word "refundable"; refundability is inferred (the credit is listed as item (n) without the "shall not exceed Rhode Island tax liability" limiter that the non-refundable Child & Dependent Care credit (g) carries). The current citation leans on a legislator press release. Add the SFO FY2027 Budget Report p8 ("$330 per child refundable tax credit") and/or the Governor's signing press release as the corroborating sources, since both are more authoritative than the single legislator release. The interpretation itself is sound — keep it; just upgrade the citation.

  2. Add the CTC exact-increment-multiple boundary test.
    File: policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/credits/ctc/ri_ctc.yaml
    The phase-out uses ceil, so the most bug-prone point is AGI exactly at threshold + 1×increment. Tests cover $88,500 (0 increments) and $91,376 (2 increments) but skip single-filer AGI = $91,375 (excess $2,875 → ceil(1.0)=1 → 20% reduction → $264 for 1 child). Add this case to pin the off-by-one edge.

  3. Add CTC JOINT phase-out boundary and a HEAD_OF_HOUSEHOLD case.
    File: ri_ctc.yaml
    The joint test confirms the increment is used but has no "unreduced at $110,640 / first reduction just above" pair mirroring the single-filer boundaries. HEAD_OF_HOUSEHOLD, SEPARATE, and SURVIVING_SPOUSE thresholds (sharing the $88,500/$2,875 values) are never exercised, so a broken breakdown lookup for those statuses would go uncaught. Add at least one joint boundary pair and one HOH case.

  4. Add a 2027 JOINT both-spouses-young SS-modification case.
    File: policyengine_us/tests/policy/baseline/gov/states/ri/tax/income/agi/subtractions/social_security/ri_social_security_modification_eligible.yaml
    The 2027 age-removal flip is tested only for a SINGLE filer. older_spouse_birth_year gates the married path; add a 2027 joint both-born-1990 eligible case to confirm the removed gate flows through the spousal input.

  5. Verify the surtax threshold does not uprate the 2027 value.
    File: policyengine_us/parameters/gov/states/ri/tax/income/high_earner_tax/threshold.yaml
    The bill applies "as adjusted for inflation" only from TY2028 (bill lines 11420/11430); TY2027 (line 11410) has no inflation language. Confirm the parameter keeps $1,000,000 fixed for 2027 and only uprates 2028+. (The 2028/2029 test expected values — $4,585, $6,216 — imply an uprated threshold, which is correct for those years; just confirm 2027 itself is un-indexed.) Also add inline calc comments on the 2028/2029 surtax cases so a future reader does not read $4,585 as wrong.

Suggestions

  1. Add PDF #page= anchors alongside the #:~:text= HTML links in the parameter references for robustness, since the .html bill is a ~390-page single document and text-fragment scrolling depends on browser support: CTC p130–132, surtax p143, SS p151–152.
  2. Prefer title/href reference pairs over #:~:text= text-fragment anchors in the variable-level reference fields (ri_ctc.py, ri_ctc_eligible_child.py); the parameter files already do this. Cosmetic.
  3. Document the CTC inflation approximation. The PR uprates via gov.irs.uprating ($5 down-rounding) rather than the statute's explicit RI-CPI, 2026-base method (§44-30-104(d)). This is the standard PolicyEngine RI approximation and the $5 interval matches; note it for precision-sensitive users. No code change needed.
  4. Rebase the branch on main. It is 23 commits behind, which makes git diff main show misleading noise (pyproject version appears to regress 1.729.5→1.729.0, Makefile/workflow/OK-STC/MI changes). The true PR diff (vs merge-base) is 25 RI-only files. Rebasing clears the noise before merge.
  5. Add SS-limit uprating comment. The 2027 SS income-limit boundary tests hard-code $107,000/$133,750 (2025 values); these hold in 2027 only because the uprating index is 1.0 through 2027. Add an inline comment so the constants are not mistaken for stale values.

SFO-report caveat

The SFO FY2027 report prose (p8) inverts the CTC phase-out thresholds — it reads "less than $88,500 if married filing jointly, or less than $100,000 for all other filers," which is backwards. The enacted bill text is authoritative and opposite ($88,500 single-type / $110,640 joint), and the PR correctly follows the bill text, not the SFO summary. No action needed; cite the bill, not the SFO prose, for the threshold values.

Validation Summary

Area Result Notes
Regulatory accuracy PASS All §§44-30-104 / 44-30-2.6 / 44-30-12(c)(8) values match verbatim; phase-out, surtax base, credit-ordering placement, and SS scoping all statutorily correct
References PASS 10/10 params cite enacted H7127Aaa; 0 missing, 0 superseded-version citations, 0 jurisdiction mismatches; refundability citation could be upgraded
Code patterns PASS No hard-coded values; correct entities/periods/aggregation (adds); surtax & refundable CTC each wired exactly once (no double count); retirement subtraction correctly decoupled to its own birth-year param
Test coverage PASS (hardening recommended) 11 param/system + 140 RI YAML pass locally; 2027 year-boundary + key thresholds covered; add $91,375 CTC edge, joint/HOH cases, joint SS case
Source value audit PASS — ZERO MISMATCHES All CTC/surtax/SS values match H 7127 Sub A; no superseded-draft contamination; refundability correctly modeled
CI status INFRA FLAKE Only "Full Suite - Rest" red, from HF 429 (no RI dependency); all other jobs green; re-run clears it

Review Severity: COMMENT

The PR is regulatory-accurate, standards-compliant, correctly cited, and value-clean (zero mismatches) — it is approvable on substance. Severity is COMMENT rather than a plain approve only because of constructive, non-blocking items: upgrade the CTC refundability citation (#1), add a handful of boundary/filing-status tests (#2#4), confirm the 2027 surtax threshold stays un-indexed (#5), and rebase to clear diff noise. None of these block merge; re-run the flaky CI job before merging.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants