Skip to content

Apply the Maryland and Maine EITC waivers of the 32(m) SSN requirement - #10527

Draft
MaxGhenis wants to merge 12 commits into
state-eitc-section-911-md-me-njfrom
state-eitc-itin-md-me
Draft

MaxGhenis wants to merge 12 commits into
state-eitc-section-911-md-me-njfrom
state-eitc-itin-md-me

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Status (2026-10-29 16:06Z): Sol's r7 review approved 2819d69563 with two wording fixes and a coverage note. 5a92f6cc0c makes them, runs the labor-supply test with the filing requirement by formula and by input, and closes the gaps the mutation run found: Maryland's pro forma had no investment-income case, and a new test runs both states' pro formas in one simulation in both orders. The mutation table below is complete. Sol's r8 review of that test-only commit is in progress, and the microsim waits for #10525.

Stacked on #10525. GitHub retargets this PR to main when #10525 merges, and CI (pr.yaml) runs only once the base is main.

This PR applies the 26 U.S.C. 32(m) waivers that Maryland and Maine enact for their EITCs. Section 32(m) limits the taxpayer identification number required by 32(c)(1)(E) (filer and spouse) and 32(c)(3)(D) (qualifying children) to a Social Security number valid for employment. On main and in #10525, every MD and ME path still requires that number.

Law

  • Maryland, Md. Code Tax-Gen. 10-704. Each path computes the § 32 credit "without regard to" or "but for the limitation under § 32(m)":

    • (c)(1)(i), state nonrefundable;
    • (c)(2)(iii), state refund;
    • (c)(3)(i)2, the childless credit;
    • (d)(1)(i) and (d)(2)(iii), the county credit.

    Chapter 40 of 2021 (SB 218) applies the waiver to tax years from 2020 (Comptroller Tax Alert 03-11-2021), and Chapter 3 of 2023 made it permanent. The 2025 Resident Booklet (Instructions 18 and 19) tells filers to calculate "the federal earned income credit disregarding the SSN requirement" for both the state and the local credit.

  • Maine, 36 M.R.S. 5219-S(7), from 2021: "for an individual who files a federal income tax return, notwithstanding Section 32(m) of the Code ... the taxpayer identification number required by Section 32(c)(1)(E) and 32(c)(3)(D) of the Code means a federal individual taxpayer identification number ... or a social security number". Unlike Maryland's, Maine's waiver reaches only a filer of a federal return.

Neither state waives 32(c)(1)(C), the bar on section 911 claimants, and every new path keeps it.

METHODOLOGY_CHOICE: the return as filed. This PR computes the waived federal credit on the federal return as filed. Neither statute says whether the filer re-chooses the itemization election for the waived credit; the state instructions support the choice. Maryland's booklet has an ITIN filer calculate "the federal earned income credit disregarding the SSN requirement", and Maine's worksheet has the filer complete a "pro forma" federal EIC worksheet. That worksheet takes AGI from the return: "Enter the amount from Form 1040 or 1040-SR, line 11" (2024 Form 1040 instructions, EIC Worksheet A, line 3).

Design

An ITIN holder is ssn_card_type: NONE with has_tin: true, the convention CO, IL, DC and CalEITC (#10322) already use. A person with no TIN has has_tin: false. A Social Security number not valid for employment (OTHER_NON_CITIZEN) also passes both states' test.

The waiver reaches only the EITC's identification test. Two new federal variables carry it:

  • eitc_ssn_limitation_waived (tax unit, input, default false): whether the EITC variables accept any TIN in place of the Social Security number valid for employment that 32(m) requires.
  • eitc_identification_accepted (person): meets_eitc_identification_requirements, or any TIN (has_tin) where the flag is set.

eitc_child_count, filer_meets_eitc_identification_requirements and the Working Parents Tax Relief Act's eitc_young_child_count read eitc_identification_accepted. The other readers of meets_eitc_identification_requirements keep the valid-SSN test: the 2020-2021 recovery rebate credits (26 U.S.C. 6428(g), 6428A(g)), Colorado's comparison of its own test with the federal one, and the Montana newborn credit reform. The flag is false outside the state branches, so every federal value equals main's.

Whom the waiver reaches. Three tax-unit variables say it:

  • md_eitc_ssn_limitation_waived: every Maryland return from 2020.
  • me_eitc_ssn_limitation_waived: from 2021, a Maine return whose filer files a federal return. The test is the federal eitc formula's filing condition (eitc_filing_requirement_met: required to file, filing voluntarily, or would file to claim a refundable credit, Maine's own included), read on the parent, so the childless pro forma's own voluntary filing (below) can't satisfy it.
  • state_eitc_ssn_limitation_waived: either of the two.

METHODOLOGY_CHOICE: who files a federal return (Sol's r5 finding 1). PE-US's tax_unit_is_filer counts a tax unit that would file to claim a refundable credit only when it is eligible for a federal one (eligible_for_refundable_credits: eitc or the refundable CTC above zero). Section 32(m) denies an ITIN filer the federal EITC, so tax_unit_is_filer calls such a filer a nonfiler even when it would file for Maine's credit. This PR counts Maine's refundable EITC among the credits a filer files to claim, for three reasons:

  • An SSN twin with the same inputs and a federal credit files under tax_unit_is_filer. Subsection 7 accepts the ITIN filer's identification as federal law accepts the twin's, and this reading treats the two the same.
  • would_file_if_eligible_for_refundable_credit covers "a refundable tax credit (EITC, ACTC, etc.)" and doesn't limit it to federal credits.
  • PE-US already treats a tax unit that takes up a credit it is due as filing where tax_unit_is_filer is false (files_return_for_aca_ptc).

tax_unit_is_filer in its place would pay $0 to Sol's household (2025, single, 20, $5,000 of wages, an ITIN, filing only to claim a credit), where this PR pays $191.25; me_eitc_itin.yaml pins tax_unit_is_filer: false for it. With both filing inputs at their defaults (voluntary false, credit true), every Maine ITIN filer counts as filing, so the condition binds only where a household's inputs say it wouldn't file.

The waived branch. federal_eitc_tax_unit(tax_unit, period) in state_eitc_helpers.py:

  • When the waiver accepts no one new (no waived tax unit has a member with a TIN but no valid SSN), it returns tax_unit.
  • Otherwise it returns the tax units of a branch, eitc_without_ssn_limitation, with the flag set to state_eitc_ssn_limitation_waived and with the AGI and behavioral responses of the return as filed (keep_return_as_filed). Every state credit gives the branch the same flag, so the order in which a simulation calculates the two states' credits can't change it.

The 32(m)-free credit (md_ and me_federal_eitc_without_ssn_requirement) is the branch's eitc, so reforms of the federal credit, take-up, filing, investment income, marital rules and section 911 carry through. The state child counts are the branch's eitc_child_count.

Sol's r4 finding 1 (Maine's filing condition). In r4 the flag reached every Maine return, and the childless pro forma sets voluntary filing, so an ITIN filer with no federal return got Maine's credit. Sol's household: 2025, single, 20, $5,000 of wages, an ITIN, taking up the EITC, with neither voluntary nor credit-driven filing. r4 paid a $382.50 basis and $191.25 from Maine; subsection 7 gives $0, as this PR now does. With the filing condition in the flag, a Maine return without a federal return (not required to file, with both filing inputs false) gets exactly main's treatment on every path (YAML):

  • the same filer who would file to claim a refundable credit gets $191.25 (a nonfiler to tax_unit_is_filer; see the methodology choice above), so does one filing voluntarily, and one required to file ($17,000 of wages) gets $80.465;
  • a citizen parent aged 20 with no federal return doesn't count a child with an ITIN, so Maine's childless 18-24 pro forma pays $191.25, as on main; filing, the parent counts the child and gets $425.

Maryland's waiver has no filing condition, so a Maryland ITIN filer with no federal return gets the childless credit ($649 at $10,000 of wages), like the SSN twin.

The return as filed. The branch takes each tax unit's AGI and each person's labor-supply and capital-gains responses (NEUTRALIZED_BEHAVIORAL_RESPONSE_VARIABLES) from the parent as inputs, as the state worksheets take them from the federal return (see Law). So the changed credit can't move them, through the itemization election (in 2020 and 2021 the charitable deduction for non-itemizers sits above the line) or through a response measured on the branch's own marginal rates.

  • Sol's r3 finding 1. Before the flag, the branch relaxed the predicate the recovery rebate credits also read. Sol's household: a 2020 Maryland ITIN parent filing as head of household, with an SSN child aged 3, $100 of wages, $119,900 of taxable pension, $18,850 of mortgage interest and $300 of donations, under the individual EITC with a $119,900 AGI limit. In the branch the parent got rebates of $1,340 and $840 and stopped itemizing, for a basis of $34 ($17 from Maryland). The return the parent files itemizes, with AGI of $120,000, so the credit is $0. Now it is (YAML).
  • METHODOLOGY_CHOICE: AGI as filed. With $18,750 of mortgage interest, the return as filed still itemizes (AGI $120,000, $0). A parent who could claim the EITC would take the standard deduction instead: AGI $119,700, a $34 basis. This PR follows the return as filed (YAML).
  • Behavioral responses. Sol's r2 showed that when the branch recomputed responses, the result depended on which variable the simulation calculated first. Under the Working Parents Tax Relief Act with labor-supply elasticities, a 2025 Maryland ITIN parent with an SSN child and $5,000 of wages got a basis of $3,853.50 when the simulation calculated federal eitc first and $2,824.53 when it calculated the state basis first. The fresh reference on the parent's post-response earnings gives $3,853.50, as both orders now do. Sol's r3 accepted holding actual earnings fixed as a methodology choice.

The childless pro formas (federal_eitc_without_age_minimum, me_pro_forma_childless_eitc) evaluate the final federal eitc (pro_forma_federal_eitc). They do so in a per-state, per-period branch (md_pro_forma_eitc, me_pro_forma_eitc) of the tax units federal_eitc_tax_unit returns, with:

  • eitc_eligible set to the pro forma's own conditions, evaluated in those tax units: the investment income limit, the filer's and spouse's identification and the section 911 bar, plus the federal maximum age for Maryland (unless a qualifying child counts) and no dependent filer for Maine;
  • takes_up_eitc and would_file_taxes_voluntarily true, and no separate-filer rule, since the pro formas apply none of the three on main;
  • the AGI and responses of the return as filed.

On main they rebuild the credit from eitc_phased_in, eitc_maximum and eitc_reduction, so a reform of the final formula misses them (Sol's r2, and r3 finding 2). Take the individual EITC with a $10,000 AGI limit, or the End Child Poverty Act, which neutralizes eitc. Under either, a 2025 childless filer with $10,000 of wages gets $649 from Maryland at age 35 and $324.50 from Maine at age 20, with an ITIN or an SSN. Here both get $0, so this PR also changes those two reforms' results for SSN filers. Under current law the two computations agree: the MD and ME YAML suites pass unchanged.

Other SSN rules. The waivers relax 32(m) only, so other SSN rules stay in force, and they can reach a household's taxes through AGI. Then the SSN twin, whose taxes those rules also change, is not the right comparison:

  • In Sol's r3 household the twin gets both rebates, takes the standard deduction and gets $34.
  • In Sol's r2 example, the reconciliation bill's SSN requirement for education credits keeps a 2020 Maryland ITIN parent itemizing, and the SSN twin does not. The parent has $30,000 of wages, $3,000 of interest, $4,000 of tuition, $19,300 of mortgage interest, $300 of donations and an SSN child aged 17. The parent's 32(m)-free credit, $1,399.53, matches the fresh reference. The twin's federal credit is $1,447.47.

The definition the tests check the branch against is a fresh simulation with the flag and the AGI as filed set by input.

Three mechanisms make the branches reliable:

  • Invalidation. policyengine-core (≥ 3.33.0; the lock pins 3.33.2) drops a branch's derived values when an input set on the branch replaces the value they came from. That holds even when the parent had already calculated eitc before the branch existed.
  • Inputs on every call. Each call sets every input the branch takes from the parent; setting the value the branch already holds drops nothing.
  • Per period. get_branch_for_period creates each branch again for each period, from the parent as it stands then. A branch kept across periods answers a later period from its copy of the inputs, which misses an input set after the copy. Sol's r4 case: a Maryland ITIN parent with an SSN child and $5,000 of wages in 2020 and 2025, whose 2025 wages become $10,000 after the simulation calculates the 2020 credit. The per-period branch gives a 2025 basis of $3,400 ($1,530 from Maryland), as a simulation of 2025 alone does; a shared branch gives $1,700, though it takes the $10,000 AGI as filed. test_a_later_period_reads_its_own_inputs checks it, so r4's branch-not-per-period mutant was not equivalent. Within one period the parent itself doesn't recompute after a set_input, and the branch agrees with it.

Sol's r1 review found the earlier design (recompute the credit from baseline parameters, then max_ with eitc) wrong under structural reforms. This design replaces it.

Under some reforms a second qualifying child lowers the federal credit: the streamlined EITC at $30,000 of wages, and the Working Parents Tax Relief Act at $5,000 when the second child is older. A Maryland filer with an SSN child and an ITIN child then gets a basis of the two-child amount ($2,594.51 under the streamlined EITC in 2025), not the larger one-child federal credit ($2,932.33). That is what the otherwise identical SSN family gets federally in PE-US. Maryland's "allowable ... or that would have been allowable but for § 32(m)" could be read to let the filer take the larger, but only under such a reform. Maine's subsection 7 leaves no choice. Current law gives no such case.

Changes

  • Federal EITC variables:

    • New: eitc_ssn_limitation_waived and eitc_identification_accepted.
  • State waiver flags: new md_eitc_ssn_limitation_waived, me_eitc_ssn_limitation_waived and state_eitc_ssn_limitation_waived (see Design).

    • eitc_child_count, filer_meets_eitc_identification_requirements and the Working Parents Tax Relief Act's eitc_young_child_count read eitc_identification_accepted.
  • Helpers (policyengine_us/tools/state_eitc_helpers.py): federal_eitc_tax_unit, keep_return_as_filed and pro_forma_federal_eitc.

  • Maryland:

    • New: md_eitc_child_count and md_federal_eitc_without_ssn_requirement.
    • Routing (md_qualifies_for_unmarried_childless_eitc and both married-or-has-child paths) uses the Maryland child count, so a child with an ITIN makes the filer a filer with a qualifying child.
    • federal_eitc_without_age_minimum evaluates the final eitc (see Design).
    • md_local_eitc uses the 32(m)-free credit.
  • Maine:

    • New: me_eitc_child_count and me_federal_eitc_without_ssn_requirement.
    • me_eitc uses both new variables.
    • me_pro_forma_childless_eitc evaluates the final eitc, and the 18-24 cohort test uses the Maine child count.
  • Parameters: gov.states.{md,me}.tax.income.credits.eitc.itin_eligible, with MD from 2020 and ME from 2021.

  • Makefile: a Rest Python group, state-eitc-itin, for the two Python test files (see Test cost).

  • Source conflict: a source_conflicts/candidates.yaml entry, us-me:eitc-itin-qualifying-children (state: ruled, follows: statute). Both sources reach only a filer who files a federal return, and the entry says so. The MRS 2024 worksheet changes the federal identification answer only for "you (or your spouse, if married)", but subsection 7 names 32(c)(3)(D), so a child with an ITIN counts. Maryland's booklet is silent on children, not contrary (Instruction 5 accepts "a valid SSN or ITIN" for any dependent), so Maryland has no conflict to register.

    This PR follows the order the guard enforces. test_source_conflicts.py fails a marker whose entry is missing from the pinned rulespec-us copy and accepts a candidate, so:

    1. This PR records the candidate and adds no marker.
    2. The US + core hub adds the rulespec-us entry, with this PR under proposed, in its register batch A. The hub has queued that PR (hub-register-batch-a) to open after the host reservation ends; this line gets its link then. The entry cites 5219-S(7) from the corpus and the worksheet's Step 1, question 2 sentence from the capture already on main (source_conflicts/sources/us-me/eitc-worksheet-2024.txt), so this PR adds no capture.
    3. After this PR merges, the entry's implementation and its YAML pin move to the squash commit.
    4. Once that is on rulespec-us main, a follow-up PE-US PR adds the marker at me_eitc_child_count.py, refreshes the pin and deletes the candidate.

    CONTRIBUTING (Source conflicts) lists the entry, marker and pin as three things one PR does, but its own rules spread them over this order: step 1 pins only commits on main and lists an open PR under proposed until it merges, step 3 refreshes the pinned copy only once the entry is on rulespec-us main, and the guard fails a marker whose entry the pinned copy lacks. So this PR does what an open PR can. The hub has queued a docs-only PR that rewords CONTRIBUTING to describe this order (queued with the hub; this line gets its link when it opens); this PR doesn't depend on it, leaves CONTRIBUTING unchanged and adds no pin for unmerged code.

Example

2025, wages of $10,000, a citizen parent whose only child has an ITIN. The federal EITC is $649, the childless amount.

State This PR Main
Maryland $1,530 (45% x $3,400) $649
Maine $850 (25% x $3,400) $324.50

An ITIN parent with an ITIN child gets $0 on main in both states and the same amounts here; in Maine that takes the default filing inputs, under which the parent would file to claim a credit (see the methodology choice in Design).

Invariants

Each holds for every household, year and reform the tests generate. Households file to claim a credit (the default inputs), file voluntarily and not for a credit, or file only if required to (would_file_taxes_voluntarily and would_file_if_eligible_for_refundable_credit); "files" below means required to file or filing by those inputs. Every household runs beside a twin in which each ITIN or non-work SSN becomes a valid SSN. It also runs beside two references, each a fresh simulation of the households alone, with each household's AGI as calculated (the return as filed) and eitc_ssn_limitation_waived set where its state's waiver applies to it: Maryland from 2020, Maine from 2021 for a household that files.
0. Reference. In every year, the 32(m)-free credit and the state child count equal the reference's eitc and eitc_child_count. This is the waivers' definition, Maine's filing condition included, and a differential check of the waived branch.

  1. Twin. Where the waiver applies, an ITIN or non-work-SSN household gets exactly what its twin gets, on every MD and ME credit variable (seven); in Maryland that includes households that don't file. The grids check it; their households have only wages, no behavioral response and nothing another SSN rule reaches. The labor-supply, education-credit and recovery rebate credit cases have twins that differ (see Design).
  2. Before the waiver starts, the final credit never exceeds the twin's, for households that take up the EITC and file. This relies on invariant 6's property of current law, so the tests check it without reforms. A Maine household that doesn't file is left out: a citizen parent aged 20 whose child has an ITIN falls in Maine's childless pro forma, which applies no filing condition, and gets $191.25 where the SSN twin's with-child credit follows the federal one's and is $0.
  3. Section 32(c)(1)(C): a section 911 claimant gets zero on every MD and ME variable, whatever anyone's identification.
  4. No TIN: a filer or spouse with no TIN gets zero on every MD and ME variable.
  5. Child counts: each state's child count equals a direct count of children with an accepted TIN (any TIN where the waiver applies to the household), and is never below eitc_child_count.
  6. The federal credit: the 32(m)-free credit equals eitc when everyone holds a valid SSN, and where the waiver doesn't apply to the household: a differential check of the branch against the federal variables. Under current law it is never below eitc, since an added qualifying child never lowers the federal credit. Some reforms break that property (see Design), so the tests check this half without reforms.
  7. Bounds: each credit is zero outside its state and never negative.
  8. Periods: one simulation that calculates 2019, 2025 and then 2020 matches a separate simulation for each year, and a 2025 input set after the simulation calculates the 2020 credit reaches the 2025 credit.
  9. The parent is left alone.
    • Every grid and property run (the tests' calculate) reads meets_eitc_identification_requirements before anything else and again after the state credits, and finds it unchanged.
    • The federal-first runs (the year grids and reform grids) also read eitc and eitc_child_count before the state credits and find them unchanged after.
    • Under current law a filer or spouse without a valid SSN gets no federal EITC.
    • The waived branch, and the itemization branches it creates, give a 2020 ITIN parent no recovery rebate credits, as the parent's own simulation does.
  10. Order. The labor-supply regression runs the same households in both orders and gets the same results, equal to the reference on post-response earnings. It runs once with the filing requirement by formula and once by input, as False, the value the formula gives these households. By formula, Maine's waiver reads that requirement under the responses, so both orders calculate the responses before the waived branch exists, and the branch inherits them (core's get_branch starts from the parent's cached values). By input, the state-first order calculates nothing before the branch exists, so the orders agree only if keep_return_as_filed copies the responses (Sol's r6 and r7 notes). The 2025 grid runs the state credits first and the year grids the federal first, so they check each order's invariants, not that the orders agree.
  11. Pro formas. federal_eitc_without_age_minimum, and me_pro_forma_childless_eitc within Maine's cohort (me_childless_eitc_age_eligible; zero outside it), equal the federal eitc of the second reference, under the same reform. That reference sets eitc_eligible from each household's description: identification (Maine's waiver needing a federal return), the section 911 bar and, for Maryland, the federal maximum age unless a child with an accepted TIN counts. Take-up and voluntary filing are true.

Tests

  • YAML:
    • md_eitc_itin.yaml (22 cases) and me_eitc_itin.yaml (26 cases), each with three SSN twins of its ITIN cases. They cover:
      • mixed-status families and children with no TIN;
      • non-work SSNs;
      • the 2019/2020 (MD) and 2020/2021 (ME) boundaries;
      • joint returns with an ITIN spouse;
      • section 911 claims;
      • take-up;
      • the local credit;
      • a capital-gains response over and under the investment income limit, and a self-employment response (Sol's r6 note: no case had one);
      • filers who file no federal return: Sol's r4 household and its filing, voluntary-filing, required-to-file and SSN counterparts in Maine, with tax_unit_is_filer pinned for the credit-propensity and voluntary filers (Sol's r5 findings 1 and 2), a childless ITIN filer aged 30 and twin (the Axiom parity case ME-9), a citizen parent with an ITIN child in Maine, and the Maryland nonfiler and twin.
    • me_pro_forma_childless_eitc.yaml (2 new cases): investment income over the $11,950 limit ($0) and under it ($237.43), the gate Sol's r4 found no case for.
    • federal_eitc_without_age_minimum.yaml (2 new cases): the same two households in Maryland, aged 21 ($0; $237.43, and Maryland's non-refundable credit takes all of it). The mutation run found no Maryland case for the gate.
    • tests/policy/reform/state_eitc_itin_reforms.yaml (6 cases): Sol's r1 counterexamples under the streamlined EITC and the individual EITC's AGI limit, for both states, and the streamlined case in Design where a second child lowers the credit.
    • state_eitc_itin_pro_forma_reforms.yaml (4 cases): ITIN and SSN childless filers (Maryland, 35; Maine, 20) get $0 under the $10,000 individual-EITC limit and under the End Child Poverty Act.
    • state_eitc_itin_return_as_filed.yaml (3 cases): Sol's r3 recovery rebate credit household, its SSN twin, and the as-filed AGI case.
    • Unit fixtures that fed eitc_child_count or eitc to the MD routing and local-credit variables now feed the variables those formulas read.
  • Python:
    • test_state_eitc_itin.py checks invariants 0-11 on a 2,400-household grid (a fifth of them households that don't file, and a fifth that file voluntarily, not for a credit, and don't take up the EITC) for 2019, 2020, 2021 and 2025. It also checks a 192-household grid under each of six structural EITC reforms:

      • streamlined;
      • individual, with a $10,000 AGI limit (inside the childless credit's range);
      • halved joint phase-out;
      • Working Parents Tax Relief Act;
      • Family Security Act 2.0;
      • End Child Poverty Act.

      Each reform test also asserts that the reform changes some state credit, and the 2025 grid asserts that it reaches the households Maine's filing condition separates. Five regressions run separately: both calculation orders under labor-supply responses; both pro formas in one simulation, in both orders, where a Maryland ITIN filer aged 65 and a claimable Maine ITIN filer aged 20 get no credit, as each does alone, though the two pro formas' branches give them different federal credits; the education-credit household where twin and reference part, the recovery rebate credits in the waived branch, and Sol's r4 period case.

    • test_state_eitc_itin_property.py (Hypothesis) samples households (ages 18-80; filing for a credit, voluntarily or not at all), years and a reform (or none).

Test cost. Measured locally with /usr/bin/time -l on macOS, Python 3.14, 4 numeric threads, on a shared host. Each figure is one process, including setup. Linux CI figures will come from the first CI run.

File CI group Before (ea2e81f002) After
test_state_eitc_itin.py Rest Python state-eitc-itin (new) 65.5 s, 2.55 GB 385.3 s, 9.22 GB
test_state_eitc_itin_property.py Rest Python state-eitc-itin (new) 49.6 s, 2.20 GB 253.7 s, 4.81 GB
state_eitc_itin_reforms.yaml (new) test-yaml-reform, one process per file none 98.9 s, 6.14 GB
state_eitc_itin_pro_forma_reforms.yaml (new) test-yaml-reform none 98.1 s, 6.13 GB
state_eitc_itin_return_as_filed.yaml (new) test-yaml-reform none 65.1 s, 4.01 GB
  • Rest Python state-eitc-itin. The files simulate under eight reforms: the six EITC reforms, labor-supply responses and the education-credit SSN rule. An earlier per-test measurement of test_state_eitc_itin.py put 6.2 GiB resident by its last test, with the labor-supply test adding 1.6 GiB to the peak; at 09acdc59ef the whole module peaks at 9.22 GB in one process. In the remaining group that heap would stack on the other files' (main's latest release run, 40753949728: remaining 18:04 wall, 8.02 GB). So the Makefile gives these files their own group, as it does for other modules that retain reformed systems, and remaining skips them. The planner may still split a group, so the files need not share a process. code_health/test_rest_python_groups.py passes. The baseline arrays the reform cases compare against come from one module fixture, and the property test samples a reform half the time.
  • test-yaml-reform. Each reformed case builds its own system. In one file, the 13 cases peaked at 10.6 GB, so they sit in three files, each near the ~5.5 GB the Makefile records for winship.yaml.

Mutation checks

Each mutant changes one piece of the PR's code, and a test that fails kills it. The run took the 46 mutants below one at a time (2026-10-29, 10:02-16:02Z), one test process at a time: the YAML files, then, if every case passed, test_state_eitc_itin.py, then the Hypothesis file. It copied the worktree's tests when each mutant started, and the tests changed during the run, so the third column names the tests each mutant met. The model code changed only in a comment and a documentation string (11:51Z).

# Mutant Tests it met (mut5) Result First test that fails
0 No change (control) 09acdc59ef all pass –
1 Identification test ignores the waiver (valid SSN only) 09acdc59ef killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin (+3)
2 Identification test accepts any TIN without the waiver flag 09acdc59ef killed YAML: Streamlined EITC, Maryland, a second child with an ITIN lowers the basis as it lowers the SSN twin's federal credit
3 Waived branch sets the flag for every tax unit 09acdc59ef killed Python grid (test_state_eitc_itin.py)
4 Combined flag reads Maryland's waiver only 09acdc59ef killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin
5 Combined flag reads Maine's waiver only 09acdc59ef killed YAML: Streamlined EITC, Maryland, citizen parent with an ITIN child, matches the SSN twin (+2)
6 Maine's waiver drops its filing condition 09acdc59ef killed YAML: Childless ITIN filer aged 20 who files no federal return gets no Maine EITC (+2)
7 Maine's filing condition is voluntary filing only 09acdc59ef killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin
8 Maine's filing condition drops the filing requirement 09acdc59ef killed YAML: Childless ITIN filer aged 20 required to file gets the pro forma credit
9 Maryland's waiver gains a filing condition 09acdc59ef killed YAML: Childless ITIN filer who files no federal return gets the childless credit, like the SSN twin
10 Early return ignores the waiver mask 09acdc59ef survived equivalent: the early return only skips less often
11 No early return 09acdc59ef survived equivalent: the early return skips a branch that changes no one
12 Helper returns the parent's tax units, not the branch's 09acdc59ef killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin (+3)
13 Flag set on the parent simulation, not the branch 09acdc59ef killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin (+3)
14 r3's design: relax the shared valid-SSN predicate 09acdc59ef killed Python grid (test_state_eitc_itin.py)
15 One waived branch for every period 09acdc59ef killed Python grid (test_state_eitc_itin.py)
16 Waived branch doesn't copy the behavioral responses 2657cfa184 survived see below
17 Waived branch zeroes the capital-gains response 2657cfa184 killed YAML: A capital-gains response over the investment income limit bars an ITIN parent's credit
18 Waived branch recalculates AGI 2657cfa184 killed YAML: Individual EITC with a $119,900 AGI limit, Maryland 2020, the waived credit takes the AGI of the return as filed
19 Pro forma keeps the federal eitc_eligible 2657cfa184 killed YAML: Childless ITIN filer aged 22 takes both the age and the SSN waivers of 10-704(c)(3)(i)
20 Pro forma applies take-up 2657cfa184 killed YAML: Childless ITIN filer aged 20 who does not take up the EITC keeps the pro forma credit, like an SSN filer
21 Pro forma applies the filing condition 2657cfa184 killed YAML: Childless ITIN filer who files no federal return gets the childless credit, like the SSN twin (+1)
22 Pro forma branches from the parent, not the waived branch 2657cfa184 killed Python grid (test_state_eitc_itin.py)
23 Both pro formas share one branch 2657cfa184 survived equivalent at core 3.33.2: set_input on a branch drops every value the branch calculated from the input it replaces, so the second pro forma recalculates eitc (5a92f6cc0c's two-state test passes it, though the two branches' eitc differ there)
24 md_eitc_child_count without the waiver 2657cfa184 killed YAML: Streamlined EITC, Maryland, citizen parent with an ITIN child, matches the SSN twin (+2)
25 md_federal_eitc_without_ssn_requirement without the waiver 2657cfa184 killed YAML: Streamlined EITC, Maryland, citizen parent with an ITIN child, matches the SSN twin (+1)
26 MD childless pro forma without the waiver 2657cfa184 killed YAML: Childless ITIN filer aged 30 gets 100% of the childless federal amount (+5)
27 MD pro forma drops the filer identification test 2657cfa184 killed YAML: Childless filer with no taxpayer identification number gets no Maryland EITC (+1)
28 MD pro forma drops the section 911 bar 2819d69563 YAML, 2657cfa184 Python killed YAML: A childless ITIN filer who claims section 911 benefits gets no Maryland EITC
29 MD pro forma drops the federal maximum age 2819d69563 killed YAML: Childless filer aged 65 fails the federal maximum age, which Maryland keeps (taxsim 1260) (+1)
30 MD pro forma drops the investment income test 2819d69563 survived see below
31 MD unmarried childless routing uses eitc_child_count 2819d69563 killed YAML: Streamlined EITC, Maryland, citizen parent with an ITIN child, matches the SSN twin
32 MD married-or-with-child routing uses eitc_child_count 2819d69563 killed YAML: ITIN family that does not take up the EITC is treated like its SSN twin
33 MD married-or-with-child credits use eitc 2819d69563 killed YAML: Streamlined EITC, Maryland, citizen parent with an ITIN child, matches the SSN twin (+1)
34 md_local_eitc uses eitc 2819d69563 killed YAML: Local EITC for a childless ITIN filer in Baltimore City (+1)
35 MD waiver starts in 2021, not 2020 2819d69563 killed YAML: In 2020, the first year of Chapter 40, a childless ITIN filer gets the Maryland EITC
36 me_eitc_child_count without the waiver 2819d69563 killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin
37 me_federal_eitc_without_ssn_requirement without the waiver 2819d69563 killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin
38 ME 18-24 pro forma without the waiver 2819d69563 killed YAML: Childless ITIN filer aged 20 takes the age expansion and the ITIN rule together (+4)
39 ME pro forma drops the filer identification test 2819d69563 killed YAML: Childless filer aged 20 with no taxpayer identification number gets no pro forma credit (+1)
40 ME pro forma drops the section 911 bar 2819d69563 killed YAML: A childless ITIN filer aged 20 who claims section 911 benefits gets no Maine EITC
41 ME pro forma drops the dependent-filer exclusion 2819d69563 killed YAML: 2025 single filer who can be claimed as a dependent has no pro forma childless credit (+2)
42 me_eitc uses eitc 2819d69563 killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin
43 me_eitc rate uses eitc_child_count 2819d69563 killed YAML: Streamlined EITC, Maine, citizen parent with an ITIN child, matches the SSN twin
44 ME 18-24 cohort test uses eitc_child_count 2819d69563 killed YAML: Parent aged 20 whose only child has an ITIN is a filer with a qualifying child, not in the age cohort (+1)
45 ME waiver starts in 2022, not 2021 2819d69563 + 5a92f6cc0c labor test killed YAML: In 2021, the first year of subsection 7, an ITIN family gets 20% of the one-child amount
46 ME pro forma drops the investment income test 5a92f6cc0c killed YAML: Investment income above the federal limit bars the pro forma childless credit

Of 46: 41 killed, 3 equivalent and 2 survived. Later runs, each against the tests named:

  • The two survivors. Mutant 16 fails the labor-supply test with the filing requirement by input: the two orders give a Maryland basis of $3,853.50 and $2,824.53. By formula it passes, since the waived branch inherits the responses the parent calculated first. Mutant 30 fails the new Maryland case with $12,000 of interest.
  • Maine's filing condition. Dropping voluntary filing fails the voluntary-filer case and the 2025 grid (64 of 800 Maine child counts); tax_unit_is_filer in its place fails nine YAML cases and the grid (91 of 800).
  • The self-employment response. Zeroing it alone in the waived branch fails the new case in both states.
  • Controls. The unmutated code passes every run.

Limitations

  • Unknown TIN status. has_tin defaults to true, and the default dataset carries neither has_tin nor its legacy has_itin. So every ssn_card_type: NONE person counts as an ITIN holder. In 2025, a childless Maine filer aged 35 with $10,000 of wages gets $324.50 with has_tin omitted and $0 with has_tin: false. This follows the CO, IL, DC and CalEITC convention. For the same reason, the microsim below treats every NONE person in the data as an ITIN holder.
  • Maryland local credit for childless filers under 25. md_local_eitc does not apply (c)(3)(i)'s minimum-age waiver. This gap predates this PR, which leaves it as it was.
  • Not modeled: part-year residents (10-704(e)) and the optional county refund (10-704(d)(2)(iii)).
  • Reforms of eitc_eligible itself. The pro formas replace eitc_eligible with their own conditions, so a reform of that variable would not reach them. No shipped reform replaces eitc_eligible or the variables it reads.
  • Take-up and filing asymmetry (pre-existing). The childless pro formas apply no take-up or filing condition, while the with-child paths follow the federal credit's. Counting ITIN children narrows the asymmetry by moving those families to the with-child path. Maine's filing condition doesn't change it for SSN filers, who need no waiver.
  • Who files. Maine's condition counts a filer who would file to claim a refundable credit, Maine's own included, as filing a federal return, where tax_unit_is_filer doesn't if the filer has no federal credit (the METHODOLOGY_CHOICE in Design). With both filing inputs at their defaults, every Maine ITIN filer counts as filing.

Interactions

Impact

Pending: the microsim runs once #10525 merges and this branch rebases onto main.

Axiom parity

axiom: us-md/statute/gtg/10-704 rulespec-us#1422 queued
axiom: us-me/statute/36/5219-S rulespec-us#1651 queued

The parity comments on both issues give the encoding briefs and companion cases.

🤖 Generated with Claude Code

Md. Code Tax-Gen. 10-704(c)(1)(i), (c)(2)(iii), (c)(3)(i)2 and (d) compute the
state and county credits without the 26 U.S.C. 32(m) limitation from 2020
(Chapter 40 of 2021, made permanent by Chapters 3 and 4 of 2023). 36 M.R.S.
5219-S(7) accepts an ITIN or any Social Security number from 2021. Both reach
the filer, spouse and qualifying children (32(c)(1)(E) and (c)(3)(D)) and keep
the section 911 bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 11 commits October 29, 2026 01:42
Sol's r1 review found that the recomputed credit used baseline parameters
whenever the waiver changed the child count, and that max_ with eitc undid
reforms to the final credit (the individual EITC's AGI limit). Replace the
recomputation with a policyengine-core branch whose
meets_eitc_identification_requirements also accepts has_tin. Every federal
EITC variable the Maryland and Maine formulas read now comes from that
branch: eitc, eitc_child_count, eitc_phased_in, eitc_maximum,
eitc_reduction and filer_meets_eitc_identification_requirements. Each is
the federal formula's own result, reforms, take-up and section 911
included. Core 3.33's branch set_input drops the values calculated from
the replaced input, and get_branch_for_period rebuilds the branch for each
period.

Tests:
- state_eitc_itin_reforms.yaml: the r1 counterexamples for both states,
  and a streamlined case where a second child lowers the credit.
- test_state_eitc_itin.py: the twin invariants under five structural
  reforms, and one simulation across 2019, 2025 and 2020 matching
  separate simulations. The never-below-eitc bounds hold under current
  law only, so they are checked without reforms.
- test_state_eitc_itin_property.py samples a reform.

Register the Maine worksheet-versus-statute reading of ITIN children as a
source-conflict candidate.

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

Global ids are lowercase (test_candidates_have_unique_well_formed_ids).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ainst a fresh reference

Sol's r2 review found that under labor-supply responses the 32(m)-free
credit depended on calculation order: the branch recomputed responses
through measurement branches that lose its identification input. The
branch now takes each person's behavioral responses from the parent as
inputs, so it computes the credit on actual earnings, and the helper
returns the parent's tax units when the waiver changes no one's
identification.

Tests:
- both calculation orders under the Working Parents Tax Relief Act with
  labor-supply elasticities, against a fresh simulation on the
  post-response earnings with identification relaxed by input (fails on
  the previous helper: $3,853.50 vs $2,824.53);
- every grid check now compares the 32(m)-free credit, the state child
  count and the childless pro forma with that fresh reference, re-reads
  the parent's identification and federal credit after the state credits,
  and runs the 2025 grid state-first;
- Sol's education-credit household, where another SSN rule separates the
  twin but not the reference;
- the individual EITC's AGI limit moves to $10,000, inside the childless
  credit's range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two files simulate under seven reforms and keep 4.8 GiB resident
after the first one; both in one process peak at 6.97 GiB locally.
Their own group releases that heap before the remaining group runs,
the convention for modules that retain reformed systems.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e pro formas' final eitc

Sol r3, finding 1: the waived branch relaxed meets_eitc_identification_requirements, which the 2020-2021 recovery rebate credits also read, so in the branch and its itemization branches an ITIN parent got rebates that 6428(g) and 6428A(g) deny, which could change the itemization choice and the AGI. Now:
- eitc_ssn_limitation_waived (TaxUnit input, false) and eitc_identification_accepted (Person) carry the waiver. eitc_child_count, filer_meets_eitc_identification_requirements and the Working Parents Tax Relief Act's young-child count read the latter; the recovery rebate credits keep the valid-SSN predicate.
- The branch sets the flag and takes the AGI and behavioral responses of the return as filed (keep_return_as_filed), as the federal EIC worksheet the states point to reads AGI from Form 1040 line 11.

Finding 2: the Maryland and Maine childless pro formas rebuilt the credit from its components, so a reform of the final eitc formula (the individual EITC's AGI limit, the End Child Poverty Act's neutralized eitc) did not reach them. pro_forma_federal_eitc now evaluates the final eitc in a per-period branch with eitc_eligible set to each pro forma's own conditions, take-up and voluntary filing true, and the return's AGI and responses. Current-law values are unchanged.

Tests:
- YAML: expected-zero cases for the $10,000 individual-EITC limit and the End Child Poverty Act (ITIN and SSN filers, MD 35 and ME 20), Sol's recovery rebate credit household and its SSN twin, an as-filed AGI case, and two capital-gains-response cases.
- Python: the references take the flag and the AGI as filed by input; an independent pro forma reference sets eitc_eligible from each household's description; the End Child Poverty Act joins the reform grid; a white-box test checks that the waived branch and its itemization branches give the ITIN parent no recovery rebate credits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test-yaml-reform runs one process per file, and each reformed case builds its own system: the 13 cases in one file peaked at 10.6 GB locally. Split, the original six cases peak at 6.1 GB, the four pro forma cases at 6.1 GB and the three return-as-filed cases at 4.0 GB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 M.R.S. 5219-S(7) applies "for an individual who files a federal
income tax return". The waiver flag reached every Maine return, and the
childless pro forma sets voluntary filing, so an ITIN filer with no
federal return got Maine's credit (Sol r4 finding 1: $191.25 where the
statute gives $0).

- md_eitc_ssn_limitation_waived, me_eitc_ssn_limitation_waived and
  state_eitc_ssn_limitation_waived say whom each state's waiver reaches.
  Maine's reads the federal EITC's filing condition on the parent,
  before any pro forma sets filing. federal_eitc_tax_unit sets the
  branch's flag to the combined variable, so every state credit gives
  the branch the same inputs.
- The tests' references follow the filing condition; the grid adds a
  row of households that don't file, and Hypothesis samples it.
- The pro forma reference applies Maryland's federal maximum age (Sol
  r4 finding 2) and reads Maine's cohort from
  me_childless_eitc_age_eligible.
- test_a_later_period_reads_its_own_inputs: Sol's r4 case for the
  per-period branch ($3,400, not a shared branch's $1,700).
- YAML: Maine nonfilers and their filing, required-to-file and SSN
  counterparts; a Maryland nonfiler and twin; the Maine pro forma's
  investment-income gate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 M.R.S. 5219-S(7) applies "for an individual who files a federal
income tax return", and the MRS worksheet asks whether the filer filed
one. The candidate us-me:eitc-itin-qualifying-children stated the
statute's reading and its example without that condition; the register
entry copies this text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol r5 finding 1: Maine's waiver counts a tax unit that would file to
claim a refundable credit as filing a federal return, as the federal
eitc formula's filer test does. tax_unit_is_filer counts that
propensity only with a federal credit, which 32(m) denies an ITIN filer,
so it calls such a filer a nonfiler. The comment and documentation now
state the choice and its reasons (Maine's EITC is refundable; the SSN
twin with a federal credit files), and the YAML pins
tax_unit_is_filer: false for the credit-propensity filers.

Sol r5 finding 2: no test set voluntary filing on a household. A YAML
case now has an ITIN filer who files voluntarily and not for a credit
(tax_unit_is_filer: true, $191.25). The tests' "files" takes a third
value, "voluntarily"; the grid's take-up row uses it and asserts that it
reaches a Maine ITIN filer, and Hypothesis samples it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol r6 (APPROVE) found two non-equivalent mutants the tests missed:

- responses-not-kept (drop keep_return_as_filed's response loop) passed
  the labor-supply regression. With a Maine household present, the
  waiver flag reads the filing requirement on the parent, which
  calculates the responses before the branch exists, and the branch
  inherits them from the parent's cache. The regression now sets the
  filing requirement by input (false, as it is at $5,000), so the
  branch needs the copy.
- Zeroing only the self-employment response in the branch passed every
  case: none had one. md_eitc_itin.yaml and me_eitc_itin.yaml gain an
  ITIN parent with $5,000 of self-employment income and a $1,000
  response: $5,576.11 of earned income, a $1,895.88 basis, $853.15 from
  Maryland and $473.97 from Maine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol r7 finding 1: the labor test's comment said nothing is cached when
the waived branch is created, which holds only when the state variables
come first. The eitc-first order calculates the responses before the
branch exists and inherits them. The comment now says so: by input, the
two orders agree only if keep_return_as_filed copies the responses.

Sol r7 note 4: with the filing requirement by input, the test no longer
ran Maine's filing formula under labor-supply responses. The test now
runs with the requirement by formula, as at r6, and by input, as False,
the value the formula gives these households.

Of the 46 mutants in the mutation run, five survived: two equivalent,
responses-not-kept (2819d69's labor test kills it), and two more.

- md-pro-forma-investment: no Maryland case had investment income. The
  Maryland pro forma's YAML gains Maine's two cases: $12,000 of interest
  bars the credit; $11,000 leaves $237.43, all of it Maryland's
  non-refundable credit.
- pro-forma-branch-shared-name (one branch for both pro formas) is
  equivalent at core 3.33.2: set_input on a branch drops what was
  calculated from the input it replaces, so the second pro forma
  recalculates eitc. A new test runs both pro formas in one simulation,
  in both orders, with a Maryland ITIN filer aged 65 and a claimable
  Maine ITIN filer aged 20, whom the two branches give different federal
  credits ($0 and $76.50 in Maryland's, $649 and $0 in Maine's); each
  gets no pro forma credit, as each does alone.

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

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.

1 participant