Repository navigation
Set the DC EITC with-children match to 85% for 2026-2028 - #10638
Conversation
…pired D.C. Law 26-89 set the with-children match in 47-1806.04(f)(1)(B-2) to 100% from TY2025 and repealed (B-3); it expired on September 25, 2026. The permanent text gives 85% for taxable years after 2024 and 100% from 2029 under (B-3). The parameter held 100% for every year from 2025. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6JoAx1PqHmDjxg51eh
|
Ready for hub review Head: Item: DC EITC with-children match from 2025
Tests (one file per process)
Hand computationsHoH filer, $10,000 wages, one child. Federal EITC = 34% x 10,000 = 3,400.
Mutants (each in its own process, file restored after)
CINot run: the PR is a draft. Judgment calls
Proposed follow-up
Generated by Claude Code |
|
Ready for hub review The head hasn't moved since The law, by tax yearI read every version of D.C. Code § 47-1806.04 in the DC Council's codified-law repository (
So the emergency act (in force Dec. 3, 2025 to Mar. 3, 2026) and then the temporary law (Feb. 12 to Sep. 25, 2026) set 100% for years after 2024. Today's codified text is back to 85% / 100%.
The PR's values ( Disapproval. According to search results, H.J.Res. 142 disapproves the temporary act (D.C. Act 26-217, later D.C. Law 26-89). The Senate passed it on February 12, 2026, and it became P.L. 119-78 on February 18. Search summaries of the DC Attorney General's February 24, 2026 opinion say the Home Rule Act's review window closed on February 11, so the resolution did not stop the act from taking effect on February 12. They say the opinion also holds that, even if it repealed the act, TY2025 liability stands under the emergency act, the presumption against retroactivity, and 1 U.S.C. § 109. The DC Council's own codification kept Law 26-89 in force until its September 25 expiry, which is consistent with that. I could not read the resolution, the public law or the opinion itself. FindingsP2-1. TY2025 at 100% is a reading the hub should rule on and record
The PR keeps 100% for TY2025, as main does. That rests on the expired emergency and temporary acts, while today's codified (B-2) literally says 85% for "a full calendar or fiscal year beginning after December 31, 2024". This PR changes no 2025 output. But it now writes down a reading where the text allows two, so I'd give the hub this row for the register:
I recommend reading A: it matches the law in force and OTR's practice. If the hub registers it, the deciding line needs P3-1. The comment cites only the temporary law. The emergency act governed TY2025 at year end.
The comment says Law 26-89 "took effect on February 12, 2026, for the TY2025 filing season". Act 26-214 set the same 100% from December 3, 2025. Replacement for lines 22-24: # D.C. Act 26-214 § 2(i) (emergency, Dec. 3, 2025 to Mar. 3, 2026) and
# D.C. Law 26-89 § 2(i) (temporary, Feb. 12 to Sep. 25, 2026) set (B-2) to
# 100% for taxable years after 2024 and repealed (B-3).Then add a reference: - title: D.C. Income and Franchise Tax Conformity and Revision Emergency Amendment Act of 2025 (D.C. Act 26-214), § 2(i)
href: https://code.dccouncil.gov/us/dc/council/acts/26-214P3-2. The 2026-2028 rationale may soon point at superseded text
The comment derives 2026-2028 from the "permanent (B-2)" for "years beginning after December 31, 2024". If Thomson Reuters' report is right, the FY2027 Budget Support Act of 2026 enacts 85% for years after 2025 and before 2029, and the codified (B-2) will change wording when it is codified. It is not in the 2026-10-28 codification of § 47-1806.04. The values stay right under either text. Once someone can read the Act, the 2026 line should cite it, and the hub's Verified by runningDefect at main. I copied the PR's test file into an
Hand values. I computed them before reading the code: 34% × $10,000 = $3,400 (phase-in, under the one-child maximum); 0.85 × 3,400 = 2,890. The $510 tax change each year from 2026 to 2028 equals 3,400 − 2,890. Rule in code. Tests. I ran one file per process at head:
Each new case asserts the exact value (margin 0.01), and both boundaries are tested: 2025/2026 by the existing 2025 cases plus the new 2026 case, 2028/2029 by the new cases. Mutants. Each ran in its own process, and I restored the file after each.
Readers. I grepped the
Docs and body.
Scope. Three files changed: the changelog fragment, #10583. Its current body no longer cites 85% for 2025. Its 2025 DC figures use 1.0 (e.g. 1,020 / 2,720), and its DC cases are 2022-2023, which this PR doesn't move. It needs no change. Its review comment asked someone to read (B-2), and this PR answers that. CI at
Still in progress when I posted: Microsimulation and 9 Contrib shards. The earlier run 41544625950 was skipped (draft). Hand-off follow-upsBoth are real defects against the current codification, identical on main, so they're follow-ups, not this PR's defects. Each carries the same caveat: the FY2027 Budget Support Act may have re-enacted them, and I couldn't read it.
What I couldn't check
Generated by Claude Code |
D.C. Act 26-214 set (B-2) to 100% from December 3, 2025, as of January 1, 2025, so it held at the close of 2025. The temporary law carried that through the filing season. Add the act to the references and record the TY2025 question in source_conflicts/candidates.yaml: the Attorney General's opinion, OTR's FAQ and the 2025 D-40 booklet all use 100%. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Hub impact pair, progress The base side of the 2026 pair finished. The head side runs next, on the same household chunks.
Exact weighted sums: {
"dc_eitc": 140731752.08650315,
"household_benefits": 2059793926050.1262,
"household_net_income": 17161428039502.375,
"income_tax": 2595105975379.617,
"state_income_tax": 578044599361.5671
}Generated by Claude Code |
|
Ready for hub review The PR head hasn't moved: it is still Setup
Results, 2026
Change is head minus base before rounding, so it can differ by $1 from the difference of the rounded sums. What moves
Every changed household is in DC ( Runs
The VM has 4 vCPUs and 16 GB of memory. I ran the sides one at a time. Neither came near 14 GB, so I didn't rerun with 16 chunks. With these five outputs, each side ran for about 16 minutes and peaked at 3.64 GiB. The hub had planned for about 70 minutes and 9.75 GiB per side, from a run of nine outputs. Dropped variablesNone. All five variables exist on both sides on the same entity: Commands
curl -sI https://huggingface.co/api/datasets/policyengine/populace-us | head -1 # the proxy's "HTTP/1.1 200 Connection Established"; the download below reached Hugging Face
git clone https://github.com/PolicyEngine/policyengine-us.git pe && cd pe
git fetch origin pull/10638/head:pr-10638 pull/10561/head:pr-10561 # pr-10561 was c545c47877c70b367a6fab2322037e453364997e
HEAD_SHA=$(git rev-parse pr-10638); BASE_SHA=$(git merge-base origin/main $HEAD_SHA); echo $HEAD_SHA $BASE_SHA
git diff --stat $BASE_SHA $HEAD_SHA -- pyproject.toml uv.lock # empty
git diff --stat $BASE_SHA $HEAD_SHA -- policyengine_us/system.py # empty
git worktree add --detach ../head $HEAD_SHA
git worktree add --detach ../base $BASE_SHA
git show pr-10561:policyengine_us/tools/calculate_chunked.py > ../calculate_chunked.py
(cd ../head && uv sync)
PY=$PWD/../head/.venv/bin/python
# Fetch the file once, with the call _resolve_dataset_path makes, so neither side's time includes the download.
( time $PY -I -c 'from huggingface_hub import hf_hub_download; p = hf_hub_download(repo_id="policyengine/populace-us", filename="populace_us_2024.h5", repo_type="dataset", revision="populace-us-2024-spm-20260909"); print("PATH", p)' ) > ../download.log 2>&1
sha256sum "$(readlink -f "$F")"
# preflight.py prints the imported package's directory, DEFAULT_DATASET, DEFAULT_DATASET_SHA256, each variable's entity, and the match for 2025, 2026, 2028 and 2029.
for side in base head; do PYTHONPATH=$PWD/../$side $PY ../preflight.py 2> ../preflight_$side.err; done
apt-get install -y time # the VM had no /usr/bin/time
mkdir -p ../out
H=$PWD/../calculate_chunked.py; PY=$PWD/../head/.venv/bin/python
export OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4
PYTHONPATH=$PWD/../base /usr/bin/time -v $PY ../pair_side.py $H 8 2026 ../out/base > ../out/base.log 2> ../out/base.err
sha256sum "$(readlink -f "$F")"
PYTHONPATH=$PWD/../head /usr/bin/time -v $PY ../pair_side.py $H 8 2026 ../out/head > ../out/head.log 2> ../out/head.err
$PY ../compare.py ../out/base ../out/head ../out/compare.json
readlink -f "$F" > ../out/dataset.path
(cd .. && head/.venv/bin/python -I make_result.py .) # reconciles the rows and writes this commentI launched each side's line detached ( compare.json{
"household_net_income": {
"entity": "household",
"base_sum": 17161428039502.375,
"head_sum": 17161408302101.852,
"change": -19737400.5234375,
"records_changed": 50,
"weighted_changed": 38893.243959940846,
"weighted_up": 0.0,
"weighted_down": 38893.243959940846,
"largest_abs": 1097.3984375,
"rows": [
{
"id": 1133799,
"base": 44171.890625,
"head": 43074.4921875
},
{
"id": 1076749,
"base": 33258.37109375,
"head": 32160.97265625
},
{
"id": 133799,
"base": 44211.734375,
"head": 43114.3359375
},
{
"id": 1020411,
"base": 49659.71484375,
"head": 48562.31640625
},
{
"id": 20411,
"base": 49116.625,
"head": 48019.2265625
}
]
},
"household_benefits": {
"entity": "household",
"base_sum": 2059793926050.1262,
"head_sum": 2059793926050.1262,
"change": 0.0,
"records_changed": 0,
"weighted_changed": 0.0,
"weighted_up": 0.0,
"weighted_down": 0.0,
"largest_abs": 0.0,
"rows": []
},
"dc_eitc": {
"entity": "tax_unit",
"base_sum": 140731752.08650315,
"head_sum": 120994336.10348399,
"change": -19737415.98301916,
"records_changed": 50,
"weighted_changed": 38893.243959940846,
"weighted_up": 0.0,
"weighted_down": 38893.243959940846,
"largest_abs": 1097.39990234375,
"rows": [
{
"id": 1181985,
"base": 7316.0,
"head": 6218.60009765625
},
{
"id": 1103177,
"base": 7316.0,
"head": 6218.60009765625
},
{
"id": 181985,
"base": 7316.0,
"head": 6218.60009765625
},
{
"id": 1026757,
"base": 7316.0,
"head": 6218.60009765625
},
{
"id": 26757,
"base": 7316.0,
"head": 6218.60009765625
}
]
},
"income_tax": {
"entity": "tax_unit",
"base_sum": 2595105975379.617,
"head_sum": 2595105975379.617,
"change": 0.0,
"records_changed": 0,
"weighted_changed": 0.0,
"weighted_up": 0.0,
"weighted_down": 0.0,
"largest_abs": 0.0,
"rows": []
},
"state_income_tax": {
"entity": "tax_unit",
"base_sum": 578044599361.5671,
"head_sum": 578064336777.087,
"change": 19737415.51989746,
"records_changed": 50,
"weighted_changed": 38893.243959940846,
"weighted_up": 38893.243959940846,
"weighted_down": 0.0,
"largest_abs": 1097.400390625,
"rows": [
{
"id": 1181985,
"base": -10443.572265625,
"head": -9346.171875
},
{
"id": 1103177,
"base": -10766.0,
"head": -9668.599609375
},
{
"id": 181985,
"base": -10441.73046875,
"head": -9344.330078125
},
{
"id": 1026757,
"base": -9995.853515625,
"head": -8898.453125
},
{
"id": 27544,
"base": -9316.0,
"head": -8218.599609375
}
]
}
}Generated by Claude Code |
|
US + core hub merge audit, us#10638 at
🤖 Generated with Claude Code |
The DC EITC match for filers with qualifying children stays at 100% for TY2025, drops to 85% for 2026-2028, and returns to 100% from 2029. On main it was 100% for every year from 2025.
Law (D.C. Code § 47-1806.04(f)(1))
Change
with_children/match.yaml:2025: 1(D.C. Act 26-214 and D.C. Law 26-89),2026: 0.85((B-2)),2029: 1((B-3)). I added references to both acts.Tests
dc_eitc_with_qualifying_child.yamlhas 3 new cases: an HoH filer, $10,000 wages, one child. Federal EITC = 34% x $10,000 = $3,400 in each year.The existing 2025 cases (3,400 = 100%) don't change.
Sources and the TY2025 reading
The hub read these on its own host:
So TY2025 stays at 100%. Read only against the current permanent text, it would be 85%.
source-conflict:
us-dc:eitc-with-children-2025-rateinsource_conflicts/candidates.yamlrecords the question, with PE-US following the emergency and temporary acts for TY2025.impact: we estimate that DC's EITC falls $19.7 million (14%) in 2026. About 38,900 tax units with qualifying children (50 records in the default dataset) each receive 85% of their credit under main. DC income tax rises, and household net income falls, by the same $19.7 million; federal income tax and benefits don't change (pair).
axiom: TheAxiomFoundation/rulespec-us#1420 (ruling 7 added)
🤖 Generated with Claude Code