Skip to content

Remove the abolish-tax structural reforms so household totals keep every other tax - #10071

Open
MaxGhenis wants to merge 7 commits into
mainfrom
fix-reform-household-tax-drift
Open

MaxGhenis wants to merge 7 commits into
mainfrom
fix-reform-household-tax-drift

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

This removes the contributed abolish-federal-income-tax and abolish-payroll-tax structural reforms. Their parameters stay and still abolish the two taxes. With either parameter on, household tax and net income now count every other baseline tax. Before, each reform replaced the household totals with a copy built from a separate hand-kept list. That list had drifted from the baseline, so household_net_income changed by more than the abolished tax.

No baseline value changes: every change is behind a contrib parameter that defaults to false.

The defect (read from code at upstream main 0590757714)

Baseline household_tax_before_refundable_credits is an adds list: employee_payroll_tax, self_employment_tax, income_tax_before_refundable_credits, flat_tax, household_state_tax_before_refundable_credits, local_income_tax_before_refundable_credits, local_occupational_tax. The state member adds the list parameter gov.states.household.state_income_tax_before_refundable_credits and state_use_tax.

When gov.contrib.ubi_center.flat_tax.abolish_federal_income_tax or abolish_payroll_tax was true at the start instant, create_structural_reforms_from_parameters applied a reform that replaced that variable with a formula. The formula summed a different list parameter, gov.household.household_tax_before_refundable_credits, less one member. Comparing the two lists:

In the baseline path, missing from the reform list Effect with either parameter on
id_pbf Idaho permanent building fund tax dropped
ca_use_tax, in_use_tax, nc_use_tax, ok_use_tax, pa_use_tax use tax dropped (Illinois kept it through il_total_tax)
local_income_tax_before_refundable_credits except its New York City member Maryland county, Indiana county, Multnomah County, Philadelphia, Kansas City, St. Louis, Yonkers and Wilmington taxes dropped
local_occupational_tax Colorado and Kentucky occupational taxes dropped
pa_income_tax_before_refundable_credits (the reform list held pa_income_tax, which subtracts pa_refundable_tax_credits) Pennsylvania refundable credits counted twice, once inside the tax and once in household_refundable_tax_credits

Three more faults in the same code:

  • The two reforms did not combine. Each called update_variable with its own full formula, so the one applied later overwrote the other.
  • The structural reforms were switched on only if the parameter was true at the start instant (DEFAULT_START_DATE, 2024-01-01). A parameter set from a later year left them off. For the income tax, federal refundable credits then stayed in household net income while income_tax was 0. The YAML test runner never applies structural reforms, so it showed the same.
  • gov.household.household_refundable_credits had no reader at all.

Why remove the reforms rather than fix them

With either parameter on, the baseline formulas already return 0 for the abolished tax: income_tax_before_refundable_credits and income_tax for the income tax, employee_payroll_tax for payroll tax. Taking a zero out of the household total changes nothing. So the reforms' only effect on household tax was the drift above.

The one thing the parameters did not already do was leave federal refundable credits out of household net income when the federal income tax is abolished. That is now a check in household_refundable_tax_credits, read for each year. It goes there and not in income_tax_refundable_credits, because seven other contributed reforms replace income_tax_refundable_credits and would drop the check, while no reform replaces household_refundable_tax_credits.

The change

  • Deleted policyengine_us/reforms/federal/ (both reforms) and their entries in policyengine_us/reforms/reforms.py.
  • household_refundable_tax_credits becomes a formula: state plus local refundable credits, plus income_tax_refundable_credits unless abolish_federal_income_tax is true for that year. This matches income_tax, which nets federal refundable credits and is 0 under the parameter.
  • Deleted gov/household/household_tax_before_refundable_credits.yaml (only the two reforms read it) and gov/household/household_refundable_credits.yaml (nothing read it).
  • tests/test_aggregate_list_integrity.py gains test_no_reform_redefines_a_household_tax_total, which parses policyengine_us/reforms/ and fails if any reform defines a class named after a household tax total.

What was checked before deleting

  • Readers of the two reform modules and module-level objects: only reforms.py (repo git grep). GitHub code search across the PolicyEngine and UBICenter organizations finds no other importer. UBICenter/blank-slate-ubi-us (policy.py) and PolicyEngine/blank-slate-ubi-in-the-us (notebook) set the two parameters, which are kept.
  • gov.household.household_tax_before_refundable_credits: read only by the two reforms (repo grep; organization code search finds no other reader).
  • gov.household.household_refundable_credits: no reader in the repo or the organization search.
  • Local clones of policyengine-api, policyengine-api-v2, policyengine.py, policyengine-household-api, policyengine-core, policyengine-skills and microcosm (the branch each had checked out) do not mention either parameter path. policyengine-app-v2 mentions both only inside its mock file app/src/mocks/US_Metadata.json.

Reproduction

One simulation of 17 single-adult households, 2025, $60,000 of wages unless noted, with both parameters on from 2024-01-01. "Gap" is household_tax_before_refundable_credits minus the sum of the baseline components evaluated in the same simulation; it should be zero.

Household Dropped or miscounted on main Gap on main Gap on this branch
Idaho permanent building fund tax $10 −$10.00 pending
California use tax $6 −$6.00 pending
Indiana, Boone County county tax $1,003 −$1,003.00 pending
North Carolina use tax $40.50 −$40.50 pending
Oklahoma use tax $33.60 −$33.60 pending
Pennsylvania, Philadelphia use tax $30, wage tax $2,250 −$2,280.00 pending
Pennsylvania, $12,000 of wages use tax $6, refundable credits $54.34 counted twice −$60.34 pending
Maryland, Montgomery County county tax $1,710.40 −$1,710.40 pending
Delaware, Wilmington earned income tax $750 −$750.00 pending
Kentucky, Jefferson County occupational tax $1,320 −$1,320.00 pending
Missouri, Kansas City earnings tax $600 −$600.00 pending
New York, Yonkers surcharge $451.41 −$451.41 pending
Oregon, Multnomah County, $200,000 of wages Preschool for All tax $1,082.47 −$1,082.47 pending
Colorado, Denver occupational privilege tax $69 −$69.00 pending
Illinois, New York City, Texas nothing $0.00 pending

Main's column was measured earlier today with the same script (param_path.py in the review folder). The branch column is pending a local run that is waiting for host memory; it will be filled in here. The script also runs a second window, with both parameters true for 2025 only, which main's structural reforms never saw.

Invariants

For every household, period and set of inputs, on this branch:

  1. household_tax_before_refundable_credits is the sum of its baseline adds components, with or without either parameter. No reform redefines it (enforced by the structural test).
  2. With abolish_federal_income_tax true for a year, income_tax_before_refundable_credits and income_tax are 0 for that year, and household_refundable_tax_credits equals household_refundable_state_tax_credits + household_refundable_local_tax_credits. With it false, the federal term is added.
  3. With abolish_payroll_tax true for a year, employee_payroll_tax is 0 for that year.
  4. Each holds for the year the parameter is true, whatever the start instant, because each is a formula check rather than a structural reform.

Tests

YAML, in the two existing files under policy/contrib/federal/ (15 cases). Every case now sets only the parameter; no case names a reform. The cases pin some components and leave the abolished tax to its formula, so it is the parameter that zeroes it.

  • abolish_federal_income_tax.yaml (9 cases): the five existing cases, rewritten without the reform object, plus an Idaho filer (id_pbf computed, $10), California use tax, the Wilmington earned income tax (computed, $500), and Pennsylvania refundable credits counted once (with use tax and household_net_income). On main, six of the nine fail, each by the $800 of federal refundable credits still in household_refundable_tax_credits; the YAML runner applies no structural reform, so on main the parameter alone left the credits in.
  • abolish_payroll_tax.yaml (6 cases): the two existing cases, plus an Idaho filer, North Carolina use tax, the Jefferson County occupational tax (computed, $1,100) and Maryland county income tax. Payroll tax is left to its formula on wages, and each case expects employee_payroll_tax: 0. These pass on main as well, because on the formula path main was already right; they now guard the only path there is.

Structural: test_no_reform_redefines_a_household_tax_total passes on this branch. Against main's policyengine_us/reforms/ it fails and names both reforms' redefinitions of household_tax_before_refundable_credits and the income tax reform's redefinition of household_refundable_tax_credits.

The 17-household check above was run locally as a script. It is not added as a test: with no structural reform left, the YAML runner and Simulation compute the household totals through the same formulas, so the YAML cases cover it.

CI cost

  • No Python simulation test is added. The earlier version of this PR added one; it is gone.
  • The structural test parses source with ast and builds no model.
  • The two YAML files keep two parameter combinations each, and their combination weight in test_batched.py falls from 1.25 to 0.5 each, since they no longer name a structural reform.

Merge order with #10039

#10039 (draft) adds members to gov/household/household_tax_before_refundable_credits.yaml, which this PR deletes. Whichever lands second drops that file. Its additions to gov.states.household.state_income_tax_before_refundable_credits reach the household totals with no further edit.

Partner contract tests

None is edited and none can move: no file under tests/policy/baseline/partners/ sets either parameter, and no baseline value changes.

axiom: n/a: contrib reform aggregation

🤖 Generated with Claude Code

MaxGhenis and others added 5 commits October 10, 2026 15:55
The abolish-federal-income-tax and abolish-payroll-tax reforms replaced
household_tax_before_refundable_credits with a formula that summed a
separate parameter list, gov.household.household_tax_before_refundable_credits,
less the abolished tax. That list had drifted from the baseline adds lists:
it lacked id_pbf, the CA, IN, NC, OK and PA use taxes, and every local tax
except New York City's, and it held pa_income_tax, which is after refundable
credits. Under either reform, household tax and net income were wrong for
those households.

Each reform now redefines the total as the system's current adds list less
its own component, so the lists cannot drift and the two reforms combine.
The parameter list and the unread gov.household.household_refundable_credits
are removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Python value test already applies both reforms to 17 households, and
the YAML case would add one more reform combination for the runner to hold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A reform that edited the default system's lists in place would also have
moved the lists the structural tests compared with, so the check that the
default system is unchanged could pass after an earlier test had already
applied the edit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The replacement variable inherits any formula of the variable it replaces,
and the formula is computed in place of adds, so the exclusion would be
silently ineffective.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new class passed to update_variable drops attributes that core does not
inherit from the replaced variable, among them defined_for, is_neutralized
and a custom set_input. Cloning the current definition and replacing only
its adds list keeps them, as TaxBenefitSystem.neutralize_variable does, and
adds no baseline_variable link when a reform is applied again.

The value test now checks that each household has a nonzero amount of the
tax it is there to exercise, not only that each component is nonzero
somewhere in the population.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 10, 2026 21:10
MaxGhenis and others added 2 commits October 10, 2026 17:35
Adding and neutralizing the test variable already set the flag, so the
assertion passed whether or not exclude_from_total set it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both reforms replaced the household tax totals with copies built from a
separate list. With either flag on, the baseline formulas already return 0
for the abolished tax, so dropping it from the total did nothing; the copy's
only effect was the drift it introduced. The structural reforms were also
switched on only if the flag was set at the start instant (2024-01-01).

The one effect the parameters lacked, leaving federal refundable credits out
of household net income when the federal income tax is abolished, is now a
per-year check in household_refundable_tax_credits, which no reform replaces.
The YAML cases set only the parameters, and a structural test keeps reforms
from redefining any household tax total.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis MaxGhenis changed the title Keep every other tax in household totals under the abolish-tax reforms Remove the abolish-tax structural reforms so household totals keep every other tax Oct 10, 2026
MaxGhenis added a commit that referenced this pull request Oct 11, 2026
Takes main's version of every file #10026 changed. The branch's own change
is the one commit "Make household state tax totals equal each state's own
income tax", rebased onto main. It no longer edits
gov/household/household_tax_before_refundable_credits.yaml, which #10071
removes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Remove the abolish-tax structural reforms so household totals keep every other tax

PR #10071 (author: MaxGhenis, head b2c68b56e5, merge-base 0590757714). 12 files (+210/−240), 7 commits.

Summary

The PR deletes the two UBI Center structural reforms in policyengine_us/reforms/federal/. They were applied when gov.contrib.ubi_center.flat_tax.abolish_federal_income_tax or abolish_payroll_tax was true at the simulation's start instant. It also deletes the two gov.household list parameters that went with them.

  • The bug is real. Each reform replaced household_tax_before_refundable_credits with a copy that summed gov.household.household_tax_before_refundable_credits, a hand-kept list that had drifted from the baseline. I reproduced the PR body's "Gap on main" column on current main. With either parameter on from 2024, the household total:

    • drops the Idaho permanent building fund tax and the California, North Carolina, Oklahoma and Pennsylvania use taxes;
    • drops every local income and occupational tax except New York City's;
    • counts Pennsylvania's refundable credit twice.
  • The replacement is sound. The baseline formulas already return 0 for the abolished tax:

    • income_tax_before_refundable_credits.py:13-16 and income_tax.py:13-16 for the income tax;
    • employee_payroll_tax.py:19-20 for payroll tax.

    So the reforms' only effect on household tax was the drift. The one thing they did that the parameters didn't was to drop federal refundable credits from household net income. That moves into household_refundable_tax_credits as a per-year check. On the head tree the gap is $0.00 in every household I ran (17 states and cities), under each parameter alone, under both, and with the income tax abolished for 2025 only. main's start-instant switch never sees that last case.

  • No outside code breaks. No repository in the PolicyEngine or UBICenter organizations imports the removed module. Outside users set the two parameters, which stay. The two deleted gov.household list parameters inherit economy: false and household: false, so the app never offered them and no saved policy can contain them. No deprecation path is needed.

  • One side effect needs fixing. Turning household_refundable_tax_credits from an adds variable into a formula removes its adds metadata, and app-v2 uses that metadata to build the net-income breakdown. For every US household, current law included, "refundable tax credits" stops expanding into its federal, state and local parts.

  • The PR body is out of date. Its branch-results column still says "pending". Its merge-order note names Make household state tax totals equal each state's own income tax #10039, which no longer touches the deleted file. Meanwhile Model the claim of right repayment deduction and credit (26 U.S.C. 1341) and North Carolina's rules that depend on it #10038, which is open, edits both deleted parameter files.

Critical (must fix)

None.

Should address

1. household_refundable_tax_credits loses its adds metadata, so the app's net-income breakdown can no longer expand refundable tax credits, for every household.

  • What changed. policyengine_us/variables/household/income/household/household_refundable_tax_credits.py:11-26 replaces adds = ["income_tax_refundable_credits", "household_refundable_state_tax_credits", "household_refundable_local_tax_credits"] with a formula. On the head tree, system.variables["household_refundable_tax_credits"].adds is None. On main it is the three-item list.

  • How the app uses it.

    • policyengine-api's metadata exports "adds": variable.adds and "subtracts": variable.subtracts (policyengine_api/country.py:344-345).
    • policyengine-app-v2 loads ${BASE_URL}/us/metadata (app/src/api/metadata.ts:10).
    • Its VariableArithmetic component builds the household_net_income tree only from those two fields (app/src/components/household/VariableArithmetic.tsx:63-100). NetIncomeSubPage.tsx:78 and HouseholdBreakdown.tsx:34 render that tree.
  • Effect.

    • "Refundable tax credits", a direct child of net income, becomes a leaf.
    • Users lose the drill-down into federal refundable credits (EITC, refundable CTC and the rest of gov.irs.credits.refundable) and into state and local credits.
    • Metadata is static, so this happens under current law, not only with the parameter on. It contradicts the PR body's "every change is behind a contrib parameter that defaults to false".
  • Why the formula can't simply keep adds too. policyengine-core (3.32.8 is locked) rejects a variable that declares both: "Variables must use at most one of formula, adds/subtracts, or uprating" (Variable.check_computation_modes).

  • Fix. Keep household_refundable_tax_credits as adds and gate the federal part one level down, outside the variables that reforms replace. For example:

    • Add a household variable household_refundable_federal_tax_credits with adds = ["income_tax_refundable_credits"]. Give it a defined_for boolean that is false when abolish_federal_income_tax is true. The repo already pairs adds with a variable-name defined_for, for example variables/contrib/trump/dividend/trump_dividend.py.
    • Set household_refundable_tax_credits.adds = ["household_refundable_federal_tax_credits", "household_refundable_state_tax_credits", "household_refundable_local_tax_credits"].

    This keeps the app breakdown and the per-year check. It also stays clear of the seven reforms that replace income_tax_refundable_credits, and the new guard test still covers the household totals. If you would rather keep the formula, say so in the PR body and flag the breakdown change to the app maintainers.

2. The PR body is incomplete, and its merge-order section points at the wrong PR.

Suggestions

  1. Guard the components the parameters now depend on.
    • Abolition now relies on the abolish checks inside income_tax_before_refundable_credits, income_tax and employee_payroll_tax. The structural reforms used to drop the abolished tax by name even when another reform had redefined it.
    • Today no reform redefines any of the three; I checked the merged tree. But a future reform that replaces one with its own formula would silently undo the parameter under a combined policy.
    • Consider extending test_no_reform_redefines_a_household_tax_total (policyengine_us/tests/test_aggregate_list_integrity.py:237-263). It could flag reform classes with those three names, or require that such a class reads the abolish parameter.
  2. Optional: add one case where the federal credits come from the formula. Every federal-credit case pins income_tax_refundable_credits: 800. Take a Texas single parent with one child aged 5 and $15,000 of 2025 wages:
    • Federal refundable credits are 4,328 (EITC at the one-child maximum, since $15,000 is between the $12,730 phase-in end and the $23,350 phase-out start) plus min(1,700, 15% × (15,000 − 2,500) = 1,875) = 1,700 of ACTC, for 6,028.
    • With the income tax abolished, income_tax_refundable_credits stays 6,028 and household_refundable_tax_credits is 0.
    • The head tree gives exactly these values. The case would show that the credits are still computed but kept out of net income.

Verified correct

  • Bug on main and fix on the head. I ran 17 single-adult households for 2025, plus the Texas parent above, using Simulation with the parameters set through Reform.from_dict from 2024 on. policyengine-core was 3.33.3. Wages are $60,000 unless noted. "Gap" means household_tax_before_refundable_credits minus the sum of its seven baseline adds components:

    Household Gap on main (either parameter) Gap on head
    Idaho (permanent building fund tax) −10.00 0.00
    California (use tax) −6.00 0.00
    Indiana, Boone County (county tax) −1,003.00 0.00
    North Carolina (use tax) −40.50 0.00
    Oklahoma (use tax) −33.60 0.00
    Pennsylvania, Philadelphia (wage tax 2,250 + use tax 23) −2,273.00 0.00
    Pennsylvania, $12,000 (use tax 6 + Working Pennsylvanians credit 54.34 counted twice) −60.34 0.00
    Maryland, Montgomery County −1,710.40 0.00
    Delaware, Wilmington −750.00 0.00
    Kentucky, Jefferson County (occupational) −1,320.00 0.00
    Missouri, Kansas City −600.00 0.00
    New York, Yonkers −451.41 0.00
    Oregon, Multnomah County, $200,000 −1,082.47 0.00
    Illinois, New York City, Texas, Texas parent 0.00 0.00
    • Where the gaps come from. On main the gaps are identical under the federal-only, payroll-only and combined scenarios. With the income tax abolished for 2025 only, main shows no gap, because the reform never switches on.
    • Federal income tax abolished. On the head, net income rises by exactly the federal income tax (5,071.50 per $60,000 filer, 36,581.76 for the Oregon filer), with three exceptions:
      • Missouri, +5,035.75. Missouri tax rises 35.76 because mo_federal_income_tax_deduction reads income_tax. That is unchanged from main.
      • Pennsylvania $12,000, −543.43, because federal refundable credits leave net income.
      • Texas parent, −6,028, for the same reason.
    • Payroll tax abolished. Net income rises by exactly employee_payroll_tax, for example 4,590 = 60,000 × 7.65%.
  • 2025-only window. On main, with the income tax abolished for 2025 only, the Texas parent's net income stays at 24,555.70 while income_tax is 0, so the credits stay in. On the head it falls by 6,028. This confirms the changelog's "including when the parameter is first set after 2024".

  • PR claim: "On main, six of the nine fail, each by the $800". I ran the head YAML files on main code. Result: 6 failed, all on household_refundable_tax_credits off by 800, and 9 passed, including all six payroll cases.

  • Callers of what's removed.

    • Repo grep at the head and on the merged tree finds no remaining reference to reforms.federal, create_abolish_*_reform, gov.household.household_tax_before_refundable_credits or gov.household.household_refundable_credits.
    • At the merge-base, the first parameter was read only by the two reform files. The second had no reader.
  • Organization code search. I searched the PolicyEngine and UBICenter organizations for create_abolish_federal_income_tax_reform, create_abolish_payroll_tax_reform, policyengine_us.reforms.federal, abolish_federal_income_tax, abolish_payroll_tax, household_refundable_credits and the deleted parameter path. Code search covers only default branches.

    • No hit imports the reform module.
    • UBICenter/blank-slate-ubi-us policy.py and PolicyEngine/blank-slate-ubi-in-the-us set the kept parameters.
    • The PolicyBench hits are pseudocode and audit notes. The code-snippets hit is prose.
    • household_tax_before_refundable_credits hits in other repositories name the variable, which still exists.
  • Deleted parameters were never editable in the app. parameters/gov/household/index.yaml sets propagate_metadata_to_children: true, economy: false and household: false.

  • Reforms on the merged tree.

    • None defines income_tax_before_refundable_credits, income_tax or employee_payroll_tax.
    • Seven define income_tax_refundable_credits: Family Security Act 2024, Tlaib BOOST, EDAA, End Child Poverty Act, Harris LIFT, Harris Rent Relief, and refundable credit conversion. This matches the PR's reason for putting the check on the household total.
    • None defines a household tax total. The new guard passes on the head and on the merged tree. At the merge-base it flags three classes, as the PR says.
  • Both parameters at once are already covered by the baseline test tests/policy/baseline/gov/irs/tax/federal_income/integration.yaml:1-21, which sets both plus abolish_self_emp_tax. It passes on the merged tree.

  • Local test runs.

    • tests/policy/contrib/federal/: 15 of 15 pass on the head.
    • On the merged tree, those 15 plus the two baseline files that set the parameters: 19 of 19 pass.
    • test_aggregate_list_integrity.py on the merged tree: 23 of 23 pass.
  • Hand checks of test expectations.

    • Idaho federal case: 4,590 + 2,000 + 10 = 6,600, and net income 60,000 + 100 − 6,600 = 53,500.
    • Idaho payroll case: 5,000 + 2,010 = 7,010; credits 800 + 100 = 900; net income 60,000 + 900 − 7,010 = 53,890.
    • Wilmington: 40,000 × 1.25% = 500 (gov.local.de.wilmington.tax.income.rate is 0.0125). Total 3,060 + 1,500 + 500 = 5,060.
    • Jefferson County: 50,000 × 2.20% = 1,100 (rate 0.022). Total 3,000 + 1,500 + 1,100 = 5,600.
    • Pennsylvania: tax 100 − 5 = 95; total 100 + 20 = 120; household_tax 115; net income 1,000 + 5 − 120 = 885.
    • Montgomery County: credits 100 + 56 = 156 and household_tax −156.
    • New York City: credits 100 + 200 = 300.
    • Not-abolished case: credits 600 + 800 = 1,400 and total 1,200 + 1,000 = 2,200.
  • Test batching. test_batched.py combo weight per file falls from 1.25 (one structural combo at 1.0 plus one parameter-only combo at 0.25) to 0.5 (two parameter-only combos), as the PR body says.

  • Baseline unchanged. At baseline, head and main give identical household_tax_before_refundable_credits and household_refundable_tax_credits for all 18 households. No partner contract test is touched.

  • Changelog. Both fragments, fix-reform-household-tax-drift.fixed.md and .removed.md, are top-level.

    • The removed type matches the repo's precedent for removing things callers can set: 2.21.0 removed the ABAWD weekly-hours parameter, and a recent release removed the first and second home mortgage interest inputs.
    • No outside importer exists, so breaking isn't warranted.
    • Both fragments' claims check out against the runs above.

Axiom line assessment

Valid n/a. The line reads axiom: n/a: contrib reform aggregation.

  • Results change only when contributed UBI Center parameters for hypothetical abolition are on.
  • No statute or regulation is encoded or changed, and baseline values are unchanged.
  • There is no provision for rulespec-us to mirror.

CI status

All 26 checks pass (gh pr checks 10071), but the run predates 93 commits on main.

  • Run 38090340353 was a pull_request event created 2026-10-10 22:09 UTC, so it tested the merge with main as of that time.
  • On the current merged tree, the affected YAML files (19 cases) and test_aggregate_list_integrity.py (23 tests) pass locally with policyengine-core 3.33.3.
  • No partner test files are touched.

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The bug reproduces on main, and the head gives a $0.00 gap for every household and scenario. No org repo imports the removed module, and the deleted parameters were app-hidden, so no deprecation path is needed. Two should items (see the comment above): (1) household_refundable_tax_credits switches from adds to a formula, so its adds metadata becomes None, and app-v2's net-income tree, which reads adds/subtracts, would show 'Refundable tax credits' as a leaf for every US household. Keep adds and gate the federal part in a new component with a defined_for boolean. (2) The PR body's 'Gap on this branch' column still says pending, the #10039 note is stale, and #10038 edits both deleted parameter files, so whichever lands second hits a modify/delete conflict.

This branch has not been deployed

No deployments
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.

2 participants