From 5135475a0b5e0a36bd2fd654d15d0a8d0e69cba9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:04:45 -0400 Subject: [PATCH 01/18] BLS deck: scaffold releases and Axiom-plan slide layouts (no slides use them yet) Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/content.ts | 14 +++++ .../bls-taxsim-2026/slides/AxiomPlan.tsx | 50 +++++++++++++++++ .../bls-taxsim-2026/slides/Releases.tsx | 55 +++++++++++++++++++ slideshows/bls-taxsim-2026/slides/index.tsx | 6 ++ 4 files changed, 125 insertions(+) create mode 100644 slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx create mode 100644 slideshows/bls-taxsim-2026/slides/Releases.tsx diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 9fbeeae..929e179 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -153,6 +153,20 @@ export interface BlsSlideContent { takeaway?: string; loop?: string; }; + /** Versions and releases: headline figures, the pin command, and what ships with every release. */ + releases?: { + stats: { value: string; label: string }[]; + pin: { title: string; code: string; note: string }; + items: { icon: BlsIcon; title: string; text: string }[]; + takeaway?: string; + }; + /** The transition to Axiom in stages: today, next, and what stays the same throughout. */ + axiomPlan?: { + intro?: string; + stages: { label: string; title: string; items: string[]; tone: 'now' | 'next' | 'always' }[]; + takeaway?: string; + footnote?: string; + }; detail?: { intro?: string; columns?: string[]; diff --git a/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx b/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx new file mode 100644 index 0000000..9edaeb2 --- /dev/null +++ b/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx @@ -0,0 +1,50 @@ +import { IconChevronRight } from '@tabler/icons-react'; +import type { BlsSlideContent } from '../content'; + +type AxiomPlan = NonNullable; + +const TONES: Record = { + now: { band: 'bg-pe-teal', label: 'text-pe-teal' }, + next: { band: 'bg-pe-700', label: 'text-pe-700' }, + always: { band: 'bg-pe-dark', label: 'text-pe-dark' }, +}; + +/** + * The transition to Axiom in three stages, left to right: what runs today, + * what comes next, and what stays the same throughout. + */ +export default function AxiomPlanSlide({ plan }: { plan: AxiomPlan }) { + return ( +
+ {plan.intro &&

{plan.intro}

} + +
+ {plan.stages.map((stage, index) => ( +
+
+
+
+

{stage.label}

+

{stage.title}

+
    + {stage.items.map((item) => ( +
  • +
  • + ))} +
+
+
+ {index < plan.stages.length - 1 && ( +
+ ))} +
+ + {plan.takeaway &&

{plan.takeaway}

} + {plan.footnote &&

{plan.footnote}

} +
+ ); +} diff --git a/slideshows/bls-taxsim-2026/slides/Releases.tsx b/slideshows/bls-taxsim-2026/slides/Releases.tsx new file mode 100644 index 0000000..22b9c98 --- /dev/null +++ b/slideshows/bls-taxsim-2026/slides/Releases.tsx @@ -0,0 +1,55 @@ +import type { BlsSlideContent } from '../content'; +import { DeckIcon } from './Visuals'; + +type Releases = NonNullable; + +/** + * Versions and releases: headline release figures, the command that pins a run + * to exact versions, and what ships with every release. + */ +export default function ReleasesSlide({ releases }: { releases: Releases }) { + return ( +
+
+ {releases.stats.map((stat) => ( +
+

{stat.value}

+

{stat.label}

+
+ ))} +
+ +
+
+

{releases.pin.title}

+
+            {releases.pin.code}
+          
+

{releases.pin.note}

+
+ +
+ {releases.items.map((item) => ( +
+ + + +
+

{item.title}

+

{item.text}

+
+
+ ))} +
+
+ + {releases.takeaway &&

{releases.takeaway}

} +
+ ); +} diff --git a/slideshows/bls-taxsim-2026/slides/index.tsx b/slideshows/bls-taxsim-2026/slides/index.tsx index c9efd64..22d17ba 100644 --- a/slideshows/bls-taxsim-2026/slides/index.tsx +++ b/slideshows/bls-taxsim-2026/slides/index.tsx @@ -5,6 +5,8 @@ import CeInputsTable from './CeInputsTable'; import InputMapping from './InputMapping'; import OriginsSlide from './Origins'; import ProcessFlow from './ProcessFlow'; +import ReleasesSlide from './Releases'; +import AxiomPlanSlide from './AxiomPlan'; import { ThankYouSlide } from './ThankYouSlide'; import SectionDivider from './SectionDivider'; import UpdateTimelineSlide from './UpdateTimeline'; @@ -92,6 +94,10 @@ function DeckSlide({ content }: { content: BlsSlideContent }) { ) : content.routing ? ( + ) : content.releases ? ( + + ) : content.axiomPlan ? ( + ) : content.compare ? ( From 633c420ad66270b9b22053a8e1fb617ef079f604 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:17:40 -0400 Subject: [PATCH 02/18] BLS deck: why-we-built slide, funders, versions and releases, Axiom plan, What's next section Adds the motivation slide (why PolicyEngine built a TAXSIM emulator), a funding strip and recounted test files and contributors on PolicyEngine today, a Versions and releases slide, and an Axiom transition-plan slide. Section 05 becomes What's next: the 2026 rules, Axiom, then the CE pilot. Thesia Garner's question list is answered in the notes of the slides that cover each question. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/content.ts | 275 ++++++++++++------ .../bls-taxsim-2026/slides/PEIntroSlides.tsx | 13 +- 2 files changed, 196 insertions(+), 92 deletions(-) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 929e179..7506575 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -205,19 +205,19 @@ export const blsSlides: BlsSlideContent[] = [ "The TAXSIM emulator", "Validation", "Beyond TAXSIM", - "A possible CE pilot", + "What’s next", "Q&A and discussion" ], "descriptions": [ - "What PolicyEngine is, who uses it, and how the NBER collaboration started.", - "A drop-in TAXSIM interface, where each calculation happens, and a live demo in the browser.", + "What PolicyEngine is, who funds and uses it, why we built an emulator, and how the NBER collaboration started.", + "A drop-in TAXSIM interface, where each calculation happens, versions and releases, and a live demo in the browser.", "How a disagreement is resolved with the engines, independent validators and the law, how that shapes the emulator, the public dashboard, and our progress.", "What PolicyEngine models beyond TAXSIM’s inputs, and methods for missing survey inputs, SNAP participation and Medicaid valuation.", - "A focused comparison, the inputs it needs, questions for CE staff, and when the 2026 tax rules will be ready.", + "The 2026 tax rules, Axiom as our next-generation rules engine, and a possible CE pilot.", "Questions on the methods, implementation, and opportunities for collaboration." ], "minutes": 1, - "notes": "The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap and where each calculation happens, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Reserve 30 minutes for Q&A." + "notes": "The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer." }, { "id": "section-intro", @@ -235,20 +235,21 @@ export const blsSlides: BlsSlideContent[] = [ "Households: survey data enhanced and calibrated, or any household you enter", "Reforms: change any parameter and see the cost, poverty and distributional effects" ], - "minutes": 3, - "notes": "Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the emulator section covers those. Adapted from the cpid-webinar-2026 deck (September 2026).", + "minutes": 2, + "notes": "Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the emulator section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026).", "custom": "what-is-pe" }, { "id": "pe-today", "title": "PolicyEngine today", "body": [ - "95,000+ parameters, 5,500+ variables and 4,693 test files in the US model", - "Public code since June 2021, with 133 contributors to the US model", - "NBER, the Atlanta Fed and No 10 Downing Street work with the models" + "95,000+ parameters, 5,500+ variables and 4,932 test files in the US model", + "Public code since June 2021, with 136 contributors to the US model", + "NBER, the Atlanta Fed and No 10 Downing Street work with the models", + "A nonprofit, fiscally sponsored by the PSL Foundation, funded by foundation grants and the organizations that build on the models" ], "minutes": 1, - "notes": "Use the numbers to show scale and testing, not to sell. The NBER memorandum of understanding is the reason the TAXSIM emulator exists; the next section covers it. Figures from the gettsim-2026 deck (September 3, 2026); check them before the talk if you quote them.", + "notes": "Use the numbers to show scale and testing, not to sell. The NBER memorandum of understanding is the reason the TAXSIM emulator exists; the next section covers it. Test files (4,932 YAML files under policyengine_us/tests) and contributors (136 GitHub accounts) recounted on October 8, 2026; the other figures are from the gettsim-2026 deck (September 3, 2026). Answers Thesia’s funding question: PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. The funders on the slide are the public supporters page (policyengine.org/us/supporters): Arnold Ventures, the National Science Foundation (a POSE Phase I grant, $299,974, September 2025 to August 2026), the Nuffield Foundation, NEO Philanthropy, the Pritzker Children’s Initiative, and MyFriendBen among the organizations that build on the models. Max speaks to future funding. Answers the staffing question: the emulator is maintained by Pavel Makarchuk, David Trimmer and Max Ghenis; the US model it calls had 20 people committing in the past 12 months. Do not put headcount or turnover figures on the record beyond what Max chooses to say.", "custom": "pe-today" }, { @@ -263,6 +264,24 @@ export const blsSlides: BlsSlideContent[] = [ "notes": "Point out the federal statistical user, BEA, because it is closest to the CE team’s work, and the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026).", "custom": "who-uses-pe" }, + { + "id": "why-emulator", + "title": "Why we built a TAXSIM emulator", + "body": [], + "minutes": 1, + "notes": "Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), and we launched in October 2021. Say “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched state income tax modeling for all 50 states and DC. NBER’s TAXSIM home page (taxsim.nber.org, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” Quote only those fragments: the same footnote calls TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf.", + "hero": { + "value": "2021+", + "label": "BEA runs PolicyEngine for tax years 2021 forward in its distribution of personal income.", + "source": "BEA, Distribution of Personal Income technical document, June 2026" + }, + "cards": [ + { "icon": "history", "title": "Microsimulation first", "text": "PolicyEngine launched in 2021 to model taxes and benefits for any household or survey." }, + { "icon": "map-pin", "title": "State taxes, checked against TAXSIM", "text": "Our first state income tax and TAXSIM35 validation began in April 2022; all states and DC followed in 2024." }, + { "icon": "book", "title": "NBER names a successor", "text": "“A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER" }, + { "icon": "world", "title": "One model for both uses", "text": "The emulator runs TAXSIM files on the same open rules that score reforms and benefits." } + ] + }, { "id": "origins", "title": "How the collaboration started", @@ -301,7 +320,7 @@ export const blsSlides: BlsSlideContent[] = [ "A memorandum of understanding in September 2025; one interface routes 1960–2020 to TAXSIM35 and 2021 onward to PolicyEngine", "PolicyEngine: open source since 2021, 95,000+ federal and state parameters, and benefit programs such as SNAP and Medicaid", ], - "minutes": 3, + "minutes": 2, "notes": "Start on the left with TAXSIM, end on the right with PolicyEngine, and use the middle for the agreement and how one interface routes tax years. Close with: both teams validate the emulator, and the work has improved how both TAXSIM and PolicyEngine encode tax law. TAXSIM has run at NBER since the 1970s; NBER still maintains it, and more than 1,200 papers cite the 1993 paper that introduced it. Think tanks such as Brookings and federal agencies rely on it. NBER started filing differences on the emulator’s public GitHub tracker in 2024 (first issue: September 22, 2024). The memorandum of understanding with NBER was announced on September 5, 2025. policyengine-taxsim 3.0.0 was released on September 29, 2026, one of 80 PyPI releases since February 2026. One interface covers every tax year: TAXSIM35 handles 1960–2020 (state law from 1977) and PolicyEngine handles 2021 onward. PolicyEngine facts (right): public code since June 2021, 133 contributors to the US model, 95,000+ parameters and 4,693 test files, from the gettsim-2026 deck (September 3, 2026); check them before the talk. The benefit list follows the Benefits and taxes section of policyengine.org/us/taxsim, which also names housing vouchers, the EITC and the CTC. Optional context for this audience, not on the slide: the CE published TAXSIM-based tax estimates from the 2013 data through the 2023 data, and the 2024 data has none (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). Sources: https://www.policyengine.org/us/research/policyengine-nber-mou-taxsim and https://pypi.org/project/policyengine-taxsim/", "headerLink": TAXSIM_SITE, "bridge": { @@ -419,13 +438,41 @@ export const blsSlides: BlsSlideContent[] = [ "takeaway": "One file in and one file out. The tax year decides which engine calculates each row." } }, + { + "id": "releases", + "title": "Versions and releases", + "body": [], + "minutes": 2, + "notes": "Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers, and each merge to main ships a release: both repositories bump the version from the changelog fragments, rerun the tests and publish to PyPI automatically (policyengine-us push.yaml; policyengine-taxsim ci.yml, with tests on Linux, macOS and Windows). In the last 90 days that was 286 PolicyEngine US releases and 15 emulator releases (PyPI, October 8, 2026); each release is small, about two changelog entries. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck). Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI currently holds PolicyEngine US releases from May 12, 2026 (1.691.1) onward, so archive the environment for long-lived reproducibility. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: every pull request adds a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; the only breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; for the 121 issues NBER filed in the last 90 days, the median first PolicyEngine reply came in 23.5 hours. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026.", + "headerLink": { "label": "Changelog", "url": "https://github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md" }, + "releases": { + "stats": [ + { "value": "286", "label": "PolicyEngine US releases in the last 90 days" }, + { "value": "15", "label": "Emulator releases in the last 90 days" }, + { "value": "Every year", "label": "Each release computes every tax year it covers" }, + { "value": "23.5 hours", "label": "Median first reply to NBER’s reports, last 90 days" } + ], + "pin": { + "title": "Pin both packages to reproduce a run", + "code": "uv tool install policyengine-taxsim==3.0.1 \\\n --with policyengine-us==2.25.2", + "note": "Without a pin, the emulator takes the newest PolicyEngine US release. Record both versions with each run." + }, + "items": [ + { "icon": "calendar", "title": "One release, every tax year", "text": "Parameters carry dated values, so there is no separate version per tax year." }, + { "icon": "github", "title": "Each merge ships a release", "text": "Tests run on every pull request and again before each release publishes to PyPI." }, + { "icon": "list", "title": "A changelog entry for every change", "text": "Each typed added, changed, fixed, removed or breaking; a major version marks a breaking change." }, + { "icon": "users", "title": "Support on the public tracker", "text": "Every report and its resolution stay visible on GitHub." } + ], + "takeaway": "The file format stays TAXSIM’s. The last breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it." + } + }, // Live demonstration: 13 minutes { "id": "demo-live", "title": "Live demo: run the sample file", "body": [], - "minutes": 13, + "minutes": 10, "notes": "Go straight into the live demo after the routing diagram and before validation. Click inside the frame to use the page. The frame keeps keyboard focus, so click the slide title before you press the arrow keys again. Use Expand for a larger view. Do not use the email form. Run and download in browser saves a CSV on the presentation laptop; open it to show the results for each household. Rehearse on the presentation laptop and network: confirm that the frame loads and note how long the run takes. Start by loading the 3-household sample and reading household 1 aloud: a married couple in California (state code 5, mstat 2) with two dependents and $80,000 and $50,000 in wages. If the frame does not load, open policyengine.org/us/taxsim/run in a browser tab. Demo steps: (1) Load the 3-household sample; (2) Keep Standard output: federal and state tax, FICA and marginal rates; (3) Run and download in the browser; (4) Read the results for each household; (5) Switch to Full for AGI, credits, deductions and AMT.", "headerLink": TAXSIM_RUN, "embed": { @@ -447,7 +494,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Three calculations, one arbiter", "body": [], "minutes": 3, - "notes": "Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute.", + "notes": "Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests before it can merge, and every release reruns them before it publishes. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026).", "triangle": { "corners": { "top": { "icon": "building", "title": "TAXSIM35", "text": "NBER’s calculator, the reference engine" }, @@ -845,7 +892,7 @@ export const blsSlides: BlsSlideContent[] = [ "Draw plausible values for missing inputs", "Assess distributions and sensitivity across imputations" ], - "minutes": 3, + "minutes": 2, "notes": "A donor survey observes the variable of interest and predictors shared with the recipient survey. A conditional distribution permits households with similar observed characteristics to have different imputed values. That can matter around tax-benefit thresholds. Multiple draws can reveal sensitivity, but they do not automatically solve model misspecification or preserve every joint relationship. The prior deck names CPS, ACS, SCF, SIPP and tax microdata. This slide does not claim a CE implementation exists. Source: local IARIW 2026 ImputationSlide.tsx.", "sourcesPanel": { "sourcesTitle": "Sources fused into PolicyEngine’s US microdata", @@ -873,7 +920,7 @@ export const blsSlides: BlsSlideContent[] = [ "A monetary Medicaid value requires a defined valuation method" ], "minutes": 2, - "notes": "Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure.", + "notes": "Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 10 states, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026).", "resourceBars": { "intro": "One California household in 2025 (a single parent, children aged 4 and 7, $25,000 in wages), four resource concepts.", "rows": [ @@ -910,91 +957,21 @@ export const blsSlides: BlsSlideContent[] = [ } }, - // A possible CE pilot: 7 minutes + // What’s next: 2026 rules, Axiom and a possible CE pilot, 11 minutes { - "id": "section-pilot", - "title": "A possible CE pilot", + "id": "section-next", + "title": "What’s next", "body": [], "minutes": 0, "notes": "Section opener. Move on after a few seconds.", "divider": { "number": "05" } }, - { - "id": "ce-fit", - "title": "Where this could fit in CE research", - "body": [ - "Begin with an agreed set of tax-imputation inputs", - "Run both calculators on the same records", - "Compare household results and weighted summaries", - "Review differences before expanding the scope" - ], - "minutes": 2, - "notes": "This is a proposed integration path, not a tested CE implementation. CE published federal and state income tax estimates from NBER’s TAXSIM from the second quarter of 2013 through the 2023 data (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). The 2024 data has no tax or after-tax income estimates: BLS says the external tax model was not updated for the 2024 tax year, and it keeps a tax unit identifier on the microdata so users can produce their own tax estimates. A comparison therefore needs a year with CE TAXSIM estimates, 2023 or earlier; for the 2024 data onward, the emulator would produce estimates where CE now has none. The same TAXSIM input file can go to both engines. The slide gives only the years; mention the 2024 gap only if asked. Sources: https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://www.bls.gov/cex/csxfaqs.htm (question 42) and https://www.bls.gov/cex/notices/2025/ce-after-tax.htm. Start with the core outputs: fiitax, siitax, fica, v22 (child tax credit), v25 (EITC) and frate. Ask staff which parts of their current workflow could supply the comparison inputs. Preserve existing CE definitions and weights in the initial comparison.", - "compare": { - "input": { "title": "CE tax-unit records", "text": "An agreed set of inputs for one year." }, - "engines": [ - { "title": "CE’s TAXSIM estimates", "text": "Published for 2013–2023 data." }, - { "title": "PolicyEngine TAXSIM emulator", "text": "The same file, no format changes." } - ], - "output": { "title": "Compare", "text": "Household results and weighted summaries." }, - "next": { "title": "Review", "text": "Explain differences before expanding the scope." }, - "outputsTitle": "Outputs to compare first", - "outputs": [ - { "field": "fiitax", "meaning": "Federal income tax" }, - { "field": "siitax", "meaning": "State income tax" }, - { "field": "fica", "meaning": "Payroll tax" }, - { "field": "v22", "meaning": "Child tax credit" }, - { "field": "v25", "meaning": "Earned income credit" }, - { "field": "frate", "meaning": "Federal marginal rate" } - ], - "takeaway": "Keep CE definitions and weights fixed in the first comparison." - } - }, - { - "id": "ce-pilot", - "title": "A manageable CE pilot", - "body": [ - "Agree one year, one sample and the key tax outputs", - "Document input mappings and missing-data assumptions", - "Produce a reproducible comparison and discrepancy log", - "Scope one benefit extension after reviewing the tax results" - ], - "minutes": 3, - "notes": "Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known.", - "process": { - "intro": "Four steps, each with a clear output.", - "steps": [ - { "title": "Scope", "text": "Agree one year, one sample and the key tax outputs.", "output": "Scope note" }, - { "title": "Map", "text": "Document input mappings and missing-data assumptions.", "output": "Mapping document" }, - { "title": "Compare", "text": "Run both calculations and log every difference.", "output": "Comparison and discrepancy log" }, - { "title": "Extend", "text": "Choose one benefit extension after the tax results.", "output": "Extension plan" } - ], - "sides": [ - { - "title": "CE would provide", - "items": [ - "One year of tax-unit records in the TAXSIM input format", - "Its published TAXSIM estimates and the survey weights", - "Staff time to review the discrepancy log" - ] - }, - { - "title": "PolicyEngine would provide", - "items": [ - "The open-source emulator, which installs and runs inside BLS", - "Runs pinned to emulator and model versions", - "A diagnosis of each difference, then a benefit extension proposal" - ] - } - ] - } - }, { "id": "state-updates", "title": "When the 2026 tax rules will be ready", "body": [], "minutes": 2, - "notes": "BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026.", + "notes": "BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule.", "updateTimeline": { "stats": [ { @@ -1132,6 +1109,124 @@ export const blsSlides: BlsSlideContent[] = [ "source": "Source: PolicyEngine US pull requests #6898 to #7421 on GitHub." } }, + { + "id": "axiom-plan", + "title": "Axiom: our next-generation rules engine", + "body": [], + "minutes": 2, + "notes": "Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here.", + "headerLink": { + "label": "axiom.org", + "url": "https://axiom.org" + }, + "axiomPlan": { + "intro": "Axiom encodes tax and benefit rules from the law, with a test for every federal rule module. We are moving PolicyEngine onto it in steps.", + "stages": [ + { + "label": "Today", + "title": "PolicyEngine US runs the emulator", + "tone": "now", + "items": [ + "Tax years 2021 onward compute on PolicyEngine US", + "The 2026 rules ship there by March 31, 2027", + "Axiom publishes open comparisons with PolicyEngine and TAXSIM" + ] + }, + { + "label": "Planned", + "title": "Axiom on the backend", + "tone": "next", + "items": [ + "PolicyEngine’s interface wraps Axiom’s engine", + "The TAXSIM emulator can run on Axiom", + "New programs arrive as encodings of the law, with tests" + ] + }, + { + "label": "Throughout", + "title": "Backwards compatible", + "tone": "always", + "items": [ + "TAXSIM-format files in and out", + "The same command-line and Python calls", + "We keep powering TAXSIM for as long as it is needed" + ] + } + ], + "takeaway": "We keep pushing the rules further without breaking the files and code that depend on them.", + "footnote": "Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) on an MIT-licensed Rust engine. It does not yet compute a complete federal return." + } + }, + { + "id": "ce-fit", + "title": "Where this could fit in CE research", + "body": [ + "Begin with an agreed set of tax-imputation inputs", + "Run both calculators on the same records", + "Compare household results and weighted summaries", + "Review differences before expanding the scope" + ], + "minutes": 2, + "notes": "This is a proposed integration path, not a tested CE implementation. CE published federal and state income tax estimates from NBER’s TAXSIM from the second quarter of 2013 through the 2023 data (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). The 2024 data has no tax or after-tax income estimates: BLS says the external tax model was not updated for the 2024 tax year, and it keeps a tax unit identifier on the microdata so users can produce their own tax estimates. A comparison therefore needs a year with CE TAXSIM estimates, 2023 or earlier; for the 2024 data onward, the emulator would produce estimates where CE now has none. The same TAXSIM input file can go to both engines. The slide gives only the years; mention the 2024 gap only if asked. Sources: https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://www.bls.gov/cex/csxfaqs.htm (question 42) and https://www.bls.gov/cex/notices/2025/ce-after-tax.htm. Start with the core outputs: fiitax, siitax, fica, v22 (child tax credit), v25 (EITC) and frate. Ask staff which parts of their current workflow could supply the comparison inputs. Preserve existing CE definitions and weights in the initial comparison.", + "compare": { + "input": { "title": "CE tax-unit records", "text": "An agreed set of inputs for one year." }, + "engines": [ + { "title": "CE’s TAXSIM estimates", "text": "Published for 2013–2023 data." }, + { "title": "PolicyEngine TAXSIM emulator", "text": "The same file, no format changes." } + ], + "output": { "title": "Compare", "text": "Household results and weighted summaries." }, + "next": { "title": "Review", "text": "Explain differences before expanding the scope." }, + "outputsTitle": "Outputs to compare first", + "outputs": [ + { "field": "fiitax", "meaning": "Federal income tax" }, + { "field": "siitax", "meaning": "State income tax" }, + { "field": "fica", "meaning": "Payroll tax" }, + { "field": "v22", "meaning": "Child tax credit" }, + { "field": "v25", "meaning": "Earned income credit" }, + { "field": "frate", "meaning": "Federal marginal rate" } + ], + "takeaway": "Keep CE definitions and weights fixed in the first comparison." + } + }, + { + "id": "ce-pilot", + "title": "A manageable CE pilot", + "body": [ + "Agree one year, one sample and the key tax outputs", + "Document input mappings and missing-data assumptions", + "Produce a reproducible comparison and discrepancy log", + "Scope one benefit extension after reviewing the tax results" + ], + "minutes": 2, + "notes": "Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known.", + "process": { + "intro": "Four steps, each with a clear output.", + "steps": [ + { "title": "Scope", "text": "Agree one year, one sample and the key tax outputs.", "output": "Scope note" }, + { "title": "Map", "text": "Document input mappings and missing-data assumptions.", "output": "Mapping document" }, + { "title": "Compare", "text": "Run both calculations and log every difference.", "output": "Comparison and discrepancy log" }, + { "title": "Extend", "text": "Choose one benefit extension after the tax results.", "output": "Extension plan" } + ], + "sides": [ + { + "title": "CE would provide", + "items": [ + "One year of tax-unit records in the TAXSIM input format", + "Its published TAXSIM estimates and the survey weights", + "Staff time to review the discrepancy log" + ] + }, + { + "title": "PolicyEngine would provide", + "items": [ + "The open-source emulator, which installs and runs inside BLS", + "Runs pinned to emulator and model versions", + "A diagnosis of each difference, then a benefit extension proposal" + ] + } + ] + } + }, { "id": "qa", "title": "Q&A and discussion", diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index 177aef3..18ae043 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -86,7 +86,7 @@ export function WhatIsPolicyEngineSlide() { const stats = [ { value: '95,000+', label: 'parameters in the US model' }, { value: '5,500+', label: 'variables' }, - { value: '4,693', label: 'test files' }, + { value: '4,932', label: 'test files' }, { value: '103', label: 'programs in the coverage registry' }, ]; @@ -112,7 +112,7 @@ export function PolicyEngineTodaySlide() {

Free, open-source software to compute the effect of public policy. US and UK tax-benefit - models, with public code since June 2021 and 133 contributors to the US model. + models, with public code since June 2021 and 136 contributors to the US model.

@@ -139,6 +139,15 @@ export function PolicyEngineTodaySlide() {
+ +
+

+ Funding: + a nonprofit, fiscally sponsored by the PSL Foundation, with grants from Arnold Ventures, the + National Science Foundation, the Nuffield Foundation, NEO Philanthropy and the Pritzker + Children’s Initiative, and support from organizations that build on the models, such as MyFriendBen. +

+
); } From 1d01385236df61ddc21bdd98de473c215dee1f9d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:21:58 -0400 Subject: [PATCH 03/18] BLS deck: apply fact-check corrections to the new slides Releases: several merges can share one release; CI checks changelog entries but does not block merges; the pin example needs Python 3.11; PyPI does not keep every PolicyEngine US release. Motivation: the October 2021 launch was PolicyEngine UK, the April 2024 all-states launch was a beta, and the successor quote is attributed to Dan Feenberg's TAXSIM page. Contributors stay at 133 (the API's 136 includes three bots). The #1248 note is updated: NBER closed it on September 29. Axiom slide cites the shipped Belgium pilot of policyengine.py on Axiom. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/content.ts | 32 +++++++++---------- .../bls-taxsim-2026/slides/PEIntroSlides.tsx | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 7506575..64b0737 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -244,12 +244,12 @@ export const blsSlides: BlsSlideContent[] = [ "title": "PolicyEngine today", "body": [ "95,000+ parameters, 5,500+ variables and 4,932 test files in the US model", - "Public code since June 2021, with 136 contributors to the US model", + "Public code since June 2021, with 133 contributors to the US model", "NBER, the Atlanta Fed and No 10 Downing Street work with the models", "A nonprofit, fiscally sponsored by the PSL Foundation, funded by foundation grants and the organizations that build on the models" ], "minutes": 1, - "notes": "Use the numbers to show scale and testing, not to sell. The NBER memorandum of understanding is the reason the TAXSIM emulator exists; the next section covers it. Test files (4,932 YAML files under policyengine_us/tests) and contributors (136 GitHub accounts) recounted on October 8, 2026; the other figures are from the gettsim-2026 deck (September 3, 2026). Answers Thesia’s funding question: PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. The funders on the slide are the public supporters page (policyengine.org/us/supporters): Arnold Ventures, the National Science Foundation (a POSE Phase I grant, $299,974, September 2025 to August 2026), the Nuffield Foundation, NEO Philanthropy, the Pritzker Children’s Initiative, and MyFriendBen among the organizations that build on the models. Max speaks to future funding. Answers the staffing question: the emulator is maintained by Pavel Makarchuk, David Trimmer and Max Ghenis; the US model it calls had 20 people committing in the past 12 months. Do not put headcount or turnover figures on the record beyond what Max chooses to say.", + "notes": "Use the numbers to show scale and testing, not to sell. The NBER memorandum of understanding is the reason the TAXSIM emulator exists; the next section covers it. Test files (4,932 YAML files under policyengine_us/tests) and contributors (133 people; the GitHub list shows 136 accounts, 3 of them bots) recounted on October 8, 2026; the other figures are from the gettsim-2026 deck (September 3, 2026). Answers Thesia’s funding question: PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. The funders on the slide are the public supporters page (policyengine.org/us/supporters): Arnold Ventures, the National Science Foundation (a POSE Phase I grant, $299,974, September 2025 to August 2026), the Nuffield Foundation, NEO Philanthropy, the Pritzker Children’s Initiative, and MyFriendBen among the organizations that build on the models. Max speaks to future funding. Answers the staffing question: the emulator is maintained by Pavel Makarchuk, David Trimmer and Max Ghenis; the US model it calls had 20 people committing in the past 12 months. Do not put headcount or turnover figures on the record beyond what Max chooses to say.", "custom": "pe-today" }, { @@ -269,7 +269,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Why we built a TAXSIM emulator", "body": [], "minutes": 1, - "notes": "Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), and we launched in October 2021. Say “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched state income tax modeling for all 50 states and DC. NBER’s TAXSIM home page (taxsim.nber.org, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” Quote only those fragments: the same footnote calls TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf.", + "notes": "Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). The dashboard now compares tax years 2021 to 2025. Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement. Quote only those BEA fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf.", "hero": { "value": "2021+", "label": "BEA runs PolicyEngine for tax years 2021 forward in its distribution of personal income.", @@ -277,8 +277,8 @@ export const blsSlides: BlsSlideContent[] = [ }, "cards": [ { "icon": "history", "title": "Microsimulation first", "text": "PolicyEngine launched in 2021 to model taxes and benefits for any household or survey." }, - { "icon": "map-pin", "title": "State taxes, checked against TAXSIM", "text": "Our first state income tax and TAXSIM35 validation began in April 2022; all states and DC followed in 2024." }, - { "icon": "book", "title": "NBER names a successor", "text": "“A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER" }, + { "icon": "map-pin", "title": "State taxes, checked against TAXSIM", "text": "Our first state income tax and TAXSIM35 validation began in April 2022; beta coverage of every state followed in 2024." }, + { "icon": "book", "title": "NBER names a successor", "text": "“A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page" }, { "icon": "world", "title": "One model for both uses", "text": "The emulator runs TAXSIM files on the same open rules that score reforms and benefits." } ] }, @@ -443,24 +443,24 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Versions and releases", "body": [], "minutes": 2, - "notes": "Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers, and each merge to main ships a release: both repositories bump the version from the changelog fragments, rerun the tests and publish to PyPI automatically (policyengine-us push.yaml; policyengine-taxsim ci.yml, with tests on Linux, macOS and Windows). In the last 90 days that was 286 PolicyEngine US releases and 15 emulator releases (PyPI, October 8, 2026); each release is small, about two changelog entries. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck). Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI currently holds PolicyEngine US releases from May 12, 2026 (1.691.1) onward, so archive the environment for long-lived reproducibility. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: every pull request adds a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; the only breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; for the 121 issues NBER filed in the last 90 days, the median first PolicyEngine reply came in 23.5 hours. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026.", + "notes": "Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers. Merged changes ship automatically, often several in one release: both repositories bump the version from the changelog fragments and publish to PyPI after the tests pass (PolicyEngine US waits for its full suite; the emulator for lint and pytest on Linux, macOS and Windows; policyengine-us push.yaml, policyengine-taxsim ci.yml). From July 10 to October 7 that was 286 PolicyEngine US releases, about three a day, and 15 emulator releases; each release is small, about two changelog entries. Tests run on every pull request, but GitHub does not block a merge that fails them; merging is a reviewer’s decision. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves on Python 3.11 (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck); on Python 3.10 it cannot resolve, and an unpinned install there falls back to an older 1.x model with the older S-corporation default. Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI does not keep every PolicyEngine US release: only five from before July 2026 remain, and 1.711.0, the emulator’s own minimum, is gone. For long-lived reproducibility, archive the installed environment or wheels with the results. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: CI checks each pull request for a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; under the current release script a breaking entry bumps the major version, and the only breaking change so far, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; for the 121 issues NBER filed in the last 90 days, the median first PolicyEngine reply came in 23.5 hours. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026.", "headerLink": { "label": "Changelog", "url": "https://github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md" }, "releases": { "stats": [ - { "value": "286", "label": "PolicyEngine US releases in the last 90 days" }, - { "value": "15", "label": "Emulator releases in the last 90 days" }, + { "value": "286", "label": "PolicyEngine US releases, July 10 to October 7" }, + { "value": "15", "label": "Emulator releases in the same 90 days" }, { "value": "Every year", "label": "Each release computes every tax year it covers" }, { "value": "23.5 hours", "label": "Median first reply to NBER’s reports, last 90 days" } ], "pin": { "title": "Pin both packages to reproduce a run", - "code": "uv tool install policyengine-taxsim==3.0.1 \\\n --with policyengine-us==2.25.2", - "note": "Without a pin, the emulator takes the newest PolicyEngine US release. Record both versions with each run." + "code": "uv tool install --python 3.11 \\\n policyengine-taxsim==3.0.1 \\\n --with policyengine-us==2.25.2", + "note": "Needs Python 3.11 or later. Without a pin, the emulator takes the newest PolicyEngine US release. Record both versions with each run." }, "items": [ { "icon": "calendar", "title": "One release, every tax year", "text": "Parameters carry dated values, so there is no separate version per tax year." }, - { "icon": "github", "title": "Each merge ships a release", "text": "Tests run on every pull request and again before each release publishes to PyPI." }, - { "icon": "list", "title": "A changelog entry for every change", "text": "Each typed added, changed, fixed, removed or breaking; a major version marks a breaking change." }, + { "icon": "github", "title": "Merged changes ship automatically", "text": "Tests run on every pull request, and a release reaches PyPI only after its tests pass." }, + { "icon": "list", "title": "Typed changelog entries", "text": "CI checks each pull request for an entry: added, changed, fixed, removed or breaking." }, { "icon": "users", "title": "Support on the public tracker", "text": "Every report and its resolution stay visible on GitHub." } ], "takeaway": "The file format stays TAXSIM’s. The last breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it." @@ -494,7 +494,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Three calculations, one arbiter", "body": [], "minutes": 3, - "notes": "Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests before it can merge, and every release reruns them before it publishes. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026).", + "notes": "Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests, and a release reaches PyPI only after its tests pass; merging is a reviewer’s decision, so GitHub does not block a failing pull request automatically. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026).", "triangle": { "corners": { "top": { "icon": "building", "title": "TAXSIM35", "text": "NBER’s calculator, the reference engine" }, @@ -521,7 +521,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "How this process shapes the emulator", "body": [], "minutes": 2, - "notes": "Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. Do not refresh with TAXSIM builds from September 24 onward until NBER confirms them (policyengine-taxsim #1248). Source: https://www.policyengine.org/us/taxsim/dashboard", + "notes": "Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. If asked about #1248: Dan Feenberg opened it on September 25 about his own TAXSIM changes, closed it on September 29, and has filed issues since. The dashboard data also fixed the Alabama coding (state 1, 1,155 households, separate from Texas) in the September 24 release. Source: https://www.policyengine.org/us/taxsim/dashboard", "process": { "stats": [ { "value": "111,347", "label": "Enhanced CPS households" }, @@ -1114,7 +1114,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Axiom: our next-generation rules engine", "body": [], "minutes": 2, - "notes": "Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here.", + "notes": "Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. Shipped evidence for the wrapper approach: policyengine.py already runs one country on Axiom, a Belgium pilot for worker social contributions and personal income tax (policyengine.py PR #448, tests/test_be_axiom_pilot.py); a US model on Axiom has no code yet. Axiom’s validation suite already turns its cases into TAXSIM rows and runs both TAXSIM-35 and the emulator on them (axiom-oracles adapters/taxsim). On the emulator, a CI test already pins the command-line entry point (tests/test_cli_entry_point.py). The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here.", "headerLink": { "label": "axiom.org", "url": "https://axiom.org" @@ -1137,7 +1137,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Axiom on the backend", "tone": "next", "items": [ - "PolicyEngine’s interface wraps Axiom’s engine", + "PolicyEngine’s Python interface wraps Axiom, as it already does for a Belgium pilot", "The TAXSIM emulator can run on Axiom", "New programs arrive as encodings of the law, with tests" ] diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index 18ae043..1f6a2f3 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -112,7 +112,7 @@ export function PolicyEngineTodaySlide() {

Free, open-source software to compute the effect of public policy. US and UK tax-benefit - models, with public code since June 2021 and 136 contributors to the US model. + models, with public code since June 2021 and 133 contributors to the US model.

From 31b15eef1381c0c73e27ca0b8608183eb5a104f1 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:29:49 -0400 Subject: [PATCH 04/18] BLS deck: live Axiom walk-through and docs kept in step Adds slide 30, the federal child and dependent care credit (26 USC 21) running live in Axiom, with the household, the arithmetic, the preview caveats and fallbacks in the notes. SPEAKER-NOTES.md, VALIDATION-SCRIPT.md and README.md now follow the 34-slide order, timings and components, and the checklist adds warming the web runner and rehearsing the Axiom run. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/README.md | 30 +-- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 180 ++++++++++++------ .../bls-taxsim-2026/VALIDATION-SCRIPT.md | 10 +- slideshows/bls-taxsim-2026/content.ts | 15 ++ 4 files changed, 154 insertions(+), 81 deletions(-) diff --git a/slideshows/bls-taxsim-2026/README.md b/slideshows/bls-taxsim-2026/README.md index e6aaad5..138cd3d 100644 --- a/slideshows/bls-taxsim-2026/README.md +++ b/slideshows/bls-taxsim-2026/README.md @@ -2,27 +2,29 @@ Local route: `/slides/bls-taxsim-2026`. -30 slides, including 5 section dividers and a closing slide, with 60 minutes of presentation time (no slack) and a dedicated final slide for 30 minutes of Q&A. +34 slides, including 5 section dividers and a closing slide, with 60 minutes of presentation time (no slack) and a dedicated final slide for 30 minutes of Q&A. -Agenda: introduction (12 min), the emulator (6 min), live demonstration (13 min), validation (10 min), beyond TAXSIM (12 min), CE pilot and the 2026 update timeline (7 min), Q&A (30 min). +Agenda: introduction (11 min), the emulator, including versions and releases (8 min), live demonstration (10 min), validation (10 min), beyond TAXSIM (11 min), what’s next: the 2026 tax rules, Axiom with a live walk-through, and a possible CE pilot (10 min), Q&A (30 min). Thesia Garner’s question list (October 7) is answered in the notes of the slides that cover each question; the agenda slide’s notes map them. - `content.ts`: slide copy, timing, sources, speaker notes, screenshots and live embeds. - `slides/index.tsx`: React rendering with the repository’s shared slide components. The cover uses the shared `CoverSlide` with speaker headshots. - `slides/PEIntroSlides.tsx`: PolicyEngine introduction (slides 4–6), adapted from the cpid-webinar-2026 and gettsim-2026 decks. -- `slides/SectionDivider.tsx`: section openers on the cover gradient, with the section number and title (slides 3, 9, 13, 18 and 25). -- `slides/Origins.tsx`: how the collaboration started: the record-by-record testing before the emulator, a real YAML test from policyengine-us issue #1504 beside it, and the milestones up to the agreement (slide 7). -- `slides/InputMapping.tsx`: story cards by general area, aligned across each row with CSS subgrid. Slide 19: the TAXSIM variables, the limit of the TAXSIM format, and the PolicyEngine variables that remove it. Slide 21: what PolicyEngine calculates beyond TAXSIM (benefit programs, health coverage, additional state tax credits and federal provisions), how the emulator handles each, and the PolicyEngine variables. Each ends with a “why it matters” card. -- `slides/DropInTabs.tsx`: the TAXSIM site’s Installation section on top and its Get started section below, as on policyengine.org/us/taxsim (slide 10). Each section has its title centered above its tabs: macOS/Linux and Windows for the two install steps, and CLI, Python, R, Stata, SAS and Julia for the before and after code. Clicks on the tabs and the Copy buttons do not advance the slide. On screens 820px tall or less, the widget scales down so that it fits. -- `slides/ThankYouSlide.tsx`: the closing slide, with each speaker’s photo, name and email (slide 30). +- `slides/SectionDivider.tsx`: section openers on the cover gradient, with the section number and title (slides 3, 10, 15, 20 and 27). +- `slides/Origins.tsx`: how the collaboration started: the record-by-record testing before the emulator, a real YAML test from policyengine-us issue #1504 beside it, and the milestones up to the agreement (slide 8). +- `slides/InputMapping.tsx`: story cards by general area, aligned across each row with CSS subgrid. Slide 21: the TAXSIM variables, the limit of the TAXSIM format, and the PolicyEngine variables that remove it. Slide 23: what PolicyEngine calculates beyond TAXSIM (benefit programs, health coverage, additional state tax credits and federal provisions), how the emulator handles each, and the PolicyEngine variables. Each ends with a “why it matters” card. +- `slides/DropInTabs.tsx`: the TAXSIM site’s Installation section on top and its Get started section below, as on policyengine.org/us/taxsim (slide 11). Each section has its title centered above its tabs: macOS/Linux and Windows for the two install steps, and CLI, Python, R, Stata, SAS and Julia for the before and after code. Clicks on the tabs and the Copy buttons do not advance the slide. On screens 820px tall or less, the widget scales down so that it fits. +- `slides/ThankYouSlide.tsx`: the closing slide, with each speaker’s photo, name and email (slide 34). - `slides/UpdateTimeline.tsx`: when the 2026 tax rules will be ready: the 2025 state update’s figures, the 2025 cycle and the 2026 plan on one November-to-March axis in half-month slots, the major changes, and the March 31, 2027 commitment (slide 28). -- `slides/CeInputsTable.tsx`: CE inputs that PolicyEngine can use and TAXSIM cannot: CE variables, PolicyEngine inputs, what PolicyEngine does with them and TAXSIM’s limit (slide 20). CE variable names are from the 2024 Interview public-use microdata dictionary. -- `slides/LiveEmbed.tsx`: live iframe with a side column of demo steps (slides 12 and 16). -- `slides/ProcessFlow.tsx`: step-card processes with optional figures, real examples and who-provides-what columns (slides 15, 17 and 27). +- `slides/CeInputsTable.tsx`: CE inputs that PolicyEngine can use and TAXSIM cannot: CE variables, PolicyEngine inputs, what PolicyEngine does with them and TAXSIM’s limit (slide 22). CE variable names are from the 2024 Interview public-use microdata dictionary. +- `slides/LiveEmbed.tsx`: live iframe with a side column of demo steps (slides 14, 18 and 30). +- `slides/ProcessFlow.tsx`: step-card processes with optional figures, real examples and who-provides-what columns (slides 17, 19 and 32). +- `slides/Releases.tsx`: versions and releases: release figures, the command that pins both packages, and what ships with every release (slide 13). +- `slides/AxiomPlan.tsx`: the move to Axiom in three stages: today, planned and throughout (slide 29). - `slides/DetailContent.tsx`: a table layout with a footnote; no slide uses it at present. -- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 8), the routing diagram: an example input file, two engines by tax year, an example output file (slide 11), the three-calculations triangle with the validation steps beside it (slide 14), imputation sources (slide 22), resource bars (slide 23), cards with a headline figure (slide 24), the comparison diagram (slide 26), and questions with resource links (slide 29). `BenefitChains` is kept but no slide uses it at present. +- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 9), the routing diagram: an example input file, two engines by tax year, an example output file (slide 12), the three-calculations triangle with the validation steps beside it (slide 16), imputation sources (slide 24), resource bars (slide 25), cards with a headline figure (slides 7 and 26), the comparison diagram (slide 31), and questions with resource links (slide 33). `BenefitChains` is kept but no slide uses it at present. - `SPEAKER-NOTES.md`: readable presenter track and preparation checklist, kept in step with `content.ts`. -- `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 14–17, 10 minutes). +- `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 16–19, 10 minutes). -The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, after the core assumptions and before validation. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (7) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (19 and 21) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. +The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, after the core assumptions and before validation. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (8) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (21 and 23) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. -The example results on slide 11 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 23 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 17 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 28 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. +The example results on slide 12 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 25 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 19 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 28 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 86dc563..ebe43f0 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -1,15 +1,18 @@ # BLS TAXSIM seminar: slide text and speaker notes -30 slides, including 5 section dividers and a closing slide: 60 minutes presenting, no slack, then a dedicated 30-minute Q&A slide. +34 slides, including 5 section dividers and a closing slide: 60 minutes presenting, no slack, then a dedicated 30-minute Q&A slide. Based on the September 2025 CRS TAXSIM section, PWBM 2026 validation material, IARIW 2026 imputation/calibration material in this repository, and the PolicyEngine TAXSIM site (policyengine.org/us/taxsim), captured October 5, 2026. ## Before presenting -- Rehearse the live demo (slide 12) and the live dashboard (slide 16) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. -- On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 15 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). -- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 15 notes and the slide 16 footnote if it does. Do not refresh with TAXSIM builds from September 24 onward until NBER confirms them (policyengine-taxsim #1248). -- The validation section (slides 14–17, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. +- Rehearse the live demo (slide 14) and the live dashboard (slide 18) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. +- On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 17 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). +- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 17 notes and the slide 18 footnote if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. +- The validation section (slides 16–19, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. +- Open policyengine.org/us/taxsim/run once before the talk: its first load took 9 seconds on October 8. +- Rehearse the Axiom run on slide 30 in a separate browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21, Run tab) and leave that tab open: answers are lost on reload. The slide notes have the household and the fallbacks. +- Thesia Garner’s questions are answered in the notes of the slides that cover them; the agenda notes (slide 2) map each question to its slide. - Confirm the CE-specific benefit methodology and pilot scope. These sections describe proposed research choices rather than a completed CE implementation. # Introduction and context @@ -24,39 +27,37 @@ Introduce the speakers and thank the BLS hosts and the CE team. ## 2. Today’s discussion (1–2 min) -- Introduction and context — What PolicyEngine is, who uses it, and how the NBER collaboration started. -- The TAXSIM emulator — A drop-in TAXSIM interface, where each calculation happens, and a live demo in the browser. +- Introduction and context — What PolicyEngine is, who funds and uses it, why we built an emulator, and how the NBER collaboration started. +- The TAXSIM emulator — A drop-in TAXSIM interface, where each calculation happens, versions and releases, and a live demo in the browser. - Validation — How a disagreement is resolved with the engines, independent validators and the law, how that shapes the emulator, the public dashboard, and our progress. - Beyond TAXSIM — What PolicyEngine models beyond TAXSIM’s inputs, and methods for missing survey inputs, SNAP participation and Medicaid valuation. -- A possible CE pilot — A focused comparison, the inputs it needs, and questions for CE staff. +- What’s next — The 2026 tax rules, Axiom as our next-generation rules engine, and a possible CE pilot. - Q&A and discussion — Questions on the methods, implementation, and opportunities for collaboration. -The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap and where each calculation happens, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Reserve 30 minutes for Q&A. - }, - { - "id": "section-intro +The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer. ## 3. Introduction and context (section divider) Section divider 01. Move on after a few seconds. -## 4. PolicyEngine: free, open-source microsimulation (2–5 min) +## 4. PolicyEngine: free, open-source microsimulation (2–4 min) - Rules: federal and state taxes and major benefit programs - Households: survey data enhanced and calibrated, or any household you enter - Reforms: change any parameter and see the cost, poverty and distributional effects -Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the emulator section covers those. Adapted from the cpid-webinar-2026 deck (September 2026). +Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the emulator section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026). -## 5. PolicyEngine today (5–6 min) +## 5. PolicyEngine today (4–5 min) -- 95,000+ parameters, 5,500+ variables and 4,693 test files in the US model +- 95,000+ parameters, 5,500+ variables and 4,932 test files in the US model - Public code since June 2021, with 133 contributors to the US model - NBER, the Atlanta Fed and No 10 Downing Street work with the models +- A nonprofit, fiscally sponsored by the PSL Foundation, funded by foundation grants and the organizations that build on the models -Use the numbers to show scale and testing, not to sell. The NBER memorandum of understanding is the reason the TAXSIM emulator exists; the next section covers it. Figures from the gettsim-2026 deck (September 3, 2026); check them before the talk if you quote them. +Use the numbers to show scale and testing, not to sell. The NBER memorandum of understanding is the reason the TAXSIM emulator exists; the next section covers it. Test files (4,932 YAML files under policyengine_us/tests) and contributors (133 people; the GitHub list shows 136 accounts, 3 of them bots) recounted on October 8, 2026; the other figures are from the gettsim-2026 deck (September 3, 2026). Answers Thesia’s funding question: PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. The funders on the slide are the public supporters page (policyengine.org/us/supporters): Arnold Ventures, the National Science Foundation (a POSE Phase I grant, $299,974, September 2025 to August 2026), the Nuffield Foundation, NEO Philanthropy, the Pritzker Children’s Initiative, and MyFriendBen among the organizations that build on the models. Max speaks to future funding. Answers the staffing question: the emulator is maintained by Pavel Makarchuk, David Trimmer and Max Ghenis; the US model it calls had 20 people committing in the past 12 months. Do not put headcount or turnover figures on the record beyond what Max chooses to say. -## 6. Researchers and developers build with these rules (6–7 min) +## 6. Researchers and developers build with these rules (5–6 min) - Federal users: BEA and the Joint Economic Committee - Research institutions: Brookings, AEI, Niskanen, CRFB, Georgetown, USC, the University of Michigan and UHERO @@ -64,7 +65,18 @@ Use the numbers to show scale and testing, not to sell. The NBER memorandum of u Point out the federal statistical user, BEA, because it is closest to the CE team’s work, and the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026). -## 7. How the collaboration started (7–9 min) +## 7. Why we built a TAXSIM emulator (6–7 min) + +**2021+** BEA runs PolicyEngine for tax years 2021 forward in its distribution of personal income. (BEA, Distribution of Personal Income technical document, June 2026) + +- **Microsimulation first.** PolicyEngine launched in 2021 to model taxes and benefits for any household or survey. +- **State taxes, checked against TAXSIM.** Our first state income tax and TAXSIM35 validation began in April 2022; beta coverage of every state followed in 2024. +- **NBER names a successor.** “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page +- **One model for both uses.** The emulator runs TAXSIM files on the same open rules that score reforms and benefits. + +Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). The dashboard now compares tax years 2021 to 2025. Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement. Quote only those BEA fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf. + +## 8. How the collaboration started (7–9 min) Before the emulator: record by record: 1. **Compare one record:** One household runs through both models. @@ -98,7 +110,7 @@ From testing to partnership: Ease into the partnership before the agreement slide. Validation against TAXSIM35 started in April 2022 (policyengine-us issue #704, “Validate against TAXSIM 35”). Before the emulator existed, the team compared records one at a time and turned each one into a YAML integration test in policyengine-us. The example on the slide is issue #1504 (November 15, 2022), trimmed: a 70-year-old with $36,000 of tax-exempt pension income in 2021, with SSI and WIC set to zero because they are not in TAXSIM35, and the expected values from the online TAXSIM35 (income_tax of −$1,400, the 2021 recovery rebate). The test failed because PolicyEngine counted tax-exempt pension income in AGI; PR #1505 fixed it the same day and the test stayed in the suite. Issues #1031 (Massachusetts senior circuit breaker, July 2022) and #1279 (2021 AMT, August 2022) follow the same pattern. The method then scaled up to differential testing: random samples of 100,000 tax units, about 1.6 million units across two sample sequences, went through TAXSIM35 and PolicyEngine US for tax year 2021, federal and each state. The units with the largest differences came out one at a time, and the team filled out the relevant part of the tax form by hand to decide which model was wrong. If TAXSIM35 was wrong, its code was patched; if PolicyEngine was wrong, an issue with a failing test was filed. NBER made this possible by sharing the TAXSIM35 source code. The method is written up in policyengine-us discussion #2389. The policyengine-taxsim emulator started in May 2024, and NBER filed its first issue on its public tracker on September 22, 2024, and has filed about 830 since. In 2025, NSF awarded PolicyEngine a POSE Phase I grant (award 2518372, September 2025 to August 2026), and NBER’s TAXSIM developer served as the external mentor through the I-Corps for POSE training. The September 2025 memorandum of understanding (next slide) formalized more than three years of this work. Sources: github.com/PolicyEngine/policyengine-us/issues/704, github.com/PolicyEngine/policyengine-us/discussions/2389, nsf.gov/awardsearch/show-award/?AWD_ID=2518372, policyengine.org/us/research/nsf-pose-phase-1-grant. -## 8. The NBER collaboration (9–12 min) +## 9. The NBER collaboration (9–11 min) TAXSIM at NBER: - **Developed since the 1970s:** At NBER, which still maintains it @@ -120,11 +132,11 @@ Start on the left with TAXSIM, end on the right with PolicyEngine, and use the m # The TAXSIM emulator -## 9. The TAXSIM emulator (section divider) +## 10. The TAXSIM emulator (section divider) Section divider 02. Move on after a few seconds. -## 10. A drop-in replacement for TAXSIM35 (12–15 min) +## 11. A drop-in replacement for TAXSIM35 (11–14 min) Installation (top of the slide), with macOS/Linux and Windows tabs: install the uv package manager (if you don't have it), then `uv tool install policyengine-taxsim`. @@ -134,7 +146,7 @@ Existing TAXSIM workflows carry over in every supported environment, with no add The table shows the swap that the TAXSIM site gives for six environments; the teal part is what changes. Shell, SAS and Julia only swap the command name. R swaps the package and function (library(policyenginetaxsim), then policyengine_calculate_taxes). Stata writes the file, runs the command and reads the result back. Python can call the runner on a data frame. After installation, setup_policyengine() is a one-time environment setup in R, and the R package also provides compare_with_taxsim(inputs). Ask CE staff which environment their current tax-imputation code uses. Source: https://www.policyengine.org/us/taxsim, read October 5, 2026. For Stata, SAS and Julia: if the command is not found, run uv tool dir --bin and use the full path it prints. -## 11. Where each calculation happens (15–18 min) +## 12. Where each calculation happens (14–17 min) TAXSIM input file (One row per tax unit, any tax year): @@ -155,12 +167,34 @@ TAXSIM output file (Same variables for every year): One file in and one file out. The tax year decides which engine calculates each row. - Show where the calculation happens. The emulator reads each row’s tax year: rows for 1960–2020 run on the TAXSIM35 binary bundled with the package, and rows for 2021 onward run on PolicyEngine US. Both paths write the same TAXSIM output variables, so one file can mix years. The example is one California household (married, two children aged 8 and 12, $80,000 and $50,000 in wages) run for 2019 and 2024 with policyengine-taxsim 3.0.1 and PolicyEngine US 2.25.2 on October 5, 2026: 2019 gives fiitax $10,949, siitax $4,583 and fica $19,890 through TAXSIM35; 2024 gives fiitax $8,282, siitax $3,214 and fica $19,890 through PolicyEngine. The input columns: state 5 is California in TAXSIM’s codes, mstat 2 is married filing jointly, depx is the number of dependents, and pwages and swages are the two spouses’ wages. fica is payroll tax, employee and employer shares together. Mapping details if asked: pwages and swages become each person’s employment_income, page and sage become ages, and fiitax and siitax map to income_tax and state_income_tax. State codes follow TAXSIM’s own numbering, so New Jersey is 31, while 34 (the Census FIPS code for New Jersey) means North Carolina and silently applies the wrong state’s law. A run record should note the emulator and model versions. +## 13. Versions and releases (17–19 min) + +- **One release, every tax year.** Parameters carry dated values, so there is no separate version per tax year. +- **Merged changes ship automatically.** Tests run on every pull request, and a release reaches PyPI only after its tests pass. +- **Typed changelog entries.** CI checks each pull request for an entry: added, changed, fixed, removed or breaking. +- **Support on the public tracker.** Every report and its resolution stay visible on GitHub. + +**286** PolicyEngine US releases, July 10 to October 7 · **15** Emulator releases in the same 90 days · **Every year** Each release computes every tax year it covers · **23.5 hours** Median first reply to NBER’s reports, last 90 days + +Pin both packages to reproduce a run: + +```bash +uv tool install --python 3.11 \ + policyengine-taxsim==3.0.1 \ + --with policyengine-us==2.25.2 +``` + +Needs Python 3.11 or later. Without a pin, the emulator takes the newest PolicyEngine US release. Record both versions with each run. + +The file format stays TAXSIM’s. The last breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it. + +Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers. Merged changes ship automatically, often several in one release: both repositories bump the version from the changelog fragments and publish to PyPI after the tests pass (PolicyEngine US waits for its full suite; the emulator for lint and pytest on Linux, macOS and Windows; policyengine-us push.yaml, policyengine-taxsim ci.yml). From July 10 to October 7 that was 286 PolicyEngine US releases, about three a day, and 15 emulator releases; each release is small, about two changelog entries. Tests run on every pull request, but GitHub does not block a merge that fails them; merging is a reviewer’s decision. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves on Python 3.11 (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck); on Python 3.10 it cannot resolve, and an unpinned install there falls back to an older 1.x model with the older S-corporation default. Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI does not keep every PolicyEngine US release: only five from before July 2026 remain, and 1.711.0, the emulator’s own minimum, is gone. For long-lived reproducibility, archive the installed environment or wheels with the results. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: CI checks each pull request for a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; under the current release script a breaking entry bumps the major version, and the only breaking change so far, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; for the 121 issues NBER filed in the last 90 days, the median first PolicyEngine reply came in 23.5 hours. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026. + # Live demonstration -## 12. Live demo: run the sample file (18–31 min) +## 14. Live demo: run the sample file (19–29 min) Live page: https://www.policyengine.org/us/taxsim/run @@ -168,11 +202,11 @@ Go straight into the live demo after the routing diagram and before validation. # Validation -## 13. Validation (section divider) +## 15. Validation (section divider) Section divider 03. Move on after a few seconds. -## 14. Three calculations, one arbiter (31–34 min) +## 16. Three calculations, one arbiter (29–32 min) 1. **Issue filed.** A mismatch between PolicyEngine and TAXSIM on a CPS record becomes an issue. 2. **Agentic review.** An agentic workflow explores the disagreement using both engines, the validators and the statutes. @@ -189,9 +223,9 @@ Sides: compared on every record (TAXSIM35–PolicyEngine) · an independent chec Agreement measures consistency. The law decides correctness, because two engines can share an error. -Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. +Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests, and a release reaches PyPI only after its tests pass; merging is a reviewer’s decision, so GitHub does not block a failing pull request automatically. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026). -## 15. How this process shapes the emulator (34–36 min) +## 17. How this process shapes the emulator (32–34 min) 1. **Compile.** Every resolved case is stored as an issue on the emulator’s GitHub tracker, with the input row, both results and the resolution. 2. **Lock in.** PolicyEngine fixes ship with a test case, so a resolved disagreement cannot quietly return. @@ -202,15 +236,15 @@ Walk the four steps on the left, then point to the triangle. (1) A mismatch betw Each PolicyEngine release and each TAXSIM update reruns the comparison. -Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. Do not refresh with TAXSIM builds from September 24 onward until NBER confirms them (policyengine-taxsim #1248). Source: https://www.policyengine.org/us/taxsim/dashboard +Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. If asked about #1248: Dan Feenberg opened it on September 25 about his own TAXSIM changes, closed it on September 29, and has filed issues since. The dashboard data also fixed the Alabama coding (state 1, 1,155 households, separate from Texas) in the September 24 release. Source: https://www.policyengine.org/us/taxsim/dashboard -## 16. The public validation dashboard (36–39 min) +## 18. The public validation dashboard (34–37 min) Live page: https://www.policyengine.org/us/taxsim/dashboard About 3 minutes: a quick overview, then one or two examples. Show the dashboard as the output of the process, not as a list of figures. Pick a year, change the tolerance, scroll the state table and inspect one state to show the household list; a second state with near-complete agreement shows what a resolved area looks like. The headline figures are in the notes for the previous slide if someone asks. Check the page on the morning of the talk, because it can update. Click the slide title before you press the arrow keys. If the frame does not load, open policyengine.org/us/taxsim/dashboard in a browser tab. Dashboard steps: (1) Pick a tax year, 2021 to 2025; (2) Choose a tolerance; (3) See agreement by state; (4) Inspect a state to list its households. -## 17. From a reported difference to a fix (39–41 min) +## 19. From a reported difference to a fix (37–39 min) 1. **Report.** 2. **Reproduce.** @@ -228,11 +262,11 @@ Present the change this work has driven in both engines. Do not say how quickly # Beyond TAXSIM -## 18. Beyond TAXSIM (section divider) +## 20. Beyond TAXSIM (section divider) Section divider 04. Move on after a few seconds. -## 19. Additional inputs beyond TAXSIM (41–43 min) +## 21. Additional inputs beyond TAXSIM (39–41 min) | Area | TAXSIM input | Limit | PolicyEngine adds | |---|---|---|---| @@ -246,7 +280,7 @@ Section divider 04. Move on after a few seconds. Explain how a TAXSIM input row becomes a PolicyEngine household, and what the format cannot carry. Business income: the emulator maps pbusinc and sbusinc (with psemp and ssemp) to self-employment income, pprofinc and sprofinc to income from a specified service trade or business, and scorp to partnership and S-corporation income. TAXSIM’s own QBI deduction is a flat 20% with the service-business phase-in, capped by taxable income, with no W-2 wage or property test. PolicyEngine applies those limits, so without W-2 wages the deduction phases out above the threshold; the emulator’s --assume-w2-wages option reproduces TAXSIM’s simpler rule (available on the policyengine and compare commands, not on the default drop-in command). Itemized deductions: TAXSIM’s mortgage and otheritem are aggregates; the emulator sums them into deductible mortgage interest, which has no floor or cap, to match TAXSIM, because charity and medical would bring AGI caps and floors that TAXSIM does not apply. Property tax maps to real estate taxes. State and local taxes: PolicyEngine computes the state income tax for the SALT deduction; TAXSIM input has no county or city, so Maryland county tax is set to zero and city taxes such as New York City’s do not apply. Do not present the 2025 SALT cap as a difference: TAXSIM also applies it. Household: TAXSIM gives the two adults’ ages (page, sage), the number of dependents (depx) and each dependent’s age (age1 to ageN); filing status comes from mstat. Dependents have no disability or student status. PolicyEngine’s is_disabled input feeds SNAP, SSI and many state credits, and is_full_time_college_student sets the student rules for the EITC and dependent credits (the EITC’s own disability test uses is_permanently_and_totally_disabled). Unearned income: TAXSIM reports interest (intrec), dividends, capital gains, pensions and Social Security (gssi) for the tax unit, and the emulator divides them between spouses for joint filers (evenly, or to the older spouse across a state’s age rule for pensions and Social Security). The fields also carry no type: pensions include IRA withdrawals, and gssi does not separate retirement, disability and survivor benefits. taxable_ira_distributions and social_security_disability add those types; taxable_interest_income and qualified_dividend_income are not on the slide, because the emulator already fills them from intrec and dividends. Sources: policyengine-taxsim 3.0.1 config/variable_mappings.yaml and runners/policyengine_runner.py; TAXSIM source law87.for. Each card ends with the PolicyEngine US input variables that remove the limit, which a survey or an imputation can supply: w2_wages_from_qualified_business and unadjusted_basis_qualified_property apply the wage and property limits of the qualified business income deduction; charitable_cash_donations and other_medical_expenses give each deduction its own adjusted gross income limit or floor; county_fips places the household, which turns on city and county income taxes such as New York City’s and the Indiana county taxes; is_disabled and is_full_time_college_student give dependents the status that credits and benefits use; taxable_ira_distributions and social_security_disability add the income types TAXSIM does not carry. Related input variables not on the slide: business_is_sstb, qualified_reit_and_ptp_income, charitable_non_cash_donations, home_mortgage_interest, is_permanently_and_totally_disabled, is_incapable_of_self_care, taxable_401k_distributions, social_security_survivors and tax_exempt_interest_income. Variable names checked in PolicyEngine US source on October 7, 2026. -## 20. CE survey variables mapped to PolicyEngine inputs (43–45 min) +## 22. CE survey variables mapped to PolicyEngine inputs (41–43 min) | CE collects | PolicyEngine input | Calculations it supports | TAXSIM | |---|---|---|---| @@ -262,7 +296,7 @@ CE variables from the 2024 Interview public-use microdata dictionary; PolicyEngi Show which CE fields could feed PolicyEngine inputs that TAXSIM’s format cannot carry. All CE variables are in the 2024 Interview PUMD dictionary (FMLI unless noted; IN_COLL and SSIX are on MEMI). Medical: HEALTHCQ is the sum of HLTHINCQ, MEDSRVCQ, PREDRGCQ and MEDSUPCQ; TAXSIM takes only deductible medical expenses, already above the AGI floor, in its mortgage total, so the CE applied the floor itself. PolicyEngine applies the floor and also uses medical costs for the SNAP excess medical deduction for elderly and disabled members. Charity: CASHCOCQ also includes alimony, child support, gifts and political giving, so use the charity codes in the CNT detail file. Tuition: EDUCACQ includes K-12 tuition; college tuition is UCC 670110. College enrollment: IN_COLL is 1 full time, 2 part time, 3 not at all. TAXSIM’s documentation instead asks users to code students aged 20 to 23 as 19. Car loans: VEHFINCQ is vehicle finance charges; the 2025 deduction also requires final assembly in the United States, which the CE does not record. Utilities: UTILCQ is the sum of natural gas, electricity, fuels, telephone and water; TAXSIM has no utility field, and PolicyEngine uses utility costs for the SNAP standard utility allowance and shelter deduction. Rent is not listed, because TAXSIM already takes rentpaid. Benefits: JFS_AMT is the annual value of SNAP (with FS_MTHI months), SSIX is SSI per member, and WELFAREX is public assistance; TAXSIM takes one transfers total, used for state rebates. Quarterly spending variables (CQ and PQ) cover a three-month reference period; income variables cover 12 months. Context for this audience: from the second quarter of 2013 through the 2023 data, CE published federal and state tax estimates from TAXSIM; the 2024 data has no tax or after-tax income estimates, because the model was not updated for the 2024 tax year (CE PUMD Getting Started Guide). The emulator covers tax years 2021 onward. Sources: https://www.bls.gov/cex/pumd/ce-pumd-interview-diary-dictionary.xlsx, https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://taxsim.nber.org/taxsim35/ and PolicyEngine US source, October 7, 2026. -## 21. What PolicyEngine calculates beyond TAXSIM (45–46 min) +## 23. What PolicyEngine calculates beyond TAXSIM (43–44 min) | Area | In the emulator | PolicyEngine calculates | |---|---|---| @@ -275,7 +309,7 @@ Show which CE fields could feed PolicyEngine inputs that TAXSIM’s format canno Show what PolicyEngine calculates that TAXSIM’s output does not carry, and how the emulator handles each item so that its results stay comparable with TAXSIM. Benefit programs: PolicyEngine calculates SNAP, SSI, TANF, WIC and the state SSI supplements; the emulator sets them to zero, because TAXSIM has no inputs for them and some state taxes count cash assistance as income (for example, the base of the Massachusetts senior circuit breaker credit; policyengine-taxsim issue #1031). Health coverage: Medicaid, CHIP and the ACA premium tax credit are separate PolicyEngine variables; the premium tax credit is not part of PolicyEngine’s income tax, and the emulator does not report any of them. Additional state tax credits: the four on the slide need inputs TAXSIM lacks, and TAXSIM does not model the first two at all. The Idaho aged or disabled credit is for a filer who supports a family member aged 65 or older or a person with a disability; TAXSIM’s Idaho routine has the child tax, grocery, investment and political contribution credits, but not this one. The Arkansas credit gives $500 for each dependent with a disability (Form AR1000F); TAXSIM’s Arkansas personal credit counts filers, dependents and people aged 65 or older, with no disability input. The New York college tuition credit needs tuition paid, and the Colorado care worker credit needs care worker status. Other state credits that need inputs TAXSIM does not have: the Minnesota K-12 education credit (tuition), the 529 plan credits in Indiana, Oregon, Utah and Vermont, the Louisiana and Nebraska school readiness credits, the Connecticut and Nebraska stillborn credits and the Vermont veteran tax credit. If asked about Maryland: TAXSIM models the Maryland child tax credit from 2023 for children under 6, but not its extension to children with a disability up to age 16, and not the 2021 and 2022 credit, which was only for children with a disability. Renters’ credits: TAXSIM models most renters’ and property tax credits from rentpaid (for example California, Minnesota and Vermont, and the homestead or property tax credits in Arizona, Michigan, Wisconsin, Missouri, New Jersey, Maine, New York and DC), so they appear in both engines and in the comparison. PolicyEngine adds detail that needs other inputs, such as disability status in Minnesota’s renter’s credit, county income limits and shared rent in Vermont’s renter credit, and heat included in rent for Michigan’s home heating credit. Sources for the TAXSIM side: the state routines in the TAXSIM source (for example 05ca.for, 24mn.for and 46vt.for). Sources: TAXSIM source 13id.for, 04ar.for and 21md.for; PolicyEngine US source, October 8, 2026. Federal provisions: the deductions for tips, overtime and car-loan interest, the American Opportunity and Lifetime Learning credits (tuition) and the saver’s credit (retirement contributions) need inputs that TAXSIM does not have, so they are zero in emulator runs; PolicyEngine calculates them when a data source supplies the inputs. Conventions kept from TAXSIM, if asked: fiitax includes the net investment income tax but not the Additional Medicare Tax, which is reported with payroll taxes; fica includes both the employee and employer shares; one-time state rebates are in siitax and also reported as srebate; frate and srate come from a second run with $100 more wages. Sources: policyengine-taxsim 3.0.1 runners/policyengine_runner.py, core/state_output_resolver.py and config/variable_mappings.yaml; PolicyEngine US source, October 7, 2026. -## 22. Imputing a distribution of missing inputs (46–49 min) +## 24. Imputing a distribution of missing inputs (44–46 min) Sources fused into PolicyEngine’s US microdata: - **CPS** (Current Population Survey): The spine: demographics, income, labor force. @@ -292,7 +326,7 @@ Sources fused into PolicyEngine’s US microdata: A donor survey observes the variable of interest and predictors shared with the recipient survey. A conditional distribution permits households with similar observed characteristics to have different imputed values. That can matter around tax-benefit thresholds. Multiple draws can reveal sensitivity, but they do not automatically solve model misspecification or preserve every joint relationship. The prior deck names CPS, ACS, SCF, SIPP and tax microdata. This slide does not claim a CE implementation exists. Source: local IARIW 2026 ImputationSlide.tsx. -## 23. What counts as household resources? (49–51 min) +## 25. What counts as household resources? (46–48 min) One California household in 2025 (a single parent, children aged 4 and 7, $25,000 in wages), four resource concepts. @@ -305,9 +339,9 @@ The resource concept, not the calculator, decides whether $25,000 of earnings be PolicyEngine US 2.25.2, run October 5, 2026. Benefits assume take-up; Medi-Cal is valued at average cost per enrollee. -Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. +Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 10 states, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026). -## 24. Validation of benefit imputations (51–53 min) +## 26. Validation of benefit imputations (48–50 min) **≈40%** of SNAP recipients are missing from CPS reports, measured against linked administrative records. (Meyer and Mittag, NBER Working Paper 21676) @@ -318,13 +352,51 @@ Each bar adds one component for one California household: a single parent with c Meyer and Mittag link the CPS to administrative records and find that the survey misses about 40 percent of SNAP recipients (NBER Working Paper 21676). This is why PolicyEngine computes benefits from program rules and calibrates weights to administrative totals instead of relying on reported receipt. Explain that fitting a target is not independent validation against that target. CE weight changes would be a separate methodological decision, not a prerequisite for the initial tax comparison. Source: the cpid-webinar-2026 deck’s baseline slide and policyengine-slides/slideshows/iariw-2026/slides/CalibrationSlide.tsx. -# A possible CE pilot +# What’s next -## 25. A possible CE pilot (section divider) +## 27. What’s next (section divider) Section divider 05. Move on after a few seconds. -## 26. Where this could fit in CE research (53–55 min) +## 28. When the 2026 tax rules will be ready (50–52 min) + +**44** Jurisdictions updated for 2025: 41 income-tax states, DC, NH and WA · **47** Pull requests from 5 contributors · **11 weeks** First pull request to last merge, Dec 3 – Feb 18 · **30** States finished in the last week, worked in parallel + +**2025 tax year (what happened):** Dec 3 – Feb 10: one state at a time: Full model reviews, adding missing programs and fixing errors: 14 states done; Feb 11–18: 30 states in parallel: all 44 done; Mar – May: follow-up fixes: Federal non-conformity in DC, Idaho, Maine and South Carolina. + +**2026 tax year (plan):** Prepare: Set up agents to draft each state’s update from its forms; Update as forms are published: Run states in parallel as each releases its 2026 forms and instructions; Finish and check: Late states, then rerun the TAXSIM comparison for 2026; Done by March 31, 2027: Every state complete, with March as a buffer. + +**Major law changes in 2025:** Iowa: flat 3.8% rate; New Hampshire: interest and dividends tax repealed; Maryland: new top brackets, capital gains surtax; Wisconsin: wider 4.4% bracket, $1,200 exemption. + +**Added or corrected in the model:** New Jersey: ANCHOR and Stay NJ property tax relief; Minnesota: K-12 education credit and subtraction; Indiana: county tax rates; California: alternative minimum tax thresholds. + +Commitment: every state’s 2026 income tax rules complete by March 31, 2027. + +BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule. + +## 29. Axiom: our next-generation rules engine (52–54 min) + +Axiom encodes tax and benefit rules from the law, with a test for every federal rule module. We are moving PolicyEngine onto it in steps. + +**Today: PolicyEngine US runs the emulator.** Tax years 2021 onward compute on PolicyEngine US; The 2026 rules ship there by March 31, 2027; Axiom publishes open comparisons with PolicyEngine and TAXSIM. + +**Planned: Axiom on the backend.** PolicyEngine’s Python interface wraps Axiom, as it already does for a Belgium pilot; The TAXSIM emulator can run on Axiom; New programs arrive as encodings of the law, with tests. + +**Throughout: Backwards compatible.** TAXSIM-format files in and out; The same command-line and Python calls; We keep powering TAXSIM for as long as it is needed. + +We keep pushing the rules further without breaking the files and code that depend on them. + +Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) on an MIT-licensed Rust engine. It does not yet compute a complete federal return. + +Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. Shipped evidence for the wrapper approach: policyengine.py already runs one country on Axiom, a Belgium pilot for worker social contributions and personal income tax (policyengine.py PR #448, tests/test_be_axiom_pilot.py); a US model on Axiom has no code yet. Axiom’s validation suite already turns its cases into TAXSIM rows and runs both TAXSIM-35 and the emulator on them (axiom-oracles adapters/taxsim). On the emulator, a CI test already pins the command-line entry point (tests/test_cli_entry_point.py). The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here. + +## 30. Live: the child and dependent care credit in Axiom (54–56 min) + +Live page: https://axiom.org/us/statute/26/21 + +A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). Click Skip on the three-step tour if it appears. Steps: (1) point to the statute text and the encodings rail; (2) click “graph ↗” and open the Run tab, ideally in a full browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21), because the run form needs width; (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. + +## 31. Where this could fit in CE research (56–58 min) **CE tax-unit records** (An agreed set of inputs for one year.) → **CE’s TAXSIM estimates** (Published for 2013–2023 data.) and **PolicyEngine TAXSIM emulator** (The same file, no format changes.) → **Compare** (Household results and weighted summaries.) → **Review** (Explain differences before expanding the scope.) @@ -334,7 +406,7 @@ Keep CE definitions and weights fixed in the first comparison. This is a proposed integration path, not a tested CE implementation. CE published federal and state income tax estimates from NBER’s TAXSIM from the second quarter of 2013 through the 2023 data (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). The 2024 data has no tax or after-tax income estimates: BLS says the external tax model was not updated for the 2024 tax year, and it keeps a tax unit identifier on the microdata so users can produce their own tax estimates. A comparison therefore needs a year with CE TAXSIM estimates, 2023 or earlier; for the 2024 data onward, the emulator would produce estimates where CE now has none. The same TAXSIM input file can go to both engines. The slide gives only the years; mention the 2024 gap only if asked. Sources: https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://www.bls.gov/cex/csxfaqs.htm (question 42) and https://www.bls.gov/cex/notices/2025/ce-after-tax.htm. Start with the core outputs: fiitax, siitax, fica, v22 (child tax credit), v25 (EITC) and frate. Ask staff which parts of their current workflow could supply the comparison inputs. Preserve existing CE definitions and weights in the initial comparison. -## 27. A manageable CE pilot (55–58 min) +## 32. A manageable CE pilot (58–60 min) Four steps, each with a clear output. @@ -349,23 +421,7 @@ Four steps, each with a clear output. Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. -## 28. When the 2026 tax rules will be ready (58–60 min) - -**44** Jurisdictions updated for 2025: 41 income-tax states, DC, NH and WA · **47** Pull requests from 5 contributors · **11 weeks** First pull request to last merge, Dec 3 – Feb 18 · **30** States finished in the last week, worked in parallel - -**2025 tax year (what happened):** Dec 3 – Feb 10: one state at a time: Full model reviews, adding missing programs and fixing errors: 14 states done; Feb 11–18: 30 states in parallel: all 44 done; Mar – May: follow-up fixes: Federal non-conformity in DC, Idaho, Maine and South Carolina. - -**2026 tax year (plan):** Prepare: Set up agents to draft each state’s update from its forms; Update as forms are published: Run states in parallel as each releases its 2026 forms and instructions; Finish and check: Late states, then rerun the TAXSIM comparison for 2026; Done by March 31, 2027: Every state complete, with March as a buffer. - -**Major law changes in 2025:** Iowa: flat 3.8% rate; New Hampshire: interest and dividends tax repealed; Maryland: new top brackets, capital gains surtax; Wisconsin: wider 4.4% bracket, $1,200 exemption. - -**Added or corrected in the model:** New Jersey: ANCHOR and Stay NJ property tax relief; Minnesota: K-12 education credit and subtraction; Indiana: county tax rates; California: alternative minimum tax thresholds. - -Commitment: every state’s 2026 income tax rules complete by March 31, 2027. - -BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. - -## 29. Q&A and discussion (60–90 min) +## 33. Q&A and discussion (60–90 min) - Which outcomes and years would be most useful? - Which input assumptions create the most uncertainty? @@ -379,7 +435,7 @@ BLS will want to know when each year’s rules are ready. Last year, the 2025 st Use the separate 30-minute discussion for questions on the methods and potential CE collaboration. The links on the slide open the TAXSIM site, the web runner, the validation dashboard and the source code. -## 30. Thank you (closing slide) +## 34. Thank you (closing slide) - Max Ghenis · max@policyengine.org - Pavel Makarchuk · pavel@policyengine.org diff --git a/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md b/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md index e4ba057..841e195 100644 --- a/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md +++ b/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md @@ -1,8 +1,8 @@ # Validation section: speaker script (David) -Slides 14–17, 10 minutes in total. Spoken pace is about 130 words a minute; the rest of the time is for pointing at the slide and clicking through the live dashboard. Timings: validation steps and triangle 3 min, shaping the emulator 2 min, dashboard 3 min, progress and recent issues 2 min. +Slides 16–19, 10 minutes in total. Spoken pace is about 130 words a minute; the rest of the time is for pointing at the slide and clicking through the live dashboard. Timings: validation steps and triangle 3 min, shaping the emulator 2 min, dashboard 3 min, progress and recent issues 2 min. -## Slide 14. Three calculations, one arbiter (29–32 min) +## Slide 16. Three calculations, one arbiter (29–32 min) Validation for us isn't a single benchmark number. It's a process we run on every disagreement, and it has four steps. @@ -18,7 +18,7 @@ Validation for us isn't a single benchmark number. It's a process we run on ever *Point to step 4.* Once the fix ships, we rerun the record to confirm the disagreement is gone. -## Slide 15. How this process shapes the emulator (32–34 min) +## Slide 17. How this process shapes the emulator (32–34 min) A resolved case doesn't end with the fix. @@ -32,7 +32,7 @@ A resolved case doesn't end with the fix. *Point to the line at the bottom.* The loop never closes for good. Every PolicyEngine release and every TAXSIM update reruns the comparison. -## Slide 16. The public validation dashboard (34–37 min, live) +## Slide 18. The public validation dashboard (34–37 min, live) This is where that comparison lives, and it's public. A quick overview, then one or two examples. @@ -50,7 +50,7 @@ One caution: these numbers move whenever either engine changes. That's the point *If asked for headline figures:* for 2023, 89.8% of households agree on federal tax and 94.9% on state tax, within 1% of gross income (data update of September 23, 2026). Choose the two example states on the morning of the talk, after checking that the page loads. -## Slide 17. From a reported difference to a fix (37–39 min) +## Slide 19. From a reported difference to a fix (37–39 min) Here's where we are. *Point to the figures.* Since July 2024 there have been more than 1,100 issues on the emulator's public tracker, and more than 1,000 are resolved. Differences run both ways: we've sent NBER more than 150 questions about TAXSIM's own rules, and NBER has confirmed more than 100 TAXSIM corrections on the tracker. That last number is a floor. TAXSIM's working builds aren't public, so we only count the corrections NBER mentions in a comment. diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 64b0737..8be40cc 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -1157,6 +1157,21 @@ export const blsSlides: BlsSlideContent[] = [ "footnote": "Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) on an MIT-licensed Rust engine. It does not yet compute a complete federal return." } }, + { + "id": "axiom-demo", + "title": "Live: the child and dependent care credit in Axiom", + "body": [], + "minutes": 2, + "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). Click Skip on the three-step tour if it appears. Steps: (1) point to the statute text and the encodings rail; (2) click “graph ↗” and open the Run tab, ideally in a full browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21), because the run form needs width; (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", + "headerLink": { + "label": "axiom.org/us/statute/26/21", + "url": "https://axiom.org/us/statute/26/21" + }, + "embed": { + "url": "https://axiom.org/us/statute/26/21", + "footnote": "Run tab: AGI $40,000, $3,000 of care for a child aged 4, $5,000 of tax before the credit. The engine returns a 37% rate and a $1,110 credit. Preview results, not yet certified." + } + }, { "id": "ce-fit", "title": "Where this could fit in CE research", From 901ed4e40c827d054e260e328eb267861b8c062d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:31:44 -0400 Subject: [PATCH 05/18] BLS deck: name the open AI skills in the CE pilot slide Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 6 +++--- slideshows/bls-taxsim-2026/content.ts | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index ebe43f0..d86dc6d 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -34,7 +34,7 @@ Introduce the speakers and thank the BLS hosts and the CE team. - What’s next — The 2026 tax rules, Axiom as our next-generation rules engine, and a possible CE pilot. - Q&A and discussion — Questions on the methods, implementation, and opportunities for collaboration. -The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer. +The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer. ## 3. Introduction and context (section divider) @@ -417,9 +417,9 @@ Four steps, each with a clear output. **CE would provide:** One year of tax-unit records in the TAXSIM input format; Its published TAXSIM estimates and the survey weights; Staff time to review the discrepancy log. -**PolicyEngine would provide:** The open-source emulator, which installs and runs inside BLS; Runs pinned to emulator and model versions; A diagnosis of each difference, then a benefit extension proposal. +**PolicyEngine would provide:** The open-source emulator, which installs and runs inside BLS; Runs pinned to emulator and model versions; A diagnosis of each difference, then a benefit extension proposal; Open AI skills that run PolicyEngine from Claude Code or Codex. -Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. +Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. On the AI skills, which speak to the CE program’s limited implementation resources: PolicyEngine’s skills are open source (MIT) in PolicyEngine/policyengine-skills, published for Claude Code as the policyengine-claude plugin (/plugin marketplace add PolicyEngine/policyengine-claude) with a Codex install script and an MCP server; they include household calculations and microsimulation runs on the same rules. There is no TAXSIM-specific skill yet, so do not say it maps CE files out of the box; mapping CE fields to TAXSIM inputs would be pilot work. Confidential CE records stay under BLS’s own rules for AI tools; the skills are useful with public-use microdata and for writing the comparison code. ## 33. Q&A and discussion (60–90 min) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 8be40cc..0a2d781 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -217,7 +217,7 @@ export const blsSlides: BlsSlideContent[] = [ "Questions on the methods, implementation, and opportunities for collaboration." ], "minutes": 1, - "notes": "The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer." + "notes": "The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer." }, { "id": "section-intro", @@ -1213,7 +1213,7 @@ export const blsSlides: BlsSlideContent[] = [ "Scope one benefit extension after reviewing the tax results" ], "minutes": 2, - "notes": "Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known.", + "notes": "Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. On the AI skills, which speak to the CE program’s limited implementation resources: PolicyEngine’s skills are open source (MIT) in PolicyEngine/policyengine-skills, published for Claude Code as the policyengine-claude plugin (/plugin marketplace add PolicyEngine/policyengine-claude) with a Codex install script and an MCP server; they include household calculations and microsimulation runs on the same rules. There is no TAXSIM-specific skill yet, so do not say it maps CE files out of the box; mapping CE fields to TAXSIM inputs would be pilot work. Confidential CE records stay under BLS’s own rules for AI tools; the skills are useful with public-use microdata and for writing the comparison code.", "process": { "intro": "Four steps, each with a clear output.", "steps": [ @@ -1236,7 +1236,8 @@ export const blsSlides: BlsSlideContent[] = [ "items": [ "The open-source emulator, which installs and runs inside BLS", "Runs pinned to emulator and model versions", - "A diagnosis of each difference, then a benefit extension proposal" + "A diagnosis of each difference, then a benefit extension proposal", + "Open AI skills that run PolicyEngine from Claude Code or Codex" ] } ] From 5b38bea21e3a3f4f8ecd17713a4d244637e6c831 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:36:49 -0400 Subject: [PATCH 06/18] BLS deck: broaden the title for BEA and Census attendees; shorten the Axiom demo title Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 4 ++-- slideshows/bls-taxsim-2026/content.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index d86dc6d..602cc58 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -17,7 +17,7 @@ Based on the September 2025 CRS TAXSIM section, PWBM 2026 validation material, I # Introduction and context -## 1. Tax and benefit imputation for the CE (0–1 min) +## 1. Tax and benefit imputation for federal surveys (0–1 min) - PolicyEngine’s TAXSIM emulator and beyond - Max Ghenis, Pavel Makarchuk and David Trimmer @@ -390,7 +390,7 @@ Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. Shipped evidence for the wrapper approach: policyengine.py already runs one country on Axiom, a Belgium pilot for worker social contributions and personal income tax (policyengine.py PR #448, tests/test_be_axiom_pilot.py); a US model on Axiom has no code yet. Axiom’s validation suite already turns its cases into TAXSIM rows and runs both TAXSIM-35 and the emulator on them (axiom-oracles adapters/taxsim). On the emulator, a CI test already pins the command-line entry point (tests/test_cli_entry_point.py). The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here. -## 30. Live: the child and dependent care credit in Axiom (54–56 min) +## 30. The child care credit, live in Axiom (54–56 min) Live page: https://axiom.org/us/statute/26/21 diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 0a2d781..0f81920 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -187,7 +187,7 @@ export const blsSlides: BlsSlideContent[] = [ // Introduction and context: 12 minutes { "id": "cover", - "title": "Tax and benefit imputation for the CE", + "title": "Tax and benefit imputation for federal surveys", "body": [ "PolicyEngine’s TAXSIM emulator and beyond", "Max Ghenis, Pavel Makarchuk and David Trimmer", @@ -1159,7 +1159,7 @@ export const blsSlides: BlsSlideContent[] = [ }, { "id": "axiom-demo", - "title": "Live: the child and dependent care credit in Axiom", + "title": "The child care credit, live in Axiom", "body": [], "minutes": 2, "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). Click Skip on the three-step tour if it appears. Steps: (1) point to the statute text and the encodings rail; (2) click “graph ↗” and open the Run tab, ideally in a full browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21), because the run form needs width; (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", From e09ef3937241d7ab3592b84bf01920d1a27300a1 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:38:43 -0400 Subject: [PATCH 07/18] BLS deck: embed the Axiom reader in embed mode; prepare the Run view in its own tab Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 3 ++- slideshows/bls-taxsim-2026/content.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 602cc58..754cd53 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -11,6 +11,7 @@ Based on the September 2025 CRS TAXSIM section, PWBM 2026 validation material, I - The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 17 notes and the slide 18 footnote if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. - The validation section (slides 16–19, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. - Open policyengine.org/us/taxsim/run once before the talk: its first load took 9 seconds on October 8. +- Open slide 30 once before the talk: the embedded Axiom page took about 20 seconds to render the first time on October 8. - Rehearse the Axiom run on slide 30 in a separate browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21, Run tab) and leave that tab open: answers are lost on reload. The slide notes have the household and the fallbacks. - Thesia Garner’s questions are answered in the notes of the slides that cover them; the agenda notes (slide 2) map each question to its slide. - Confirm the CE-specific benefit methodology and pilot scope. These sections describe proposed research choices rather than a completed CE implementation. @@ -394,7 +395,7 @@ Answers Thesia’s road-map question. Frame Axiom as our next-generation rules e Live page: https://axiom.org/us/statute/26/21 -A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). Click Skip on the three-step tour if it appears. Steps: (1) point to the statute text and the encodings rail; (2) click “graph ↗” and open the Run tab, ideally in a full browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21), because the run form needs width; (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. +A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. ## 31. Where this could fit in CE research (56–58 min) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 0f81920..245e3bc 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -1162,13 +1162,13 @@ export const blsSlides: BlsSlideContent[] = [ "title": "The child care credit, live in Axiom", "body": [], "minutes": 2, - "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). Click Skip on the three-step tour if it appears. Steps: (1) point to the statute text and the encodings rail; (2) click “graph ↗” and open the Run tab, ideally in a full browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21), because the run form needs width; (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", + "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", "headerLink": { "label": "axiom.org/us/statute/26/21", "url": "https://axiom.org/us/statute/26/21" }, "embed": { - "url": "https://axiom.org/us/statute/26/21", + "url": "https://axiom.org/us/statute/26/21?embed=1", "footnote": "Run tab: AGI $40,000, $3,000 of care for a child aged 4, $5,000 of tax before the credit. The engine returns a 37% rate and a $1,110 credit. Preview results, not yet certified." } }, From c7bf10d864f99a3bb343250a38aac1e11a1026f3 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 11:41:15 -0400 Subject: [PATCH 08/18] BLS deck: zoom the releases and PolicyEngine-today content on short screens At 1280x720 the releases cards and the funding strip ran under the footer. Same approach as DropInTabs: CSS zoom below 820px and 740px of height. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx | 2 ++ slideshows/bls-taxsim-2026/slides/Releases.tsx | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index 1f6a2f3..402bb88 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -110,6 +110,7 @@ export function PolicyEngineTodaySlide() { PolicyEngine today +

Free, open-source software to compute the effect of public policy. US and UK tax-benefit models, with public code since June 2021 and 133 contributors to the US model. @@ -148,6 +149,7 @@ export function PolicyEngineTodaySlide() { Children’s Initiative, and support from organizations that build on the models, such as MyFriendBen.

+
); } diff --git a/slideshows/bls-taxsim-2026/slides/Releases.tsx b/slideshows/bls-taxsim-2026/slides/Releases.tsx index 22b9c98..caecfb6 100644 --- a/slideshows/bls-taxsim-2026/slides/Releases.tsx +++ b/slideshows/bls-taxsim-2026/slides/Releases.tsx @@ -5,11 +5,12 @@ type Releases = NonNullable; /** * Versions and releases: headline release figures, the command that pins a run - * to exact versions, and what ships with every release. + * to exact versions, and what ships with every release. On short screens the + * block zooms out, as DropInTabs does, so it clears the footer at 1280x720. */ export default function ReleasesSlide({ releases }: { releases: Releases }) { return ( -
+
Date: Thu, 8 Oct 2026 11:43:54 -0400 Subject: [PATCH 09/18] BLS deck: non-overlapping height ranges for the short-screen zoom Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx | 2 +- slideshows/bls-taxsim-2026/slides/Releases.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index 402bb88..ab1f9f5 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -110,7 +110,7 @@ export function PolicyEngineTodaySlide() { PolicyEngine today -
+

Free, open-source software to compute the effect of public policy. US and UK tax-benefit models, with public code since June 2021 and 133 contributors to the US model. diff --git a/slideshows/bls-taxsim-2026/slides/Releases.tsx b/slideshows/bls-taxsim-2026/slides/Releases.tsx index caecfb6..4cac7b3 100644 --- a/slideshows/bls-taxsim-2026/slides/Releases.tsx +++ b/slideshows/bls-taxsim-2026/slides/Releases.tsx @@ -10,7 +10,7 @@ type Releases = NonNullable; */ export default function ReleasesSlide({ releases }: { releases: Releases }) { return ( -

+
Date: Thu, 8 Oct 2026 11:45:35 -0400 Subject: [PATCH 10/18] BLS deck: correct the Axiom walk-through notes after verification The 2021 expansion sits behind an input flag and 2022-2025 law is not encoded; EITC and the other sections do not run live yet (the error varies); the first API call can take about 5 seconds. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 2 +- slideshows/bls-taxsim-2026/content.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 754cd53..5f053c8 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -395,7 +395,7 @@ Answers Thesia’s road-map question. Frame Axiom as our next-generation rules e Live page: https://axiom.org/us/statute/26/21 -A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. +A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. ## 31. Where this could fit in CE research (56–58 min) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 245e3bc..3ce6ce4 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -1162,7 +1162,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "The child care credit, live in Axiom", "body": [], "minutes": 2, - "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the 2026 parameters as amended in 2025 (50% maximum, 35% then 20% floors); the 2021-only rules sit in the same encoding as separate parameters. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live today (they fail to compile against the current engine), which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab before the talk and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", + "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", "headerLink": { "label": "axiom.org/us/statute/26/21", "url": "https://axiom.org/us/statute/26/21" From ca6a9fa0f05dd4180cfec8ef31141831994e75f9 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 12:14:29 -0400 Subject: [PATCH 11/18] BLS deck: speaker blocks with three handoffs, presenter on each divider, review fixes Order now follows the speakers: Max (01 introduction), Pavel (02 emulator and demo, 03 beyond TAXSIM), David (04 validation, now ending on the 2026 rules slide he built), Max (05 benefit imputation, a new section, and 06 what's next). Each section divider names its presenter. Agenda, notes, README, SPEAKER-NOTES and VALIDATION-SCRIPT follow the 35-slide order. Review fixes: 'TAXSIM's author on a successor' replaces 'NBER names a successor'; 'could run on Axiom'; the funding strip says grants to date with NSF POSE Phase I dated 2025-26; the pin note says to archive the environment; 'about 1 day' median reply; open-source AI skills; 9 states and DC for heating assistance; deck description no longer CE-only. Layout: short-screen zoom for the Axiom plan and the validation triangle, the 2026 timeline's change panels hide below 960px of height (their content is in the notes), and the cover title clears the logo at 720px. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/README.md | 28 +- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 196 ++++---- .../bls-taxsim-2026/VALIDATION-SCRIPT.md | 10 +- slideshows/bls-taxsim-2026/config.ts | 2 +- slideshows/bls-taxsim-2026/content.ts | 420 +++++++++--------- .../bls-taxsim-2026/slides/AxiomPlan.tsx | 2 +- .../bls-taxsim-2026/slides/PEIntroSlides.tsx | 8 +- .../bls-taxsim-2026/slides/SectionDivider.tsx | 5 +- .../bls-taxsim-2026/slides/UpdateTimeline.tsx | 2 +- slideshows/bls-taxsim-2026/slides/Visuals.tsx | 2 +- slideshows/bls-taxsim-2026/slides/index.tsx | 3 +- 11 files changed, 345 insertions(+), 333 deletions(-) diff --git a/slideshows/bls-taxsim-2026/README.md b/slideshows/bls-taxsim-2026/README.md index 138cd3d..02624d7 100644 --- a/slideshows/bls-taxsim-2026/README.md +++ b/slideshows/bls-taxsim-2026/README.md @@ -2,29 +2,29 @@ Local route: `/slides/bls-taxsim-2026`. -34 slides, including 5 section dividers and a closing slide, with 60 minutes of presentation time (no slack) and a dedicated final slide for 30 minutes of Q&A. +35 slides, including 6 section dividers and a closing slide, with 60 minutes of presentation time (no slack) and a dedicated final slide for 30 minutes of Q&A. -Agenda: introduction (11 min), the emulator, including versions and releases (8 min), live demonstration (10 min), validation (10 min), beyond TAXSIM (11 min), what’s next: the 2026 tax rules, Axiom with a live walk-through, and a possible CE pilot (10 min), Q&A (30 min). Thesia Garner’s question list (October 7) is answered in the notes of the slides that cover each question; the agenda slide’s notes map them. +Agenda and presenters: introduction (Max Ghenis, 11 min); the TAXSIM emulator with versions and releases and the live demo (Pavel Makarchuk, 18 min); beyond TAXSIM (Pavel Makarchuk, 5 min); validation and the 2026 tax rules (David Trimmer, 12 min); benefit imputation (Max Ghenis, 6 min); what’s next: Axiom with a live walk-through, and a possible CE pilot (Max Ghenis, 8 min); Q&A (30 min). Speakers change only at section dividers. Thesia Garner’s question list (October 7) is answered in the notes of the slides that cover each question; the agenda slide’s notes map them. - `content.ts`: slide copy, timing, sources, speaker notes, screenshots and live embeds. - `slides/index.tsx`: React rendering with the repository’s shared slide components. The cover uses the shared `CoverSlide` with speaker headshots. - `slides/PEIntroSlides.tsx`: PolicyEngine introduction (slides 4–6), adapted from the cpid-webinar-2026 and gettsim-2026 decks. -- `slides/SectionDivider.tsx`: section openers on the cover gradient, with the section number and title (slides 3, 10, 15, 20 and 27). +- `slides/SectionDivider.tsx`: section openers on the cover gradient, with the section number and title (slides 3, 10, 15, 19, 25 and 29), each naming its presenter, which is where the speakers hand off. - `slides/Origins.tsx`: how the collaboration started: the record-by-record testing before the emulator, a real YAML test from policyengine-us issue #1504 beside it, and the milestones up to the agreement (slide 8). -- `slides/InputMapping.tsx`: story cards by general area, aligned across each row with CSS subgrid. Slide 21: the TAXSIM variables, the limit of the TAXSIM format, and the PolicyEngine variables that remove it. Slide 23: what PolicyEngine calculates beyond TAXSIM (benefit programs, health coverage, additional state tax credits and federal provisions), how the emulator handles each, and the PolicyEngine variables. Each ends with a “why it matters” card. +- `slides/InputMapping.tsx`: story cards by general area, aligned across each row with CSS subgrid. Slide 16: the TAXSIM variables, the limit of the TAXSIM format, and the PolicyEngine variables that remove it. Slide 18: what PolicyEngine calculates beyond TAXSIM (benefit programs, health coverage, additional state tax credits and federal provisions), how the emulator handles each, and the PolicyEngine variables. Each ends with a “why it matters” card. - `slides/DropInTabs.tsx`: the TAXSIM site’s Installation section on top and its Get started section below, as on policyengine.org/us/taxsim (slide 11). Each section has its title centered above its tabs: macOS/Linux and Windows for the two install steps, and CLI, Python, R, Stata, SAS and Julia for the before and after code. Clicks on the tabs and the Copy buttons do not advance the slide. On screens 820px tall or less, the widget scales down so that it fits. -- `slides/ThankYouSlide.tsx`: the closing slide, with each speaker’s photo, name and email (slide 34). -- `slides/UpdateTimeline.tsx`: when the 2026 tax rules will be ready: the 2025 state update’s figures, the 2025 cycle and the 2026 plan on one November-to-March axis in half-month slots, the major changes, and the March 31, 2027 commitment (slide 28). -- `slides/CeInputsTable.tsx`: CE inputs that PolicyEngine can use and TAXSIM cannot: CE variables, PolicyEngine inputs, what PolicyEngine does with them and TAXSIM’s limit (slide 22). CE variable names are from the 2024 Interview public-use microdata dictionary. -- `slides/LiveEmbed.tsx`: live iframe with a side column of demo steps (slides 14, 18 and 30). -- `slides/ProcessFlow.tsx`: step-card processes with optional figures, real examples and who-provides-what columns (slides 17, 19 and 32). +- `slides/ThankYouSlide.tsx`: the closing slide, with each speaker’s photo, name and email (slide 35). +- `slides/UpdateTimeline.tsx`: when the 2026 tax rules will be ready: the 2025 state update’s figures, the 2025 cycle and the 2026 plan on one November-to-March axis in half-month slots, the major changes, and the March 31, 2027 commitment (slide 24). +- `slides/CeInputsTable.tsx`: CE inputs that PolicyEngine can use and TAXSIM cannot: CE variables, PolicyEngine inputs, what PolicyEngine does with them and TAXSIM’s limit (slide 17). CE variable names are from the 2024 Interview public-use microdata dictionary. +- `slides/LiveEmbed.tsx`: live iframe with a side column of demo steps (slides 14, 22 and 31). +- `slides/ProcessFlow.tsx`: step-card processes with optional figures, real examples and who-provides-what columns (slides 21, 23 and 33). - `slides/Releases.tsx`: versions and releases: release figures, the command that pins both packages, and what ships with every release (slide 13). -- `slides/AxiomPlan.tsx`: the move to Axiom in three stages: today, planned and throughout (slide 29). +- `slides/AxiomPlan.tsx`: the move to Axiom in three stages: today, planned and throughout (slide 30). - `slides/DetailContent.tsx`: a table layout with a footnote; no slide uses it at present. -- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 9), the routing diagram: an example input file, two engines by tax year, an example output file (slide 12), the three-calculations triangle with the validation steps beside it (slide 16), imputation sources (slide 24), resource bars (slide 25), cards with a headline figure (slides 7 and 26), the comparison diagram (slide 31), and questions with resource links (slide 33). `BenefitChains` is kept but no slide uses it at present. +- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 9), the routing diagram: an example input file, two engines by tax year, an example output file (slide 12), the three-calculations triangle with the validation steps beside it (slide 20), imputation sources (slide 26), resource bars (slide 27), cards with a headline figure (slides 7 and 28), the comparison diagram (slide 32), and questions with resource links (slide 34). `BenefitChains` is kept but no slide uses it at present. - `SPEAKER-NOTES.md`: readable presenter track and preparation checklist, kept in step with `content.ts`. -- `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 16–19, 10 minutes). +- `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 20–23, 10 minutes). -The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, after the core assumptions and before validation. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (8) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (21 and 23) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. +The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, after the core assumptions and before validation. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (8) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (16 and 18) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. -The example results on slide 12 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 25 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 19 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 28 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. +The example results on slide 12 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 27 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 23 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 24 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 5f053c8..2138843 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -1,18 +1,19 @@ # BLS TAXSIM seminar: slide text and speaker notes -34 slides, including 5 section dividers and a closing slide: 60 minutes presenting, no slack, then a dedicated 30-minute Q&A slide. +35 slides, including 6 section dividers and a closing slide: 60 minutes presenting, no slack, then a dedicated 30-minute Q&A slide. Based on the September 2025 CRS TAXSIM section, PWBM 2026 validation material, IARIW 2026 imputation/calibration material in this repository, and the PolicyEngine TAXSIM site (policyengine.org/us/taxsim), captured October 5, 2026. ## Before presenting -- Rehearse the live demo (slide 14) and the live dashboard (slide 18) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. -- On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 17 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). -- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 17 notes and the slide 18 footnote if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. -- The validation section (slides 16–19, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. +- Presenters: Max Ghenis (sections 01, 05 and 06), Pavel Makarchuk (02 and 03), David Trimmer (04). Speakers change only at the section dividers, which name the presenter. +- Rehearse the live demo (slide 14) and the live dashboard (slide 22) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. +- On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 21 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). +- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 21 notes and the slide 22 footnote if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. +- The validation section (slides 20–23, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. - Open policyengine.org/us/taxsim/run once before the talk: its first load took 9 seconds on October 8. -- Open slide 30 once before the talk: the embedded Axiom page took about 20 seconds to render the first time on October 8. -- Rehearse the Axiom run on slide 30 in a separate browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21, Run tab) and leave that tab open: answers are lost on reload. The slide notes have the household and the fallbacks. +- Open slide 31 once before the talk: the embedded Axiom page took about 20 seconds to render the first time on October 8. +- Rehearse the Axiom run on slide 31 in a separate browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21, Run tab) and leave that tab open: answers are lost on reload. The slide notes have the household and the fallbacks. - Thesia Garner’s questions are answered in the notes of the slides that cover them; the agenda notes (slide 2) map each question to its slide. - Confirm the CE-specific benefit methodology and pilot scope. These sections describe proposed research choices rather than a completed CE implementation. @@ -30,16 +31,17 @@ Introduce the speakers and thank the BLS hosts and the CE team. - Introduction and context — What PolicyEngine is, who funds and uses it, why we built an emulator, and how the NBER collaboration started. - The TAXSIM emulator — A drop-in TAXSIM interface, where each calculation happens, versions and releases, and a live demo in the browser. -- Validation — How a disagreement is resolved with the engines, independent validators and the law, how that shapes the emulator, the public dashboard, and our progress. -- Beyond TAXSIM — What PolicyEngine models beyond TAXSIM’s inputs, and methods for missing survey inputs, SNAP participation and Medicaid valuation. -- What’s next — The 2026 tax rules, Axiom as our next-generation rules engine, and a possible CE pilot. +- Beyond TAXSIM — What PolicyEngine models beyond TAXSIM’s inputs and outputs, and the CE fields that could feed it. +- Validation — How a disagreement is resolved with the engines, independent validators and the law, the public dashboard, and the 2026 tax rules. +- Benefit imputation — Methods for missing survey inputs, what counts as household resources, and how to validate benefit imputations. +- What’s next — Axiom as our next-generation rules engine, with a live run, and a possible CE pilot. - Q&A and discussion — Questions on the methods, implementation, and opportunities for collaboration. -The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer. +The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic on slide 4; funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); in-kind benefits on slides 18 and 27; testing in the validation section (slides 20–23); the annual update on slide 24; the road map in What’s next (slides 30–33). Each of those slides’ notes carries the spoken answer. ## 3. Introduction and context (section divider) -Section divider 01. Move on after a few seconds. +Section divider 01, presented by Max Ghenis. Move on after a few seconds. ## 4. PolicyEngine: free, open-source microsimulation (2–4 min) @@ -72,7 +74,7 @@ Point out the federal statistical user, BEA, because it is closest to the CE tea - **Microsimulation first.** PolicyEngine launched in 2021 to model taxes and benefits for any household or survey. - **State taxes, checked against TAXSIM.** Our first state income tax and TAXSIM35 validation began in April 2022; beta coverage of every state followed in 2024. -- **NBER names a successor.** “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page +- **TAXSIM’s author on a successor.** “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page - **One model for both uses.** The emulator runs TAXSIM files on the same open rules that score reforms and benefits. Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). The dashboard now compares tax years 2021 to 2025. Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement. Quote only those BEA fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf. @@ -129,13 +131,13 @@ PolicyEngine: - **Tax and benefit programs:** Income tax, SNAP, Medicaid, CHIP, SSI, TANF, WIC and ACA subsidies - **Used in research and policy:** Joint Economic Committee, BEA, universities and benefit navigators -Start on the left with TAXSIM, end on the right with PolicyEngine, and use the middle for the agreement and how one interface routes tax years. Close with: both teams validate the emulator, and the work has improved how both TAXSIM and PolicyEngine encode tax law. TAXSIM has run at NBER since the 1970s; NBER still maintains it, and more than 1,200 papers cite the 1993 paper that introduced it. Think tanks such as Brookings and federal agencies rely on it. NBER started filing differences on the emulator’s public GitHub tracker in 2024 (first issue: September 22, 2024). The memorandum of understanding with NBER was announced on September 5, 2025. policyengine-taxsim 3.0.0 was released on September 29, 2026, one of 80 PyPI releases since February 2026. One interface covers every tax year: TAXSIM35 handles 1960–2020 (state law from 1977) and PolicyEngine handles 2021 onward. PolicyEngine facts (right): public code since June 2021, 133 contributors to the US model, 95,000+ parameters and 4,693 test files, from the gettsim-2026 deck (September 3, 2026); check them before the talk. The benefit list follows the Benefits and taxes section of policyengine.org/us/taxsim, which also names housing vouchers, the EITC and the CTC. Optional context for this audience, not on the slide: the CE published TAXSIM-based tax estimates from the 2013 data through the 2023 data, and the 2024 data has none (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). Sources: https://www.policyengine.org/us/research/policyengine-nber-mou-taxsim and https://pypi.org/project/policyengine-taxsim/ +Start on the left with TAXSIM, end on the right with PolicyEngine, and use the middle for the agreement and how one interface routes tax years. Close with: both teams validate the emulator, and the work has improved how both TAXSIM and PolicyEngine encode tax law. TAXSIM has run at NBER since the 1970s; NBER still maintains it, and more than 1,200 papers cite the 1993 paper that introduced it. Think tanks such as Brookings and federal agencies rely on it. NBER started filing differences on the emulator’s public GitHub tracker in 2024 (first issue: September 22, 2024). The memorandum of understanding with NBER was announced on September 5, 2025. policyengine-taxsim 3.0.0 was released on September 29, 2026, one of 80 PyPI releases since February 2026. One interface covers every tax year: TAXSIM35 handles 1960–2020 (state law from 1977) and PolicyEngine handles 2021 onward. PolicyEngine facts (right): public code since June 2021, 133 contributors to the US model, 95,000+ parameters (from the gettsim-2026 deck, September 3, 2026) and 4,932 test files (recounted October 8, 2026). The benefit list follows the Benefits and taxes section of policyengine.org/us/taxsim, which also names housing vouchers, the EITC and the CTC. Optional context for this audience, not on the slide: the CE published TAXSIM-based tax estimates from the 2013 data through the 2023 data, and the 2024 data has none (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). Sources: https://www.policyengine.org/us/research/policyengine-nber-mou-taxsim and https://pypi.org/project/policyengine-taxsim/ # The TAXSIM emulator ## 10. The TAXSIM emulator (section divider) -Section divider 02. Move on after a few seconds. +Section divider 02, presented by Pavel Makarchuk. Move on after a few seconds. ## 11. A drop-in replacement for TAXSIM35 (11–14 min) @@ -177,7 +179,7 @@ Show where the calculation happens. The emulator reads each row’s tax year: ro - **Typed changelog entries.** CI checks each pull request for an entry: added, changed, fixed, removed or breaking. - **Support on the public tracker.** Every report and its resolution stay visible on GitHub. -**286** PolicyEngine US releases, July 10 to October 7 · **15** Emulator releases in the same 90 days · **Every year** Each release computes every tax year it covers · **23.5 hours** Median first reply to NBER’s reports, last 90 days +**286** PolicyEngine US releases, July 10 to October 7 · **15** Emulator releases in the same 90 days · **Every year** Each release computes every tax year it covers · **About 1 day** Median first reply to NBER’s reports, last 90 days Pin both packages to reproduce a run: @@ -187,11 +189,11 @@ uv tool install --python 3.11 \ --with policyengine-us==2.25.2 ``` -Needs Python 3.11 or later. Without a pin, the emulator takes the newest PolicyEngine US release. Record both versions with each run. +Needs Python 3.11 or later. Without a pin, the emulator takes the newest PolicyEngine US release. PyPI does not keep every release, so record both versions and archive the environment with each run. The file format stays TAXSIM’s. The last breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it. -Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers. Merged changes ship automatically, often several in one release: both repositories bump the version from the changelog fragments and publish to PyPI after the tests pass (PolicyEngine US waits for its full suite; the emulator for lint and pytest on Linux, macOS and Windows; policyengine-us push.yaml, policyengine-taxsim ci.yml). From July 10 to October 7 that was 286 PolicyEngine US releases, about three a day, and 15 emulator releases; each release is small, about two changelog entries. Tests run on every pull request, but GitHub does not block a merge that fails them; merging is a reviewer’s decision. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves on Python 3.11 (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck); on Python 3.10 it cannot resolve, and an unpinned install there falls back to an older 1.x model with the older S-corporation default. Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI does not keep every PolicyEngine US release: only five from before July 2026 remain, and 1.711.0, the emulator’s own minimum, is gone. For long-lived reproducibility, archive the installed environment or wheels with the results. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: CI checks each pull request for a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; under the current release script a breaking entry bumps the major version, and the only breaking change so far, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; for the 121 issues NBER filed in the last 90 days, the median first PolicyEngine reply came in 23.5 hours. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026. +Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers. Merged changes ship automatically, often several in one release: both repositories bump the version from the changelog fragments and publish to PyPI after the tests pass (PolicyEngine US waits for its full suite; the emulator for lint and pytest on Linux, macOS and Windows; policyengine-us push.yaml, policyengine-taxsim ci.yml). From July 10 to October 7 that was 286 PolicyEngine US releases, about three a day, and 15 emulator releases; each release is small, about two changelog entries. Tests run on every pull request, but GitHub does not block a merge that fails them; merging is a reviewer’s decision. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves on Python 3.11 (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck); on Python 3.10 it cannot resolve, and an unpinned install there falls back to an older 1.x model with the older S-corporation default. Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI does not keep every PolicyEngine US release: only five from before July 2026 remain, and 1.711.0, the emulator’s own minimum, is gone. For long-lived reproducibility, archive the installed environment or wheels with the results. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: CI checks each pull request for a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; under the current release script a breaking entry bumps the major version, and the only breaking change so far, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; NBER filed 121 issues in the last 90 days; for the 113 with a reply, the median first PolicyEngine reply came in 23.5 hours, or 24.4 hours counting the 8 without one as unanswered. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026. # Live demonstration @@ -201,13 +203,62 @@ Live page: https://www.policyengine.org/us/taxsim/run Go straight into the live demo after the routing diagram and before validation. Click inside the frame to use the page. The frame keeps keyboard focus, so click the slide title before you press the arrow keys again. Use Expand for a larger view. Do not use the email form. Run and download in browser saves a CSV on the presentation laptop; open it to show the results for each household. Rehearse on the presentation laptop and network: confirm that the frame loads and note how long the run takes. Start by loading the 3-household sample and reading household 1 aloud: a married couple in California (state code 5, mstat 2) with two dependents and $80,000 and $50,000 in wages. If the frame does not load, open policyengine.org/us/taxsim/run in a browser tab. Demo steps: (1) Load the 3-household sample; (2) Keep Standard output: federal and state tax, FICA and marginal rates; (3) Run and download in the browser; (4) Read the results for each household; (5) Switch to Full for AGI, credits, deductions and AMT. +# Beyond TAXSIM + +## 15. Beyond TAXSIM (section divider) + +Section divider 03, presented by Pavel Makarchuk. Move on after a few seconds. + +## 16. Additional inputs beyond TAXSIM (29–31 min) + +| Area | TAXSIM input | Limit | PolicyEngine adds | +|---|---|---|---| +| Business income | `pbusinc`, `pprofinc`, `scorp` | The qualified business income deduction limits need W-2 wages and property basis. | `w2_wages_from_qualified_business`, `unadjusted_basis_qualified_property` | +| Itemized deductions | `mortgage`, `otheritem`, `proptax` | Other itemized deductions arrive as one total, without the charitable or medical expense limits. | `charitable_cash_donations`, `other_medical_expenses` | +| State and local taxes | `state` | Without the household’s location, county and city income taxes are excluded. | `county_fips` | +| Household | `page`, `sage`, `depx`, `ageN` | Dependents carry only an age, with no disability or student status. | `is_disabled`, `is_full_time_college_student` | +| Unearned income | `intrec`, `dividends`, `pensions`, `gssi` | Reported for the couple, with no income types such as IRA withdrawals or disability benefits. | `taxable_ira_distributions`, `social_security_disability` | + +**Why it matters:** Existing TAXSIM files run unchanged. Added variables, from a survey or an imputation, let PolicyEngine apply more detailed rules. + +Explain how a TAXSIM input row becomes a PolicyEngine household, and what the format cannot carry. Business income: the emulator maps pbusinc and sbusinc (with psemp and ssemp) to self-employment income, pprofinc and sprofinc to income from a specified service trade or business, and scorp to partnership and S-corporation income. TAXSIM’s own QBI deduction is a flat 20% with the service-business phase-in, capped by taxable income, with no W-2 wage or property test. PolicyEngine applies those limits, so without W-2 wages the deduction phases out above the threshold; the emulator’s --assume-w2-wages option reproduces TAXSIM’s simpler rule (available on the policyengine and compare commands, not on the default drop-in command). Itemized deductions: TAXSIM’s mortgage and otheritem are aggregates; the emulator sums them into deductible mortgage interest, which has no floor or cap, to match TAXSIM, because charity and medical would bring AGI caps and floors that TAXSIM does not apply. Property tax maps to real estate taxes. State and local taxes: PolicyEngine computes the state income tax for the SALT deduction; TAXSIM input has no county or city, so Maryland county tax is set to zero and city taxes such as New York City’s do not apply. Do not present the 2025 SALT cap as a difference: TAXSIM also applies it. Household: TAXSIM gives the two adults’ ages (page, sage), the number of dependents (depx) and each dependent’s age (age1 to ageN); filing status comes from mstat. Dependents have no disability or student status. PolicyEngine’s is_disabled input feeds SNAP, SSI and many state credits, and is_full_time_college_student sets the student rules for the EITC and dependent credits (the EITC’s own disability test uses is_permanently_and_totally_disabled). Unearned income: TAXSIM reports interest (intrec), dividends, capital gains, pensions and Social Security (gssi) for the tax unit, and the emulator divides them between spouses for joint filers (evenly, or to the older spouse across a state’s age rule for pensions and Social Security). The fields also carry no type: pensions include IRA withdrawals, and gssi does not separate retirement, disability and survivor benefits. taxable_ira_distributions and social_security_disability add those types; taxable_interest_income and qualified_dividend_income are not on the slide, because the emulator already fills them from intrec and dividends. Sources: policyengine-taxsim 3.0.1 config/variable_mappings.yaml and runners/policyengine_runner.py; TAXSIM source law87.for. Each card ends with the PolicyEngine US input variables that remove the limit, which a survey or an imputation can supply: w2_wages_from_qualified_business and unadjusted_basis_qualified_property apply the wage and property limits of the qualified business income deduction; charitable_cash_donations and other_medical_expenses give each deduction its own adjusted gross income limit or floor; county_fips places the household, which turns on city and county income taxes such as New York City’s and the Indiana county taxes; is_disabled and is_full_time_college_student give dependents the status that credits and benefits use; taxable_ira_distributions and social_security_disability add the income types TAXSIM does not carry. Related input variables not on the slide: business_is_sstb, qualified_reit_and_ptp_income, charitable_non_cash_donations, home_mortgage_interest, is_permanently_and_totally_disabled, is_incapable_of_self_care, taxable_401k_distributions, social_security_survivors and tax_exempt_interest_income. Variable names checked in PolicyEngine US source on October 7, 2026. + +## 17. CE survey variables mapped to PolicyEngine inputs (31–33 min) + +| CE collects | PolicyEngine input | Calculations it supports | TAXSIM | +|---|---|---|---| +| **Medical costs and premiums:** `HEALTHCQ`, `HLTHINCQ` | `other_medical_expenses`, `health_insurance_premiums` | Applies the medical deduction’s income floor and the SNAP medical deduction | Only the deductible amount, in one total | +| **Charitable gifts:** `CASHCOCQ` | `charitable_cash_donations` | Charity deduction, including the 2026 deduction for non-itemizers | In one total with mortgage interest | +| **Tuition:** `EDUCACQ` | `qualified_tuition_expenses` | American Opportunity and Lifetime Learning credits | No field | +| **College enrollment:** `IN_COLL` | `is_full_time_college_student` | Student rules for EITC and dependent credits, and SNAP | No field | +| **Car loan interest:** `VEHFINCQ` | `auto_loan_interest` | Car loan interest deduction for 2025 to 2028 | No field | +| **Utilities:** `UTILCQ` | `gas_expense`, `water_expense`, `pre_subsidy_electricity_expense` | SNAP utility allowance and shelter deduction | No field | +| **Benefits received:** `JFS_AMT`, `SSIX`, `WELFAREX` | `ssi_reported`, `takes_up_snap_if_eligible` | Compares simulated SNAP, SSI and TANF with reported receipt | One transfers total | + +CE variables from the 2024 Interview public-use microdata dictionary; PolicyEngine US variable names. + +Show which CE fields could feed PolicyEngine inputs that TAXSIM’s format cannot carry. All CE variables are in the 2024 Interview PUMD dictionary (FMLI unless noted; IN_COLL and SSIX are on MEMI). Medical: HEALTHCQ is the sum of HLTHINCQ, MEDSRVCQ, PREDRGCQ and MEDSUPCQ; TAXSIM takes only deductible medical expenses, already above the AGI floor, in its mortgage total, so the CE applied the floor itself. PolicyEngine applies the floor and also uses medical costs for the SNAP excess medical deduction for elderly and disabled members. Charity: CASHCOCQ also includes alimony, child support, gifts and political giving, so use the charity codes in the CNT detail file. Tuition: EDUCACQ includes K-12 tuition; college tuition is UCC 670110. College enrollment: IN_COLL is 1 full time, 2 part time, 3 not at all. TAXSIM’s documentation instead asks users to code students aged 20 to 23 as 19. Car loans: VEHFINCQ is vehicle finance charges; the 2025 deduction also requires final assembly in the United States, which the CE does not record. Utilities: UTILCQ is the sum of natural gas, electricity, fuels, telephone and water; TAXSIM has no utility field, and PolicyEngine uses utility costs for the SNAP standard utility allowance and shelter deduction. Rent is not listed, because TAXSIM already takes rentpaid. Benefits: JFS_AMT is the annual value of SNAP (with FS_MTHI months), SSIX is SSI per member, and WELFAREX is public assistance; TAXSIM takes one transfers total, used for state rebates. Quarterly spending variables (CQ and PQ) cover a three-month reference period; income variables cover 12 months. Context for this audience: from the second quarter of 2013 through the 2023 data, CE published federal and state tax estimates from TAXSIM; the 2024 data has no tax or after-tax income estimates, because the model was not updated for the 2024 tax year (CE PUMD Getting Started Guide). The emulator covers tax years 2021 onward. Sources: https://www.bls.gov/cex/pumd/ce-pumd-interview-diary-dictionary.xlsx, https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://taxsim.nber.org/taxsim35/ and PolicyEngine US source, October 7, 2026. + +## 18. What PolicyEngine calculates beyond TAXSIM (33–34 min) + +| Area | In the emulator | PolicyEngine calculates | +|---|---|---| +| Benefit programs | Set to zero in the emulator, because some state taxes count cash assistance as income. | `snap`, `ssi`, `tanf`, `wic` | +| Health coverage | Separate from income tax, and not reported by the emulator. | `medicaid`, `chip`, `aca_ptc` | +| Additional state tax credits | Zero without inputs TAXSIM lacks, such as disability status, tuition or care work. Renters’ credits use rentpaid. | `id_aged_or_disabled_credit`, `ar_personal_credit_disabled_dependent`, `ny_college_tuition_credit`, `co_care_worker_credit` | +| Federal provisions | Zero without inputs TAXSIM lacks, such as tips, overtime or tuition. | `tip_income_deduction`, `overtime_income_deduction`, `american_opportunity_credit` | + +**Why it matters:** The emulator leaves these out to match TAXSIM. Additional outputs are available in the PolicyEngine web app, Python package and API. + +Show what PolicyEngine calculates that TAXSIM’s output does not carry, and how the emulator handles each item so that its results stay comparable with TAXSIM. Benefit programs: PolicyEngine calculates SNAP, SSI, TANF, WIC and the state SSI supplements; the emulator sets them to zero, because TAXSIM has no inputs for them and some state taxes count cash assistance as income (for example, the base of the Massachusetts senior circuit breaker credit; policyengine-taxsim issue #1031). Health coverage: Medicaid, CHIP and the ACA premium tax credit are separate PolicyEngine variables; the premium tax credit is not part of PolicyEngine’s income tax, and the emulator does not report any of them. Additional state tax credits: the four on the slide need inputs TAXSIM lacks, and TAXSIM does not model the first two at all. The Idaho aged or disabled credit is for a filer who supports a family member aged 65 or older or a person with a disability; TAXSIM’s Idaho routine has the child tax, grocery, investment and political contribution credits, but not this one. The Arkansas credit gives $500 for each dependent with a disability (Form AR1000F); TAXSIM’s Arkansas personal credit counts filers, dependents and people aged 65 or older, with no disability input. The New York college tuition credit needs tuition paid, and the Colorado care worker credit needs care worker status. Other state credits that need inputs TAXSIM does not have: the Minnesota K-12 education credit (tuition), the 529 plan credits in Indiana, Oregon, Utah and Vermont, the Louisiana and Nebraska school readiness credits, the Connecticut and Nebraska stillborn credits and the Vermont veteran tax credit. If asked about Maryland: TAXSIM models the Maryland child tax credit from 2023 for children under 6, but not its extension to children with a disability up to age 16, and not the 2021 and 2022 credit, which was only for children with a disability. Renters’ credits: TAXSIM models most renters’ and property tax credits from rentpaid (for example California, Minnesota and Vermont, and the homestead or property tax credits in Arizona, Michigan, Wisconsin, Missouri, New Jersey, Maine, New York and DC), so they appear in both engines and in the comparison. PolicyEngine adds detail that needs other inputs, such as disability status in Minnesota’s renter’s credit, county income limits and shared rent in Vermont’s renter credit, and heat included in rent for Michigan’s home heating credit. Sources for the TAXSIM side: the state routines in the TAXSIM source (for example 05ca.for, 24mn.for and 46vt.for). Sources: TAXSIM source 13id.for, 04ar.for and 21md.for; PolicyEngine US source, October 8, 2026. Federal provisions: the deductions for tips, overtime and car-loan interest, the American Opportunity and Lifetime Learning credits (tuition) and the saver’s credit (retirement contributions) need inputs that TAXSIM does not have, so they are zero in emulator runs; PolicyEngine calculates them when a data source supplies the inputs. Conventions kept from TAXSIM, if asked: fiitax includes the net investment income tax but not the Additional Medicare Tax, which is reported with payroll taxes; fica includes both the employee and employer shares; one-time state rebates are in siitax and also reported as srebate; frate and srate come from a second run with $100 more wages. Sources: policyengine-taxsim 3.0.1 runners/policyengine_runner.py, core/state_output_resolver.py and config/variable_mappings.yaml; PolicyEngine US source, October 7, 2026. + # Validation -## 15. Validation (section divider) +## 19. Validation (section divider) -Section divider 03. Move on after a few seconds. +Section divider 04, presented by David Trimmer. Move on after a few seconds. -## 16. Three calculations, one arbiter (29–32 min) +## 20. Three calculations, one arbiter (34–37 min) 1. **Issue filed.** A mismatch between PolicyEngine and TAXSIM on a CPS record becomes an issue. 2. **Agentic review.** An agentic workflow explores the disagreement using both engines, the validators and the statutes. @@ -226,7 +277,7 @@ Agreement measures consistency. The law decides correctness, because two engines Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests, and a release reaches PyPI only after its tests pass; merging is a reviewer’s decision, so GitHub does not block a failing pull request automatically. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026). -## 17. How this process shapes the emulator (32–34 min) +## 21. How this process shapes the emulator (37–39 min) 1. **Compile.** Every resolved case is stored as an issue on the emulator’s GitHub tracker, with the input row, both results and the resolution. 2. **Lock in.** PolicyEngine fixes ship with a test case, so a resolved disagreement cannot quietly return. @@ -239,13 +290,13 @@ Each PolicyEngine release and each TAXSIM update reruns the comparison. Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. If asked about #1248: Dan Feenberg opened it on September 25 about his own TAXSIM changes, closed it on September 29, and has filed issues since. The dashboard data also fixed the Alabama coding (state 1, 1,155 households, separate from Texas) in the September 24 release. Source: https://www.policyengine.org/us/taxsim/dashboard -## 18. The public validation dashboard (34–37 min) +## 22. The public validation dashboard (39–42 min) Live page: https://www.policyengine.org/us/taxsim/dashboard About 3 minutes: a quick overview, then one or two examples. Show the dashboard as the output of the process, not as a list of figures. Pick a year, change the tolerance, scroll the state table and inspect one state to show the household list; a second state with near-complete agreement shows what a resolved area looks like. The headline figures are in the notes for the previous slide if someone asks. Check the page on the morning of the talk, because it can update. Click the slide title before you press the arrow keys. If the frame does not load, open policyengine.org/us/taxsim/dashboard in a browser tab. Dashboard steps: (1) Pick a tax year, 2021 to 2025; (2) Choose a tolerance; (3) See agreement by state; (4) Inspect a state to list its households. -## 19. From a reported difference to a fix (37–39 min) +## 23. From a reported difference to a fix (42–44 min) 1. **Report.** 2. **Reproduce.** @@ -261,56 +312,29 @@ About 3 minutes: a quick overview, then one or two examples. Show the dashboard Present the change this work has driven in both engines. Do not say how quickly NBER corrects TAXSIM: TAXSIM is closed source with no public release cadence, so we cannot track when its corrections ship, only that NBER confirmed them. NBER files most of the difference reports; we file questions when TAXSIM appears to differ from the law. Each case is reproduced with a minimal household, classified, and resolved. Exact counts on October 7, 2026: 1,186 issues on the policyengine-taxsim tracker since July 15, 2024, of which 1,010 are closed; 159 questions titled Does TAXSIM or Does taxsimtest since February 2026. TAXSIM corrections: about 106 issues have an NBER comment that confirms a TAXSIM correction (for example “Agreed, corrected”, “Fixed in Taxsim” or “I changed taxsim”), and about 60 more have only “Agreed” or “Now matches”, which do not say which engine changed. This is a lower bound: TAXSIM’s working builds are not public, so changes made without a comment are not counted. PolicyEngine changes, if asked: 163 PolicyEngine US pull requests since July 2024 cite TAXSIM comparisons (mostly state rule corrections), and the emulator has 180 merged pull requests, about a third of them tooling such as CI, versioning and the dashboard. These are not on the slide, because merged pull requests and confirmed corrections are not counted the same way and should not be compared. The tracker grows by about 40 issues a day this week, so the slide uses rounded figures. The three examples show the three outcomes: #1241 (opened September 25, fixed by PR #1244 on September 29), #1235 (opened September 24; NBER replied Agreed and corrected TAXSIM), and #1251 (Minnesota renter’s credit: the comparison return had no Schedule M1RENT). Sources: https://github.com/PolicyEngine/policyengine-taxsim/issues and https://github.com/PolicyEngine/policyengine-us/pulls -# Beyond TAXSIM - -## 20. Beyond TAXSIM (section divider) - -Section divider 04. Move on after a few seconds. - -## 21. Additional inputs beyond TAXSIM (39–41 min) - -| Area | TAXSIM input | Limit | PolicyEngine adds | -|---|---|---|---| -| Business income | `pbusinc`, `pprofinc`, `scorp` | The qualified business income deduction limits need W-2 wages and property basis. | `w2_wages_from_qualified_business`, `unadjusted_basis_qualified_property` | -| Itemized deductions | `mortgage`, `otheritem`, `proptax` | Other itemized deductions arrive as one total, without the charitable or medical expense limits. | `charitable_cash_donations`, `other_medical_expenses` | -| State and local taxes | `state` | Without the household’s location, county and city income taxes are excluded. | `county_fips` | -| Household | `page`, `sage`, `depx`, `ageN` | Dependents carry only an age, with no disability or student status. | `is_disabled`, `is_full_time_college_student` | -| Unearned income | `intrec`, `dividends`, `pensions`, `gssi` | Reported for the couple, with no income types such as IRA withdrawals or disability benefits. | `taxable_ira_distributions`, `social_security_disability` | +## 24. When the 2026 tax rules will be ready (44–46 min) -**Why it matters:** Existing TAXSIM files run unchanged. Added variables, from a survey or an imputation, let PolicyEngine apply more detailed rules. +**44** Jurisdictions updated for 2025: 41 income-tax states, DC, NH and WA · **47** Pull requests from 5 contributors · **11 weeks** First pull request to last merge, Dec 3 – Feb 18 · **30** States finished in the last week, worked in parallel -Explain how a TAXSIM input row becomes a PolicyEngine household, and what the format cannot carry. Business income: the emulator maps pbusinc and sbusinc (with psemp and ssemp) to self-employment income, pprofinc and sprofinc to income from a specified service trade or business, and scorp to partnership and S-corporation income. TAXSIM’s own QBI deduction is a flat 20% with the service-business phase-in, capped by taxable income, with no W-2 wage or property test. PolicyEngine applies those limits, so without W-2 wages the deduction phases out above the threshold; the emulator’s --assume-w2-wages option reproduces TAXSIM’s simpler rule (available on the policyengine and compare commands, not on the default drop-in command). Itemized deductions: TAXSIM’s mortgage and otheritem are aggregates; the emulator sums them into deductible mortgage interest, which has no floor or cap, to match TAXSIM, because charity and medical would bring AGI caps and floors that TAXSIM does not apply. Property tax maps to real estate taxes. State and local taxes: PolicyEngine computes the state income tax for the SALT deduction; TAXSIM input has no county or city, so Maryland county tax is set to zero and city taxes such as New York City’s do not apply. Do not present the 2025 SALT cap as a difference: TAXSIM also applies it. Household: TAXSIM gives the two adults’ ages (page, sage), the number of dependents (depx) and each dependent’s age (age1 to ageN); filing status comes from mstat. Dependents have no disability or student status. PolicyEngine’s is_disabled input feeds SNAP, SSI and many state credits, and is_full_time_college_student sets the student rules for the EITC and dependent credits (the EITC’s own disability test uses is_permanently_and_totally_disabled). Unearned income: TAXSIM reports interest (intrec), dividends, capital gains, pensions and Social Security (gssi) for the tax unit, and the emulator divides them between spouses for joint filers (evenly, or to the older spouse across a state’s age rule for pensions and Social Security). The fields also carry no type: pensions include IRA withdrawals, and gssi does not separate retirement, disability and survivor benefits. taxable_ira_distributions and social_security_disability add those types; taxable_interest_income and qualified_dividend_income are not on the slide, because the emulator already fills them from intrec and dividends. Sources: policyengine-taxsim 3.0.1 config/variable_mappings.yaml and runners/policyengine_runner.py; TAXSIM source law87.for. Each card ends with the PolicyEngine US input variables that remove the limit, which a survey or an imputation can supply: w2_wages_from_qualified_business and unadjusted_basis_qualified_property apply the wage and property limits of the qualified business income deduction; charitable_cash_donations and other_medical_expenses give each deduction its own adjusted gross income limit or floor; county_fips places the household, which turns on city and county income taxes such as New York City’s and the Indiana county taxes; is_disabled and is_full_time_college_student give dependents the status that credits and benefits use; taxable_ira_distributions and social_security_disability add the income types TAXSIM does not carry. Related input variables not on the slide: business_is_sstb, qualified_reit_and_ptp_income, charitable_non_cash_donations, home_mortgage_interest, is_permanently_and_totally_disabled, is_incapable_of_self_care, taxable_401k_distributions, social_security_survivors and tax_exempt_interest_income. Variable names checked in PolicyEngine US source on October 7, 2026. +**2025 tax year (what happened):** Dec 3 – Feb 10: one state at a time: Full model reviews, adding missing programs and fixing errors: 14 states done; Feb 11–18: 30 states in parallel: all 44 done; Mar – May: follow-up fixes: Federal non-conformity in DC, Idaho, Maine and South Carolina. -## 22. CE survey variables mapped to PolicyEngine inputs (41–43 min) +**2026 tax year (plan):** Prepare: Set up agents to draft each state’s update from its forms; Update as forms are published: Run states in parallel as each releases its 2026 forms and instructions; Finish and check: Late states, then rerun the TAXSIM comparison for 2026; Done by March 31, 2027: Every state complete, with March as a buffer. -| CE collects | PolicyEngine input | Calculations it supports | TAXSIM | -|---|---|---|---| -| **Medical costs and premiums:** `HEALTHCQ`, `HLTHINCQ` | `other_medical_expenses`, `health_insurance_premiums` | Applies the medical deduction’s income floor and the SNAP medical deduction | Only the deductible amount, in one total | -| **Charitable gifts:** `CASHCOCQ` | `charitable_cash_donations` | Charity deduction, including the 2026 deduction for non-itemizers | In one total with mortgage interest | -| **Tuition:** `EDUCACQ` | `qualified_tuition_expenses` | American Opportunity and Lifetime Learning credits | No field | -| **College enrollment:** `IN_COLL` | `is_full_time_college_student` | Student rules for EITC and dependent credits, and SNAP | No field | -| **Car loan interest:** `VEHFINCQ` | `auto_loan_interest` | Car loan interest deduction for 2025 to 2028 | No field | -| **Utilities:** `UTILCQ` | `gas_expense`, `water_expense`, `pre_subsidy_electricity_expense` | SNAP utility allowance and shelter deduction | No field | -| **Benefits received:** `JFS_AMT`, `SSIX`, `WELFAREX` | `ssi_reported`, `takes_up_snap_if_eligible` | Compares simulated SNAP, SSI and TANF with reported receipt | One transfers total | +**Major law changes in 2025:** Iowa: flat 3.8% rate; New Hampshire: interest and dividends tax repealed; Maryland: new top brackets, capital gains surtax; Wisconsin: wider 4.4% bracket, $1,200 exemption. -CE variables from the 2024 Interview public-use microdata dictionary; PolicyEngine US variable names. +**Added or corrected in the model:** New Jersey: ANCHOR and Stay NJ property tax relief; Minnesota: K-12 education credit and subtraction; Indiana: county tax rates; California: alternative minimum tax thresholds. -Show which CE fields could feed PolicyEngine inputs that TAXSIM’s format cannot carry. All CE variables are in the 2024 Interview PUMD dictionary (FMLI unless noted; IN_COLL and SSIX are on MEMI). Medical: HEALTHCQ is the sum of HLTHINCQ, MEDSRVCQ, PREDRGCQ and MEDSUPCQ; TAXSIM takes only deductible medical expenses, already above the AGI floor, in its mortgage total, so the CE applied the floor itself. PolicyEngine applies the floor and also uses medical costs for the SNAP excess medical deduction for elderly and disabled members. Charity: CASHCOCQ also includes alimony, child support, gifts and political giving, so use the charity codes in the CNT detail file. Tuition: EDUCACQ includes K-12 tuition; college tuition is UCC 670110. College enrollment: IN_COLL is 1 full time, 2 part time, 3 not at all. TAXSIM’s documentation instead asks users to code students aged 20 to 23 as 19. Car loans: VEHFINCQ is vehicle finance charges; the 2025 deduction also requires final assembly in the United States, which the CE does not record. Utilities: UTILCQ is the sum of natural gas, electricity, fuels, telephone and water; TAXSIM has no utility field, and PolicyEngine uses utility costs for the SNAP standard utility allowance and shelter deduction. Rent is not listed, because TAXSIM already takes rentpaid. Benefits: JFS_AMT is the annual value of SNAP (with FS_MTHI months), SSIX is SSI per member, and WELFAREX is public assistance; TAXSIM takes one transfers total, used for state rebates. Quarterly spending variables (CQ and PQ) cover a three-month reference period; income variables cover 12 months. Context for this audience: from the second quarter of 2013 through the 2023 data, CE published federal and state tax estimates from TAXSIM; the 2024 data has no tax or after-tax income estimates, because the model was not updated for the 2024 tax year (CE PUMD Getting Started Guide). The emulator covers tax years 2021 onward. Sources: https://www.bls.gov/cex/pumd/ce-pumd-interview-diary-dictionary.xlsx, https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://taxsim.nber.org/taxsim35/ and PolicyEngine US source, October 7, 2026. +Commitment: every state’s 2026 income tax rules complete by March 31, 2027. -## 23. What PolicyEngine calculates beyond TAXSIM (43–44 min) +BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule. -| Area | In the emulator | PolicyEngine calculates | -|---|---|---| -| Benefit programs | Set to zero in the emulator, because some state taxes count cash assistance as income. | `snap`, `ssi`, `tanf`, `wic` | -| Health coverage | Separate from income tax, and not reported by the emulator. | `medicaid`, `chip`, `aca_ptc` | -| Additional state tax credits | Zero without inputs TAXSIM lacks, such as disability status, tuition or care work. Renters’ credits use rentpaid. | `id_aged_or_disabled_credit`, `ar_personal_credit_disabled_dependent`, `ny_college_tuition_credit`, `co_care_worker_credit` | -| Federal provisions | Zero without inputs TAXSIM lacks, such as tips, overtime or tuition. | `tip_income_deduction`, `overtime_income_deduction`, `american_opportunity_credit` | +# Benefit imputation -**Why it matters:** The emulator leaves these out to match TAXSIM. Additional outputs are available in the PolicyEngine web app, Python package and API. +## 25. Benefit imputation (section divider) -Show what PolicyEngine calculates that TAXSIM’s output does not carry, and how the emulator handles each item so that its results stay comparable with TAXSIM. Benefit programs: PolicyEngine calculates SNAP, SSI, TANF, WIC and the state SSI supplements; the emulator sets them to zero, because TAXSIM has no inputs for them and some state taxes count cash assistance as income (for example, the base of the Massachusetts senior circuit breaker credit; policyengine-taxsim issue #1031). Health coverage: Medicaid, CHIP and the ACA premium tax credit are separate PolicyEngine variables; the premium tax credit is not part of PolicyEngine’s income tax, and the emulator does not report any of them. Additional state tax credits: the four on the slide need inputs TAXSIM lacks, and TAXSIM does not model the first two at all. The Idaho aged or disabled credit is for a filer who supports a family member aged 65 or older or a person with a disability; TAXSIM’s Idaho routine has the child tax, grocery, investment and political contribution credits, but not this one. The Arkansas credit gives $500 for each dependent with a disability (Form AR1000F); TAXSIM’s Arkansas personal credit counts filers, dependents and people aged 65 or older, with no disability input. The New York college tuition credit needs tuition paid, and the Colorado care worker credit needs care worker status. Other state credits that need inputs TAXSIM does not have: the Minnesota K-12 education credit (tuition), the 529 plan credits in Indiana, Oregon, Utah and Vermont, the Louisiana and Nebraska school readiness credits, the Connecticut and Nebraska stillborn credits and the Vermont veteran tax credit. If asked about Maryland: TAXSIM models the Maryland child tax credit from 2023 for children under 6, but not its extension to children with a disability up to age 16, and not the 2021 and 2022 credit, which was only for children with a disability. Renters’ credits: TAXSIM models most renters’ and property tax credits from rentpaid (for example California, Minnesota and Vermont, and the homestead or property tax credits in Arizona, Michigan, Wisconsin, Missouri, New Jersey, Maine, New York and DC), so they appear in both engines and in the comparison. PolicyEngine adds detail that needs other inputs, such as disability status in Minnesota’s renter’s credit, county income limits and shared rent in Vermont’s renter credit, and heat included in rent for Michigan’s home heating credit. Sources for the TAXSIM side: the state routines in the TAXSIM source (for example 05ca.for, 24mn.for and 46vt.for). Sources: TAXSIM source 13id.for, 04ar.for and 21md.for; PolicyEngine US source, October 8, 2026. Federal provisions: the deductions for tips, overtime and car-loan interest, the American Opportunity and Lifetime Learning credits (tuition) and the saver’s credit (retirement contributions) need inputs that TAXSIM does not have, so they are zero in emulator runs; PolicyEngine calculates them when a data source supplies the inputs. Conventions kept from TAXSIM, if asked: fiitax includes the net investment income tax but not the Additional Medicare Tax, which is reported with payroll taxes; fica includes both the employee and employer shares; one-time state rebates are in siitax and also reported as srebate; frate and srate come from a second run with $100 more wages. Sources: policyengine-taxsim 3.0.1 runners/policyengine_runner.py, core/state_output_resolver.py and config/variable_mappings.yaml; PolicyEngine US source, October 7, 2026. +Section divider 05, presented by Max Ghenis. Move on after a few seconds. -## 24. Imputing a distribution of missing inputs (44–46 min) +## 26. Imputing a distribution of missing inputs (46–48 min) Sources fused into PolicyEngine’s US microdata: - **CPS** (Current Population Survey): The spine: demographics, income, labor force. @@ -327,7 +351,7 @@ Sources fused into PolicyEngine’s US microdata: A donor survey observes the variable of interest and predictors shared with the recipient survey. A conditional distribution permits households with similar observed characteristics to have different imputed values. That can matter around tax-benefit thresholds. Multiple draws can reveal sensitivity, but they do not automatically solve model misspecification or preserve every joint relationship. The prior deck names CPS, ACS, SCF, SIPP and tax microdata. This slide does not claim a CE implementation exists. Source: local IARIW 2026 ImputationSlide.tsx. -## 25. What counts as household resources? (46–48 min) +## 27. What counts as household resources? (48–50 min) One California household in 2025 (a single parent, children aged 4 and 7, $25,000 in wages), four resource concepts. @@ -340,9 +364,9 @@ The resource concept, not the calculator, decides whether $25,000 of earnings be PolicyEngine US 2.25.2, run October 5, 2026. Benefits assume take-up; Medi-Cal is valued at average cost per enrollee. -Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 10 states, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026). +Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 9 states and DC, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026). -## 26. Validation of benefit imputations (48–50 min) +## 28. Validation of benefit imputations (50–52 min) **≈40%** of SNAP recipients are missing from CPS reports, measured against linked administrative records. (Meyer and Mittag, NBER Working Paper 21676) @@ -355,33 +379,17 @@ Meyer and Mittag link the CPS to administrative records and find that the survey # What’s next -## 27. What’s next (section divider) - -Section divider 05. Move on after a few seconds. +## 29. What’s next (section divider) -## 28. When the 2026 tax rules will be ready (50–52 min) +Section divider 06, presented by Max Ghenis. Move on after a few seconds. -**44** Jurisdictions updated for 2025: 41 income-tax states, DC, NH and WA · **47** Pull requests from 5 contributors · **11 weeks** First pull request to last merge, Dec 3 – Feb 18 · **30** States finished in the last week, worked in parallel - -**2025 tax year (what happened):** Dec 3 – Feb 10: one state at a time: Full model reviews, adding missing programs and fixing errors: 14 states done; Feb 11–18: 30 states in parallel: all 44 done; Mar – May: follow-up fixes: Federal non-conformity in DC, Idaho, Maine and South Carolina. - -**2026 tax year (plan):** Prepare: Set up agents to draft each state’s update from its forms; Update as forms are published: Run states in parallel as each releases its 2026 forms and instructions; Finish and check: Late states, then rerun the TAXSIM comparison for 2026; Done by March 31, 2027: Every state complete, with March as a buffer. - -**Major law changes in 2025:** Iowa: flat 3.8% rate; New Hampshire: interest and dividends tax repealed; Maryland: new top brackets, capital gains surtax; Wisconsin: wider 4.4% bracket, $1,200 exemption. - -**Added or corrected in the model:** New Jersey: ANCHOR and Stay NJ property tax relief; Minnesota: K-12 education credit and subtraction; Indiana: county tax rates; California: alternative minimum tax thresholds. - -Commitment: every state’s 2026 income tax rules complete by March 31, 2027. - -BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule. - -## 29. Axiom: our next-generation rules engine (52–54 min) +## 30. Axiom: our next-generation rules engine (52–54 min) Axiom encodes tax and benefit rules from the law, with a test for every federal rule module. We are moving PolicyEngine onto it in steps. **Today: PolicyEngine US runs the emulator.** Tax years 2021 onward compute on PolicyEngine US; The 2026 rules ship there by March 31, 2027; Axiom publishes open comparisons with PolicyEngine and TAXSIM. -**Planned: Axiom on the backend.** PolicyEngine’s Python interface wraps Axiom, as it already does for a Belgium pilot; The TAXSIM emulator can run on Axiom; New programs arrive as encodings of the law, with tests. +**Planned: Axiom on the backend.** PolicyEngine’s Python interface wraps Axiom, as it already does for a Belgium pilot; The TAXSIM emulator could run on Axiom; New programs arrive as encodings of the law, with tests. **Throughout: Backwards compatible.** TAXSIM-format files in and out; The same command-line and Python calls; We keep powering TAXSIM for as long as it is needed. @@ -391,13 +399,13 @@ Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. Shipped evidence for the wrapper approach: policyengine.py already runs one country on Axiom, a Belgium pilot for worker social contributions and personal income tax (policyengine.py PR #448, tests/test_be_axiom_pilot.py); a US model on Axiom has no code yet. Axiom’s validation suite already turns its cases into TAXSIM rows and runs both TAXSIM-35 and the emulator on them (axiom-oracles adapters/taxsim). On the emulator, a CI test already pins the command-line entry point (tests/test_cli_entry_point.py). The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here. -## 30. The child care credit, live in Axiom (54–56 min) +## 31. The child care credit, live in Axiom (54–56 min) -Live page: https://axiom.org/us/statute/26/21 +Live page: https://axiom.org/us/statute/26/21?embed=1 A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. -## 31. Where this could fit in CE research (56–58 min) +## 32. Where this could fit in CE research (56–58 min) **CE tax-unit records** (An agreed set of inputs for one year.) → **CE’s TAXSIM estimates** (Published for 2013–2023 data.) and **PolicyEngine TAXSIM emulator** (The same file, no format changes.) → **Compare** (Household results and weighted summaries.) → **Review** (Explain differences before expanding the scope.) @@ -407,9 +415,7 @@ Keep CE definitions and weights fixed in the first comparison. This is a proposed integration path, not a tested CE implementation. CE published federal and state income tax estimates from NBER’s TAXSIM from the second quarter of 2013 through the 2023 data (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). The 2024 data has no tax or after-tax income estimates: BLS says the external tax model was not updated for the 2024 tax year, and it keeps a tax unit identifier on the microdata so users can produce their own tax estimates. A comparison therefore needs a year with CE TAXSIM estimates, 2023 or earlier; for the 2024 data onward, the emulator would produce estimates where CE now has none. The same TAXSIM input file can go to both engines. The slide gives only the years; mention the 2024 gap only if asked. Sources: https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://www.bls.gov/cex/csxfaqs.htm (question 42) and https://www.bls.gov/cex/notices/2025/ce-after-tax.htm. Start with the core outputs: fiitax, siitax, fica, v22 (child tax credit), v25 (EITC) and frate. Ask staff which parts of their current workflow could supply the comparison inputs. Preserve existing CE definitions and weights in the initial comparison. -## 32. A manageable CE pilot (58–60 min) - -Four steps, each with a clear output. +## 33. A manageable CE pilot (58–60 min) 1. **Scope.** Agree one year, one sample and the key tax outputs. Output: scope note. 2. **Map.** Document input mappings and missing-data assumptions. Output: mapping document. @@ -418,11 +424,11 @@ Four steps, each with a clear output. **CE would provide:** One year of tax-unit records in the TAXSIM input format; Its published TAXSIM estimates and the survey weights; Staff time to review the discrepancy log. -**PolicyEngine would provide:** The open-source emulator, which installs and runs inside BLS; Runs pinned to emulator and model versions; A diagnosis of each difference, then a benefit extension proposal; Open AI skills that run PolicyEngine from Claude Code or Codex. +**PolicyEngine would provide:** The open-source emulator, which installs and runs inside BLS; Runs pinned to emulator and model versions; A diagnosis of each difference, then a benefit extension proposal; Open-source AI skills that run PolicyEngine from Claude Code or Codex. Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. On the AI skills, which speak to the CE program’s limited implementation resources: PolicyEngine’s skills are open source (MIT) in PolicyEngine/policyengine-skills, published for Claude Code as the policyengine-claude plugin (/plugin marketplace add PolicyEngine/policyengine-claude) with a Codex install script and an MCP server; they include household calculations and microsimulation runs on the same rules. There is no TAXSIM-specific skill yet, so do not say it maps CE files out of the box; mapping CE fields to TAXSIM inputs would be pilot work. Confidential CE records stay under BLS’s own rules for AI tools; the skills are useful with public-use microdata and for writing the comparison code. -## 33. Q&A and discussion (60–90 min) +## 34. Q&A and discussion (60–90 min) - Which outcomes and years would be most useful? - Which input assumptions create the most uncertainty? @@ -436,7 +442,7 @@ Proposed next steps for discussion. The emulator is an open-source package with Use the separate 30-minute discussion for questions on the methods and potential CE collaboration. The links on the slide open the TAXSIM site, the web runner, the validation dashboard and the source code. -## 34. Thank you (closing slide) +## 35. Thank you (closing slide) - Max Ghenis · max@policyengine.org - Pavel Makarchuk · pavel@policyengine.org diff --git a/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md b/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md index 841e195..02629b9 100644 --- a/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md +++ b/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md @@ -1,8 +1,8 @@ # Validation section: speaker script (David) -Slides 16–19, 10 minutes in total. Spoken pace is about 130 words a minute; the rest of the time is for pointing at the slide and clicking through the live dashboard. Timings: validation steps and triangle 3 min, shaping the emulator 2 min, dashboard 3 min, progress and recent issues 2 min. +Slides 20–23, 10 minutes in total, then slide 24, When the 2026 tax rules will be ready (44–46 min, 2 minutes; its notes carry the script), before handing back to Max for benefit imputation. Spoken pace is about 130 words a minute; the rest of the time is for pointing at the slide and clicking through the live dashboard. Timings: validation steps and triangle 3 min, shaping the emulator 2 min, dashboard 3 min, progress and recent issues 2 min. -## Slide 16. Three calculations, one arbiter (29–32 min) +## Slide 20. Three calculations, one arbiter (34–37 min) Validation for us isn't a single benchmark number. It's a process we run on every disagreement, and it has four steps. @@ -18,7 +18,7 @@ Validation for us isn't a single benchmark number. It's a process we run on ever *Point to step 4.* Once the fix ships, we rerun the record to confirm the disagreement is gone. -## Slide 17. How this process shapes the emulator (32–34 min) +## Slide 21. How this process shapes the emulator (37–39 min) A resolved case doesn't end with the fix. @@ -32,7 +32,7 @@ A resolved case doesn't end with the fix. *Point to the line at the bottom.* The loop never closes for good. Every PolicyEngine release and every TAXSIM update reruns the comparison. -## Slide 18. The public validation dashboard (34–37 min, live) +## Slide 22. The public validation dashboard (39–42 min, live) This is where that comparison lives, and it's public. A quick overview, then one or two examples. @@ -50,7 +50,7 @@ One caution: these numbers move whenever either engine changes. That's the point *If asked for headline figures:* for 2023, 89.8% of households agree on federal tax and 94.9% on state tax, within 1% of gross income (data update of September 23, 2026). Choose the two example states on the morning of the talk, after checking that the page loads. -## Slide 19. From a reported difference to a fix (37–39 min) +## Slide 23. From a reported difference to a fix (42–44 min) Here's where we are. *Point to the figures.* Since July 2024 there have been more than 1,100 issues on the emulator's public tracker, and more than 1,000 are resolved. Differences run both ways: we've sent NBER more than 150 questions about TAXSIM's own rules, and NBER has confirmed more than 100 TAXSIM corrections on the tracker. That last number is a floor. TAXSIM's working builds aren't public, so we only count the corrections NBER mentions in a comment. diff --git a/slideshows/bls-taxsim-2026/config.ts b/slideshows/bls-taxsim-2026/config.ts index c777c40..dedac1c 100644 --- a/slideshows/bls-taxsim-2026/config.ts +++ b/slideshows/bls-taxsim-2026/config.ts @@ -5,7 +5,7 @@ import { blsSlideComponents } from './slides'; export const blsTaxsim2026Config: SlideshowConfig = { id: 'bls-taxsim-2026', title: 'BLS TAXSIM seminar', - description: 'A 60-minute talk on the TAXSIM emulator, validation, and tax and benefit imputation for the Consumer Expenditure Surveys.', + description: 'A 60-minute talk on the TAXSIM emulator, validation, and tax and benefit imputation for federal surveys, including the Consumer Expenditure Surveys.', date: '2026-10-08', location: 'Bureau of Labor Statistics, Suitland', footerText: 'BLS · October 8, 2026', diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 3ce6ce4..f886441 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -101,7 +101,7 @@ export interface BlsSlideContent { source?: string; }; /** A section opener: the section number; the title is the section name. */ - divider?: { number: string }; + divider?: { number: string; presenter?: string }; /** How the collaboration started: the testing process before the emulator and the milestones after it. */ origins?: { processTitle: string; @@ -184,7 +184,6 @@ const TAXSIM_DASHBOARD = { label: "policyengine.org/us/taxsim/dashboard", url: " /** Slide content. 60 minutes of presentation, including the live demo, plus 30 minutes of Q&A. */ export const blsSlides: BlsSlideContent[] = [ - // Introduction and context: 12 minutes { "id": "cover", "title": "Tax and benefit imputation for federal surveys", @@ -203,29 +202,32 @@ export const blsSlides: BlsSlideContent[] = [ "body": [ "Introduction and context", "The TAXSIM emulator", - "Validation", "Beyond TAXSIM", + "Validation", + "Benefit imputation", "What’s next", "Q&A and discussion" ], "descriptions": [ "What PolicyEngine is, who funds and uses it, why we built an emulator, and how the NBER collaboration started.", "A drop-in TAXSIM interface, where each calculation happens, versions and releases, and a live demo in the browser.", - "How a disagreement is resolved with the engines, independent validators and the law, how that shapes the emulator, the public dashboard, and our progress.", - "What PolicyEngine models beyond TAXSIM’s inputs, and methods for missing survey inputs, SNAP participation and Medicaid valuation.", - "The 2026 tax rules, Axiom as our next-generation rules engine, and a possible CE pilot.", + "What PolicyEngine models beyond TAXSIM’s inputs and outputs, and the CE fields that could feed it.", + "How a disagreement is resolved with the engines, independent validators and the law, the public dashboard, and the 2026 tax rules.", + "Methods for missing survey inputs, what counts as household resources, and how to validate benefit imputations.", + "Axiom as our next-generation rules engine, with a live run, and a possible CE pilot.", "Questions on the methods, implementation, and opportunities for collaboration." ], "minutes": 1, - "notes": "The first five sections total 60 minutes, leaving no slack before the 30-minute Q&A. Show the drop-in swap, where each calculation happens and how versions work, then run the live demo, then give an overview of the validation process. Then show what PolicyEngine models beyond TAXSIM, and introduce benefit imputation as an extension that needs more data and methodological choices. Close with what’s next: the 2026 rules, Axiom and a possible CE pilot. Reserve 30 minutes for Q&A. Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); testing in the validation section; in-kind benefits on slides 23 and 25; the annual update and the road map in What’s next (slides 28–32). Each of those slides’ notes carries the spoken answer." + "notes": "The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic on slide 4; funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); in-kind benefits on slides 18 and 27; testing in the validation section (slides 20–23); the annual update on slide 24; the road map in What’s next (slides 30–33). Each of those slides’ notes carries the spoken answer." }, + // Introduction and context (Max Ghenis): 11 minutes { "id": "section-intro", "title": "Introduction and context", "body": [], "minutes": 0, "notes": "Section opener. Move on after a few seconds.", - "divider": { "number": "01" } + "divider": { "number": "01", "presenter": "Max Ghenis" } }, { "id": "what-is-pe", @@ -278,7 +280,7 @@ export const blsSlides: BlsSlideContent[] = [ "cards": [ { "icon": "history", "title": "Microsimulation first", "text": "PolicyEngine launched in 2021 to model taxes and benefits for any household or survey." }, { "icon": "map-pin", "title": "State taxes, checked against TAXSIM", "text": "Our first state income tax and TAXSIM35 validation began in April 2022; beta coverage of every state followed in 2024." }, - { "icon": "book", "title": "NBER names a successor", "text": "“A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page" }, + { "icon": "book", "title": "TAXSIM’s author on a successor", "text": "“A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page" }, { "icon": "world", "title": "One model for both uses", "text": "The emulator runs TAXSIM files on the same open rules that score reforms and benefits." } ] }, @@ -321,7 +323,7 @@ export const blsSlides: BlsSlideContent[] = [ "PolicyEngine: open source since 2021, 95,000+ federal and state parameters, and benefit programs such as SNAP and Medicaid", ], "minutes": 2, - "notes": "Start on the left with TAXSIM, end on the right with PolicyEngine, and use the middle for the agreement and how one interface routes tax years. Close with: both teams validate the emulator, and the work has improved how both TAXSIM and PolicyEngine encode tax law. TAXSIM has run at NBER since the 1970s; NBER still maintains it, and more than 1,200 papers cite the 1993 paper that introduced it. Think tanks such as Brookings and federal agencies rely on it. NBER started filing differences on the emulator’s public GitHub tracker in 2024 (first issue: September 22, 2024). The memorandum of understanding with NBER was announced on September 5, 2025. policyengine-taxsim 3.0.0 was released on September 29, 2026, one of 80 PyPI releases since February 2026. One interface covers every tax year: TAXSIM35 handles 1960–2020 (state law from 1977) and PolicyEngine handles 2021 onward. PolicyEngine facts (right): public code since June 2021, 133 contributors to the US model, 95,000+ parameters and 4,693 test files, from the gettsim-2026 deck (September 3, 2026); check them before the talk. The benefit list follows the Benefits and taxes section of policyengine.org/us/taxsim, which also names housing vouchers, the EITC and the CTC. Optional context for this audience, not on the slide: the CE published TAXSIM-based tax estimates from the 2013 data through the 2023 data, and the 2024 data has none (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). Sources: https://www.policyengine.org/us/research/policyengine-nber-mou-taxsim and https://pypi.org/project/policyengine-taxsim/", + "notes": "Start on the left with TAXSIM, end on the right with PolicyEngine, and use the middle for the agreement and how one interface routes tax years. Close with: both teams validate the emulator, and the work has improved how both TAXSIM and PolicyEngine encode tax law. TAXSIM has run at NBER since the 1970s; NBER still maintains it, and more than 1,200 papers cite the 1993 paper that introduced it. Think tanks such as Brookings and federal agencies rely on it. NBER started filing differences on the emulator’s public GitHub tracker in 2024 (first issue: September 22, 2024). The memorandum of understanding with NBER was announced on September 5, 2025. policyengine-taxsim 3.0.0 was released on September 29, 2026, one of 80 PyPI releases since February 2026. One interface covers every tax year: TAXSIM35 handles 1960–2020 (state law from 1977) and PolicyEngine handles 2021 onward. PolicyEngine facts (right): public code since June 2021, 133 contributors to the US model, 95,000+ parameters (from the gettsim-2026 deck, September 3, 2026) and 4,932 test files (recounted October 8, 2026). The benefit list follows the Benefits and taxes section of policyengine.org/us/taxsim, which also names housing vouchers, the EITC and the CTC. Optional context for this audience, not on the slide: the CE published TAXSIM-based tax estimates from the 2013 data through the 2023 data, and the 2024 data has none (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). Sources: https://www.policyengine.org/us/research/policyengine-nber-mou-taxsim and https://pypi.org/project/policyengine-taxsim/", "headerLink": TAXSIM_SITE, "bridge": { "left": { @@ -356,15 +358,14 @@ export const blsSlides: BlsSlideContent[] = [ } } }, - - // The TAXSIM emulator: 6 minutes + // The TAXSIM emulator (Pavel Makarchuk): 18 minutes, including the live demo { "id": "section-emulator", "title": "The TAXSIM emulator", "body": [], "minutes": 0, "notes": "Section opener. Move on after a few seconds.", - "divider": { "number": "02" } + "divider": { "number": "02", "presenter": "Pavel Makarchuk" } }, { "id": "drop-in", @@ -443,19 +444,19 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Versions and releases", "body": [], "minutes": 2, - "notes": "Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers. Merged changes ship automatically, often several in one release: both repositories bump the version from the changelog fragments and publish to PyPI after the tests pass (PolicyEngine US waits for its full suite; the emulator for lint and pytest on Linux, macOS and Windows; policyengine-us push.yaml, policyengine-taxsim ci.yml). From July 10 to October 7 that was 286 PolicyEngine US releases, about three a day, and 15 emulator releases; each release is small, about two changelog entries. Tests run on every pull request, but GitHub does not block a merge that fails them; merging is a reviewer’s decision. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves on Python 3.11 (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck); on Python 3.10 it cannot resolve, and an unpinned install there falls back to an older 1.x model with the older S-corporation default. Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI does not keep every PolicyEngine US release: only five from before July 2026 remain, and 1.711.0, the emulator’s own minimum, is gone. For long-lived reproducibility, archive the installed environment or wheels with the results. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: CI checks each pull request for a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; under the current release script a breaking entry bumps the major version, and the only breaking change so far, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; for the 121 issues NBER filed in the last 90 days, the median first PolicyEngine reply came in 23.5 hours. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026.", + "notes": "Answers Thesia’s production-reliability and version-notes questions. Release schedule: there is no separate version per tax year. Parameters carry dated values (the EITC phase-out start file runs from 1995 and cites IRS releases through 2026), so every release computes every tax year it covers. Merged changes ship automatically, often several in one release: both repositories bump the version from the changelog fragments and publish to PyPI after the tests pass (PolicyEngine US waits for its full suite; the emulator for lint and pytest on Linux, macOS and Windows; policyengine-us push.yaml, policyengine-taxsim ci.yml). From July 10 to October 7 that was 286 PolicyEngine US releases, about three a day, and 15 emulator releases; each release is small, about two changelog entries. Tests run on every pull request, but GitHub does not block a merge that fails them; merging is a reviewer’s decision. A newer release can change an earlier year’s result when a fix lands, which is why a study pins both packages: the command on the slide resolves on Python 3.11 (policyengine-taxsim 3.0.1 with PolicyEngine US 2.25.2, the versions behind the examples in this deck); on Python 3.10 it cannot resolve, and an unpinned install there falls back to an older 1.x model with the older S-corporation default. Without a pin, the emulator accepts any PolicyEngine US release from 1.711.0 on and takes the newest. The output file does not record versions yet, so log both with each run; a version stamp in the output is a reasonable request. PyPI does not keep every PolicyEngine US release: only five from before July 2026 remain, and 1.711.0, the emulator’s own minimum, is gone. For long-lived reproducibility, archive the installed environment or wheels with the results. The documentation page’s pin example (policyengine-us 1.555.0) names a version PyPI no longer has; use a current pair. Version notes: CI checks each pull request for a changelog entry typed added, changed, fixed, removed or breaking, and the CHANGELOG files in both repositories list them by version (for example, policyengine-us 2.33.1 on October 8 fixed CalEITC earned income to FTB 3514 line 19). The entries are grouped by change type, not policy area, so a tax-law-only list per tax year would be produced from the changelog and the parameter files that changed; whether to offer BLS such a digest is Max’s call. Input and output changes: the format stays TAXSIM’s; under the current release script a breaking entry bumps the major version, and the only breaking change so far, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it, and added --scorp-treatment to choose. Open pull requests would report v19, v29 and Massachusetts v36 as TAXSIM-35 defines them, without changing liabilities (#1407), and return Python runner rows in input order (#1406). Use Python 3.11 or later: PolicyEngine US 2.x requires it. Support: the public GitHub tracker, where every report and its resolution stays visible; NBER filed 121 issues in the last 90 days; for the 113 with a reply, the median first PolicyEngine reply came in 23.5 hours, or 24.4 hours counting the 8 without one as unanswered. There is no support email; any support commitment to BLS is Max’s call. Documentation: policyengine.org/us/taxsim (install, usage, variable mappings), the GitHub README, the R package (policyenginetaxsim 0.1.0, installed from GitHub, not yet on CRAN) and the PolicyEngine US documentation at policyengine.github.io/policyengine-us. Sources: pypi.org/pypi/policyengine-us/json, pypi.org/pypi/policyengine-taxsim/json, github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md and the GitHub issue tracker, October 8, 2026.", "headerLink": { "label": "Changelog", "url": "https://github.com/PolicyEngine/policyengine-taxsim/blob/main/CHANGELOG.md" }, "releases": { "stats": [ { "value": "286", "label": "PolicyEngine US releases, July 10 to October 7" }, { "value": "15", "label": "Emulator releases in the same 90 days" }, { "value": "Every year", "label": "Each release computes every tax year it covers" }, - { "value": "23.5 hours", "label": "Median first reply to NBER’s reports, last 90 days" } + { "value": "About 1 day", "label": "Median first reply to NBER’s reports, last 90 days" } ], "pin": { "title": "Pin both packages to reproduce a run", "code": "uv tool install --python 3.11 \\\n policyengine-taxsim==3.0.1 \\\n --with policyengine-us==2.25.2", - "note": "Needs Python 3.11 or later. Without a pin, the emulator takes the newest PolicyEngine US release. Record both versions with each run." + "note": "Needs Python 3.11 or later. Without a pin, the emulator takes the newest PolicyEngine US release. PyPI does not keep every release, so record both versions and archive the environment with each run." }, "items": [ { "icon": "calendar", "title": "One release, every tax year", "text": "Parameters carry dated values, so there is no separate version per tax year." }, @@ -466,8 +467,6 @@ export const blsSlides: BlsSlideContent[] = [ "takeaway": "The file format stays TAXSIM’s. The last breaking change, 3.0.0 on September 29, made S-corporation income passive by default for the net investment income tax, as TAXSIM treats it." } }, - - // Live demonstration: 13 minutes { "id": "demo-live", "title": "Live demo: run the sample file", @@ -479,130 +478,14 @@ export const blsSlides: BlsSlideContent[] = [ "url": "https://www.policyengine.org/us/taxsim/run" } }, - - // Validation: 10 minutes - { - "id": "section-validation", - "title": "Validation", - "body": [], - "minutes": 0, - "notes": "Section opener. Move on after a few seconds.", - "divider": { "number": "03" } - }, - { - "id": "three-checks", - "title": "Three calculations, one arbiter", - "body": [], - "minutes": 3, - "notes": "Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests, and a release reaches PyPI only after its tests pass; merging is a reviewer’s decision, so GitHub does not block a failing pull request automatically. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026).", - "triangle": { - "corners": { - "top": { "icon": "building", "title": "TAXSIM35", "text": "NBER’s calculator, the reference engine" }, - "left": { "icon": "github", "title": "PolicyEngine", "text": "Open-source rules, run through the emulator" }, - "right": { "icon": "file-text", "title": "Third-party validators", "text": "TaxAct, Axiom and others" } - }, - "sides": { - "left": "Compared on every record", - "right": "An independent check when they disagree", - "bottom": "Reconciled against the forms" - }, - "center": { "title": "Statutes and official instructions", "text": "The law decides which calculation is right" }, - "steps": [ - { "title": "Issue filed", "text": "A mismatch between PolicyEngine and TAXSIM on a CPS record becomes an issue." }, - { "title": "Agentic review", "text": "An agentic workflow explores the disagreement using both engines, the validators and the statutes." }, - { "title": "Recommendation", "text": "The findings recommend adjusting one of the engines, or agreeing a convention with NBER." }, - { "title": "Rerun", "text": "After the fix ships, we rerun the record to confirm the disagreement is resolved." } - ], - "takeaway": "Agreement measures consistency. The law decides correctness, because two engines can share an error." - } - }, - { - "id": "validation-process", - "title": "How this process shapes the emulator", - "body": [], - "minutes": 2, - "notes": "Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. If asked about #1248: Dan Feenberg opened it on September 25 about his own TAXSIM changes, closed it on September 29, and has filed issues since. The dashboard data also fixed the Alabama coding (state 1, 1,155 households, separate from Texas) in the September 24 release. Source: https://www.policyengine.org/us/taxsim/dashboard", - "process": { - "stats": [ - { "value": "111,347", "label": "Enhanced CPS households" }, - { "value": "2021–2025", "label": "Tax years" }, - { "value": "50 + DC", "label": "States in the comparison" }, - { "value": "2 engines", "label": "TAXSIM35 and PolicyEngine" } - ], - "steps": [ - { "title": "Compile", "text": "Every resolved case is stored as an issue on the emulator’s GitHub tracker, with the input row, both results and the resolution." }, - { "title": "Lock in", "text": "PolicyEngine fixes ship with a test case, so a resolved disagreement cannot quietly return." }, - { "title": "Compare by area", "text": "The dashboard reruns every state and year, showing how complete each area’s agreement is." }, - { "title": "Prioritize", "text": "The areas with the lowest agreement set what we look at next." } - ], - "loop": "Each PolicyEngine release and each TAXSIM update reruns the comparison." - } - }, - { - "id": "dashboard-live", - "title": "The public validation dashboard", - "body": [], - "minutes": 3, - "notes": "About 3 minutes: a quick overview, then one or two examples. Show the dashboard as the output of the process, not as a list of figures. Pick a year, change the tolerance, scroll the state table and inspect one state to show the household list; a second state with near-complete agreement shows what a resolved area looks like. The headline figures are in the notes for the previous slide if someone asks. Check the page on the morning of the talk, because it can update. Click the slide title before you press the arrow keys. If the frame does not load, open policyengine.org/us/taxsim/dashboard in a browser tab. Dashboard steps: (1) Pick a tax year, 2021 to 2025; (2) Choose a tolerance; (3) See agreement by state; (4) Inspect a state to list its households.", - "headerLink": TAXSIM_DASHBOARD, - "embed": { - "url": "https://www.policyengine.org/us/taxsim/dashboard" - } - }, - { - "id": "issue-process", - "title": "From a reported difference to a fix", - "body": [], - "minutes": 2, - "notes": "Present the change this work has driven in both engines. Do not say how quickly NBER corrects TAXSIM: TAXSIM is closed source with no public release cadence, so we cannot track when its corrections ship, only that NBER confirmed them. NBER files most of the difference reports; we file questions when TAXSIM appears to differ from the law. Each case is reproduced with a minimal household, classified, and resolved. Exact counts on October 7, 2026: 1,186 issues on the policyengine-taxsim tracker since July 15, 2024, of which 1,010 are closed; 159 questions titled Does TAXSIM or Does taxsimtest since February 2026. TAXSIM corrections: about 106 issues have an NBER comment that confirms a TAXSIM correction (for example “Agreed, corrected”, “Fixed in Taxsim” or “I changed taxsim”), and about 60 more have only “Agreed” or “Now matches”, which do not say which engine changed. This is a lower bound: TAXSIM’s working builds are not public, so changes made without a comment are not counted. PolicyEngine changes, if asked: 163 PolicyEngine US pull requests since July 2024 cite TAXSIM comparisons (mostly state rule corrections), and the emulator has 180 merged pull requests, about a third of them tooling such as CI, versioning and the dashboard. These are not on the slide, because merged pull requests and confirmed corrections are not counted the same way and should not be compared. The tracker grows by about 40 issues a day this week, so the slide uses rounded figures. The three examples show the three outcomes: #1241 (opened September 25, fixed by PR #1244 on September 29), #1235 (opened September 24; NBER replied Agreed and corrected TAXSIM), and #1251 (Minnesota renter’s credit: the comparison return had no Schedule M1RENT). Sources: https://github.com/PolicyEngine/policyengine-taxsim/issues and https://github.com/PolicyEngine/policyengine-us/pulls", - "process": { - "stats": [ - { "value": "1,100+", "label": "Issues on the public tracker since July 2024" }, - { "value": "1,000+", "label": "Issues resolved" }, - { "value": "150+", "label": "Questions we raised on TAXSIM’s own rules" }, - { "value": "100+", "label": "TAXSIM corrections NBER confirmed on the tracker" } - ], - "steps": [ - { "title": "Report", "text": "" }, - { "title": "Reproduce", "text": "" }, - { "title": "Classify", "text": "" }, - { "title": "Resolve", "text": "" }, - { "title": "Confirm", "text": "" } - ], - "examples": [ - { - "tag": "#1241 · Oregon", - "title": "PolicyEngine fix", - "text": "The emulator put Oregon’s kicker refund inside state tax, but not in the rebate field.", - "outcome": "Fixed in the emulator", - "url": "https://github.com/PolicyEngine/policyengine-taxsim/issues/1241" - }, - { - "tag": "#1235 · Massachusetts", - "title": "TAXSIM correction", - "text": "TAXSIM still applied a bank-interest deduction that Massachusetts repealed in 2024.", - "outcome": "Confirmed and corrected by NBER", - "url": "https://github.com/PolicyEngine/policyengine-taxsim/issues/1235" - }, - { - "tag": "#1251 · Minnesota", - "title": "Input difference", - "text": "The comparison return left out Minnesota’s renter’s credit, which PolicyEngine calculates.", - "outcome": "Explained, no change to either engine", - "url": "https://github.com/PolicyEngine/policyengine-taxsim/issues/1251" - } - ] - } - }, - - // Beyond TAXSIM + // Beyond TAXSIM (Pavel Makarchuk): 5 minutes { "id": "section-benefits", "title": "Beyond TAXSIM", "body": [], "minutes": 0, "notes": "Section opener. Move on after a few seconds.", - "divider": { "number": "04" } + "divider": { "number": "03", "presenter": "Pavel Makarchuk" } }, { "id": "input-mapping", @@ -883,88 +766,119 @@ export const blsSlides: BlsSlideContent[] = [ } } }, + // Validation and the annual update (David Trimmer): 12 minutes { - "id": "imputation", - "title": "Imputing a distribution of missing inputs", - "body": [ - "Harmonize variables across donor and recipient surveys", - "Learn conditional distributions using shared characteristics", - "Draw plausible values for missing inputs", - "Assess distributions and sensitivity across imputations" - ], - "minutes": 2, - "notes": "A donor survey observes the variable of interest and predictors shared with the recipient survey. A conditional distribution permits households with similar observed characteristics to have different imputed values. That can matter around tax-benefit thresholds. Multiple draws can reveal sensitivity, but they do not automatically solve model misspecification or preserve every joint relationship. The prior deck names CPS, ACS, SCF, SIPP and tax microdata. This slide does not claim a CE implementation exists. Source: local IARIW 2026 ImputationSlide.tsx.", - "sourcesPanel": { - "sourcesTitle": "Sources fused into PolicyEngine’s US microdata", - "sources": [ - { "code": "CPS", "name": "Current Population Survey", "role": "The spine: demographics, income, labor force." }, - { "code": "ACS", "name": "American Community Survey", "role": "Geography, housing, sub-state detail." }, - { "code": "SCF", "name": "Survey of Consumer Finances", "role": "Wealth, capital income, debt." }, - { "code": "SIPP", "name": "Survey of Income and Program Participation", "role": "Program take-up, dynamics, transitions." }, - { "code": "PUF", "name": "IRS Public Use File", "role": "Tax-unit income detail, itemized deductions." } + "id": "section-validation", + "title": "Validation", + "body": [], + "minutes": 0, + "notes": "Section opener. Move on after a few seconds.", + "divider": { "number": "04", "presenter": "David Trimmer" } + }, + { + "id": "three-checks", + "title": "Three calculations, one arbiter", + "body": [], + "minutes": 3, + "notes": "Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests, and a release reaches PyPI only after its tests pass; merging is a reviewer’s decision, so GitHub does not block a failing pull request automatically. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026).", + "triangle": { + "corners": { + "top": { "icon": "building", "title": "TAXSIM35", "text": "NBER’s calculator, the reference engine" }, + "left": { "icon": "github", "title": "PolicyEngine", "text": "Open-source rules, run through the emulator" }, + "right": { "icon": "file-text", "title": "Third-party validators", "text": "TaxAct, Axiom and others" } + }, + "sides": { + "left": "Compared on every record", + "right": "An independent check when they disagree", + "bottom": "Reconciled against the forms" + }, + "center": { "title": "Statutes and official instructions", "text": "The law decides which calculation is right" }, + "steps": [ + { "title": "Issue filed", "text": "A mismatch between PolicyEngine and TAXSIM on a CPS record becomes an issue." }, + { "title": "Agentic review", "text": "An agentic workflow explores the disagreement using both engines, the validators and the statutes." }, + { "title": "Recommendation", "text": "The findings recommend adjusting one of the engines, or agreeing a convention with NBER." }, + { "title": "Rerun", "text": "After the fix ships, we rerun the record to confirm the disagreement is resolved." } ], - "blocks": [ - { "tag": "Technique", "text": "Quantile regression forests learn the full distribution of each missing variable from many predictors, then sample from it." }, - { "tag": "Why a distribution", "text": "Households with the same observed traits get different draws, which matters near tax and benefit thresholds." }, - { "tag": "For the CE", "text": "Donor surveys and shared predictors would need an explicit assessment before we transfer the method." } - ] + "takeaway": "Agreement measures consistency. The law decides correctness, because two engines can share an error." } }, { - "id": "snap-medicaid", - "title": "What counts as household resources?", - "body": [ - "SNAP: program units, eligibility and potential allotments", - "Participation assumptions convert eligibility into receipt estimates", - "Medicaid: eligibility and enrollment need separate treatment", - "A monetary Medicaid value requires a defined valuation method" - ], + "id": "validation-process", + "title": "How this process shapes the emulator", + "body": [], "minutes": 2, - "notes": "Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 10 states, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026).", - "resourceBars": { - "intro": "One California household in 2025 (a single parent, children aged 4 and 7, $25,000 in wages), four resource concepts.", - "rows": [ - { "label": "Earnings", "detail": "Wages before taxes", "value": 25000 }, - { "label": "After taxes and credits", "detail": "+$9,461: EITC, child tax credit and California credits, less payroll tax", "value": 34461 }, - { "label": "Plus cash and food benefits", "detail": "+$9,470: CalWORKs $5,200, SNAP $2,442, school meals $1,116, WIC $712", "value": 43931 }, - { "label": "Plus Medi-Cal at cost", "detail": "+$27,709 for three enrollees", "value": 71640 } + "notes": "Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. If asked about #1248: Dan Feenberg opened it on September 25 about his own TAXSIM changes, closed it on September 29, and has filed issues since. The dashboard data also fixed the Alabama coding (state 1, 1,155 households, separate from Texas) in the September 24 release. Source: https://www.policyengine.org/us/taxsim/dashboard", + "process": { + "stats": [ + { "value": "111,347", "label": "Enhanced CPS households" }, + { "value": "2021–2025", "label": "Tax years" }, + { "value": "50 + DC", "label": "States in the comparison" }, + { "value": "2 engines", "label": "TAXSIM35 and PolicyEngine" } ], - "takeaway": "The resource concept, not the calculator, decides whether $25,000 of earnings becomes $34,000 or $72,000.", - "footnote": "PolicyEngine US 2.25.2, run October 5, 2026. Benefits assume take-up; Medi-Cal is valued at average cost per enrollee." + "steps": [ + { "title": "Compile", "text": "Every resolved case is stored as an issue on the emulator’s GitHub tracker, with the input row, both results and the resolution." }, + { "title": "Lock in", "text": "PolicyEngine fixes ship with a test case, so a resolved disagreement cannot quietly return." }, + { "title": "Compare by area", "text": "The dashboard reruns every state and year, showing how complete each area’s agreement is." }, + { "title": "Prioritize", "text": "The areas with the lowest agreement set what we look at next." } + ], + "loop": "Each PolicyEngine release and each TAXSIM update reruns the comparison." } }, { - "id": "benefit-validation", - "title": "Validation of benefit imputations", - "body": [ - "Compare receipt and amounts with suitable external benchmarks", - "Examine errors across household groups", - "Use holdout data and alternative assumptions where feasible", - "Treat calibration and independent validation separately" - ], - "minutes": 2, - "notes": "Meyer and Mittag link the CPS to administrative records and find that the survey misses about 40 percent of SNAP recipients (NBER Working Paper 21676). This is why PolicyEngine computes benefits from program rules and calibrates weights to administrative totals instead of relying on reported receipt. Explain that fitting a target is not independent validation against that target. CE weight changes would be a separate methodological decision, not a prerequisite for the initial tax comparison. Source: the cpid-webinar-2026 deck’s baseline slide and policyengine-slides/slideshows/iariw-2026/slides/CalibrationSlide.tsx.", - "cards": [ - { "icon": "chart-bar", "title": "External benchmarks", "text": "Compare imputed receipt and amounts with administrative totals." }, - { "icon": "users", "title": "Errors by group", "text": "Check how errors differ by income, household type and state." }, - { "icon": "flask", "title": "Holdout tests", "text": "Test on data held back from estimation, and try alternative assumptions." }, - { "icon": "scale", "title": "Calibration is not validation", "text": "A target used to fit the weights cannot also validate them." } - ], - "hero": { - "value": "≈40%", - "label": "of SNAP recipients are missing from CPS reports, measured against linked administrative records.", - "source": "Meyer and Mittag, NBER Working Paper 21676" + "id": "dashboard-live", + "title": "The public validation dashboard", + "body": [], + "minutes": 3, + "notes": "About 3 minutes: a quick overview, then one or two examples. Show the dashboard as the output of the process, not as a list of figures. Pick a year, change the tolerance, scroll the state table and inspect one state to show the household list; a second state with near-complete agreement shows what a resolved area looks like. The headline figures are in the notes for the previous slide if someone asks. Check the page on the morning of the talk, because it can update. Click the slide title before you press the arrow keys. If the frame does not load, open policyengine.org/us/taxsim/dashboard in a browser tab. Dashboard steps: (1) Pick a tax year, 2021 to 2025; (2) Choose a tolerance; (3) See agreement by state; (4) Inspect a state to list its households.", + "headerLink": TAXSIM_DASHBOARD, + "embed": { + "url": "https://www.policyengine.org/us/taxsim/dashboard" } }, - - // What’s next: 2026 rules, Axiom and a possible CE pilot, 11 minutes { - "id": "section-next", - "title": "What’s next", + "id": "issue-process", + "title": "From a reported difference to a fix", "body": [], - "minutes": 0, - "notes": "Section opener. Move on after a few seconds.", - "divider": { "number": "05" } + "minutes": 2, + "notes": "Present the change this work has driven in both engines. Do not say how quickly NBER corrects TAXSIM: TAXSIM is closed source with no public release cadence, so we cannot track when its corrections ship, only that NBER confirmed them. NBER files most of the difference reports; we file questions when TAXSIM appears to differ from the law. Each case is reproduced with a minimal household, classified, and resolved. Exact counts on October 7, 2026: 1,186 issues on the policyengine-taxsim tracker since July 15, 2024, of which 1,010 are closed; 159 questions titled Does TAXSIM or Does taxsimtest since February 2026. TAXSIM corrections: about 106 issues have an NBER comment that confirms a TAXSIM correction (for example “Agreed, corrected”, “Fixed in Taxsim” or “I changed taxsim”), and about 60 more have only “Agreed” or “Now matches”, which do not say which engine changed. This is a lower bound: TAXSIM’s working builds are not public, so changes made without a comment are not counted. PolicyEngine changes, if asked: 163 PolicyEngine US pull requests since July 2024 cite TAXSIM comparisons (mostly state rule corrections), and the emulator has 180 merged pull requests, about a third of them tooling such as CI, versioning and the dashboard. These are not on the slide, because merged pull requests and confirmed corrections are not counted the same way and should not be compared. The tracker grows by about 40 issues a day this week, so the slide uses rounded figures. The three examples show the three outcomes: #1241 (opened September 25, fixed by PR #1244 on September 29), #1235 (opened September 24; NBER replied Agreed and corrected TAXSIM), and #1251 (Minnesota renter’s credit: the comparison return had no Schedule M1RENT). Sources: https://github.com/PolicyEngine/policyengine-taxsim/issues and https://github.com/PolicyEngine/policyengine-us/pulls", + "process": { + "stats": [ + { "value": "1,100+", "label": "Issues on the public tracker since July 2024" }, + { "value": "1,000+", "label": "Issues resolved" }, + { "value": "150+", "label": "Questions we raised on TAXSIM’s own rules" }, + { "value": "100+", "label": "TAXSIM corrections NBER confirmed on the tracker" } + ], + "steps": [ + { "title": "Report", "text": "" }, + { "title": "Reproduce", "text": "" }, + { "title": "Classify", "text": "" }, + { "title": "Resolve", "text": "" }, + { "title": "Confirm", "text": "" } + ], + "examples": [ + { + "tag": "#1241 · Oregon", + "title": "PolicyEngine fix", + "text": "The emulator put Oregon’s kicker refund inside state tax, but not in the rebate field.", + "outcome": "Fixed in the emulator", + "url": "https://github.com/PolicyEngine/policyengine-taxsim/issues/1241" + }, + { + "tag": "#1235 · Massachusetts", + "title": "TAXSIM correction", + "text": "TAXSIM still applied a bank-interest deduction that Massachusetts repealed in 2024.", + "outcome": "Confirmed and corrected by NBER", + "url": "https://github.com/PolicyEngine/policyengine-taxsim/issues/1235" + }, + { + "tag": "#1251 · Minnesota", + "title": "Input difference", + "text": "The comparison return left out Minnesota’s renter’s credit, which PolicyEngine calculates.", + "outcome": "Explained, no change to either engine", + "url": "https://github.com/PolicyEngine/policyengine-taxsim/issues/1251" + } + ] + } }, { "id": "state-updates", @@ -1109,6 +1023,97 @@ export const blsSlides: BlsSlideContent[] = [ "source": "Source: PolicyEngine US pull requests #6898 to #7421 on GitHub." } }, + // Benefit imputation (Max Ghenis): 6 minutes + { + "id": "section-imputation", + "title": "Benefit imputation", + "body": [], + "minutes": 0, + "notes": "Section opener. Move on after a few seconds.", + "divider": { "number": "05", "presenter": "Max Ghenis" } + }, + { + "id": "imputation", + "title": "Imputing a distribution of missing inputs", + "body": [ + "Harmonize variables across donor and recipient surveys", + "Learn conditional distributions using shared characteristics", + "Draw plausible values for missing inputs", + "Assess distributions and sensitivity across imputations" + ], + "minutes": 2, + "notes": "A donor survey observes the variable of interest and predictors shared with the recipient survey. A conditional distribution permits households with similar observed characteristics to have different imputed values. That can matter around tax-benefit thresholds. Multiple draws can reveal sensitivity, but they do not automatically solve model misspecification or preserve every joint relationship. The prior deck names CPS, ACS, SCF, SIPP and tax microdata. This slide does not claim a CE implementation exists. Source: local IARIW 2026 ImputationSlide.tsx.", + "sourcesPanel": { + "sourcesTitle": "Sources fused into PolicyEngine’s US microdata", + "sources": [ + { "code": "CPS", "name": "Current Population Survey", "role": "The spine: demographics, income, labor force." }, + { "code": "ACS", "name": "American Community Survey", "role": "Geography, housing, sub-state detail." }, + { "code": "SCF", "name": "Survey of Consumer Finances", "role": "Wealth, capital income, debt." }, + { "code": "SIPP", "name": "Survey of Income and Program Participation", "role": "Program take-up, dynamics, transitions." }, + { "code": "PUF", "name": "IRS Public Use File", "role": "Tax-unit income detail, itemized deductions." } + ], + "blocks": [ + { "tag": "Technique", "text": "Quantile regression forests learn the full distribution of each missing variable from many predictors, then sample from it." }, + { "tag": "Why a distribution", "text": "Households with the same observed traits get different draws, which matters near tax and benefit thresholds." }, + { "tag": "For the CE", "text": "Donor surveys and shared predictors would need an explicit assessment before we transfer the method." } + ] + } + }, + { + "id": "snap-medicaid", + "title": "What counts as household resources?", + "body": [ + "SNAP: program units, eligibility and potential allotments", + "Participation assumptions convert eligibility into receipt estimates", + "Medicaid: eligibility and enrollment need separate treatment", + "A monetary Medicaid value requires a defined valuation method" + ], + "minutes": 2, + "notes": "Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 9 states and DC, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026).", + "resourceBars": { + "intro": "One California household in 2025 (a single parent, children aged 4 and 7, $25,000 in wages), four resource concepts.", + "rows": [ + { "label": "Earnings", "detail": "Wages before taxes", "value": 25000 }, + { "label": "After taxes and credits", "detail": "+$9,461: EITC, child tax credit and California credits, less payroll tax", "value": 34461 }, + { "label": "Plus cash and food benefits", "detail": "+$9,470: CalWORKs $5,200, SNAP $2,442, school meals $1,116, WIC $712", "value": 43931 }, + { "label": "Plus Medi-Cal at cost", "detail": "+$27,709 for three enrollees", "value": 71640 } + ], + "takeaway": "The resource concept, not the calculator, decides whether $25,000 of earnings becomes $34,000 or $72,000.", + "footnote": "PolicyEngine US 2.25.2, run October 5, 2026. Benefits assume take-up; Medi-Cal is valued at average cost per enrollee." + } + }, + { + "id": "benefit-validation", + "title": "Validation of benefit imputations", + "body": [ + "Compare receipt and amounts with suitable external benchmarks", + "Examine errors across household groups", + "Use holdout data and alternative assumptions where feasible", + "Treat calibration and independent validation separately" + ], + "minutes": 2, + "notes": "Meyer and Mittag link the CPS to administrative records and find that the survey misses about 40 percent of SNAP recipients (NBER Working Paper 21676). This is why PolicyEngine computes benefits from program rules and calibrates weights to administrative totals instead of relying on reported receipt. Explain that fitting a target is not independent validation against that target. CE weight changes would be a separate methodological decision, not a prerequisite for the initial tax comparison. Source: the cpid-webinar-2026 deck’s baseline slide and policyengine-slides/slideshows/iariw-2026/slides/CalibrationSlide.tsx.", + "cards": [ + { "icon": "chart-bar", "title": "External benchmarks", "text": "Compare imputed receipt and amounts with administrative totals." }, + { "icon": "users", "title": "Errors by group", "text": "Check how errors differ by income, household type and state." }, + { "icon": "flask", "title": "Holdout tests", "text": "Test on data held back from estimation, and try alternative assumptions." }, + { "icon": "scale", "title": "Calibration is not validation", "text": "A target used to fit the weights cannot also validate them." } + ], + "hero": { + "value": "≈40%", + "label": "of SNAP recipients are missing from CPS reports, measured against linked administrative records.", + "source": "Meyer and Mittag, NBER Working Paper 21676" + } + }, + // What’s next (Max Ghenis): 8 minutes + { + "id": "section-next", + "title": "What’s next", + "body": [], + "minutes": 0, + "notes": "Section opener. Move on after a few seconds.", + "divider": { "number": "06", "presenter": "Max Ghenis" } + }, { "id": "axiom-plan", "title": "Axiom: our next-generation rules engine", @@ -1138,7 +1143,7 @@ export const blsSlides: BlsSlideContent[] = [ "tone": "next", "items": [ "PolicyEngine’s Python interface wraps Axiom, as it already does for a Belgium pilot", - "The TAXSIM emulator can run on Axiom", + "The TAXSIM emulator could run on Axiom", "New programs arrive as encodings of the law, with tests" ] }, @@ -1215,8 +1220,7 @@ export const blsSlides: BlsSlideContent[] = [ "minutes": 2, "notes": "Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. On the AI skills, which speak to the CE program’s limited implementation resources: PolicyEngine’s skills are open source (MIT) in PolicyEngine/policyengine-skills, published for Claude Code as the policyengine-claude plugin (/plugin marketplace add PolicyEngine/policyengine-claude) with a Codex install script and an MCP server; they include household calculations and microsimulation runs on the same rules. There is no TAXSIM-specific skill yet, so do not say it maps CE files out of the box; mapping CE fields to TAXSIM inputs would be pilot work. Confidential CE records stay under BLS’s own rules for AI tools; the skills are useful with public-use microdata and for writing the comparison code.", "process": { - "intro": "Four steps, each with a clear output.", - "steps": [ + "steps": [ { "title": "Scope", "text": "Agree one year, one sample and the key tax outputs.", "output": "Scope note" }, { "title": "Map", "text": "Document input mappings and missing-data assumptions.", "output": "Mapping document" }, { "title": "Compare", "text": "Run both calculations and log every difference.", "output": "Comparison and discrepancy log" }, @@ -1237,7 +1241,7 @@ export const blsSlides: BlsSlideContent[] = [ "The open-source emulator, which installs and runs inside BLS", "Runs pinned to emulator and model versions", "A diagnosis of each difference, then a benefit extension proposal", - "Open AI skills that run PolicyEngine from Claude Code or Codex" + "Open-source AI skills that run PolicyEngine from Claude Code or Codex" ] } ] diff --git a/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx b/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx index 9edaeb2..31107ba 100644 --- a/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx +++ b/slideshows/bls-taxsim-2026/slides/AxiomPlan.tsx @@ -15,7 +15,7 @@ const TONES: Record +
{plan.intro &&

{plan.intro}

}
diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index ab1f9f5..6164ce9 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -143,10 +143,10 @@ export function PolicyEngineTodaySlide() {

- Funding: - a nonprofit, fiscally sponsored by the PSL Foundation, with grants from Arnold Ventures, the - National Science Foundation, the Nuffield Foundation, NEO Philanthropy and the Pritzker - Children’s Initiative, and support from organizations that build on the models, such as MyFriendBen. + PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. Grants to date include + Arnold Ventures, the National Science Foundation (POSE Phase I, 2025–26), the Nuffield Foundation, + NEO Philanthropy and the Pritzker Children’s Initiative, with support from organizations that + build on the models, such as MyFriendBen.

diff --git a/slideshows/bls-taxsim-2026/slides/SectionDivider.tsx b/slideshows/bls-taxsim-2026/slides/SectionDivider.tsx index 89814e3..c7261af 100644 --- a/slideshows/bls-taxsim-2026/slides/SectionDivider.tsx +++ b/slideshows/bls-taxsim-2026/slides/SectionDivider.tsx @@ -1,13 +1,14 @@ import Slide from '@/components/core/Slide'; -/** A section opener on the cover gradient: the section number and title. */ -export default function SectionDivider({ number, title }: { number: string; title: string }) { +/** A section opener on the cover gradient: the section number, title and presenter. The presenter line is the handoff cue. */ +export default function SectionDivider({ number, title, presenter }: { number: string; title: string; presenter?: string }) { return (

{number}

{title}

+ {presenter &&

{presenter}

}
); diff --git a/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx b/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx index 6f169be..14af318 100644 --- a/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx +++ b/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx @@ -70,7 +70,7 @@ export default function UpdateTimelineSlide({ timeline }: { timeline: UpdateTime ))} -
+
{timeline.changeGroups.map((group) => (

{group.title}

diff --git a/slideshows/bls-taxsim-2026/slides/Visuals.tsx b/slideshows/bls-taxsim-2026/slides/Visuals.tsx index eb2c099..5285506 100644 --- a/slideshows/bls-taxsim-2026/slides/Visuals.tsx +++ b/slideshows/bls-taxsim-2026/slides/Visuals.tsx @@ -329,7 +329,7 @@ export function Triangle({ triangle }: { triangle: TriangleData }) { ); } return ( -
+
    {triangle.steps.map((step, index) => ( diff --git a/slideshows/bls-taxsim-2026/slides/index.tsx b/slideshows/bls-taxsim-2026/slides/index.tsx index 22d17ba..8dbd055 100644 --- a/slideshows/bls-taxsim-2026/slides/index.tsx +++ b/slideshows/bls-taxsim-2026/slides/index.tsx @@ -35,7 +35,7 @@ function DeckSlide({ content }: { content: BlsSlideContent }) { } if (content.divider) { - return ; + return ; } if (content.cover) { @@ -45,6 +45,7 @@ function DeckSlide({ content }: { content: BlsSlideContent }) { subtitle={content.body[0]} speakers={COVER_SPEAKERS} event="BLS seminar" + contentClassName="[@media(max-height:760px)]:pt-16" /> ); } From 8494e1a98c4097ac76931b2755a238cc7378e663 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 12:17:27 -0400 Subject: [PATCH 12/18] BLS deck: stronger short-screen zoom on the 2026 timeline Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx b/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx index 14af318..251eebf 100644 --- a/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx +++ b/slideshows/bls-taxsim-2026/slides/UpdateTimeline.tsx @@ -23,7 +23,7 @@ export default function UpdateTimelineSlide({ timeline }: { timeline: UpdateTime const slots = timeline.months.length * SLOTS_PER_MONTH; const columns = `12rem repeat(${slots}, minmax(0, 1fr))`; return ( -
    +
    {timeline.stats.map((stat) => (
    From 5793df8ede923c4dae2994f034230927fa2c9c9f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 12:26:44 -0400 Subject: [PATCH 13/18] BLS deck: final review nits Notes follow the new order (benefit imputation covers missing data; the demo leads into Beyond TAXSIM); the 2026 timeline notes carry the change panels hidden on short screens; 'Funders to date' on the funding strip; checklist and section-comment fixes. The ce-pilot intro line was removed earlier on purpose: the four numbered steps already say it, and it freed room at 720px. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/README.md | 2 +- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 8 ++++---- slideshows/bls-taxsim-2026/content.ts | 10 +++++----- slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/slideshows/bls-taxsim-2026/README.md b/slideshows/bls-taxsim-2026/README.md index 02624d7..2bbe45e 100644 --- a/slideshows/bls-taxsim-2026/README.md +++ b/slideshows/bls-taxsim-2026/README.md @@ -25,6 +25,6 @@ Agenda and presenters: introduction (Max Ghenis, 11 min); the TAXSIM emulator wi - `SPEAKER-NOTES.md`: readable presenter track and preparation checklist, kept in step with `content.ts`. - `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 20–23, 10 minutes). -The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, after the core assumptions and before validation. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (8) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (16 and 18) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. +The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, at the end of the emulator section, before Beyond TAXSIM. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (8) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (16 and 18) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. The example results on slide 12 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 27 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 23 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 24 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 2138843..b310cc2 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -9,7 +9,7 @@ Based on the September 2025 CRS TAXSIM section, PWBM 2026 validation material, I - Presenters: Max Ghenis (sections 01, 05 and 06), Pavel Makarchuk (02 and 03), David Trimmer (04). Speakers change only at the section dividers, which name the presenter. - Rehearse the live demo (slide 14) and the live dashboard (slide 22) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. - On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 21 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). -- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 21 notes and the slide 22 footnote if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. +- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 21 notes if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. - The validation section (slides 20–23, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. - Open policyengine.org/us/taxsim/run once before the talk: its first load took 9 seconds on October 8. - Open slide 31 once before the talk: the embedded Axiom page took about 20 seconds to render the first time on October 8. @@ -49,7 +49,7 @@ Section divider 01, presented by Max Ghenis. Move on after a few seconds. - Households: survey data enhanced and calibrated, or any household you enter - Reforms: change any parameter and see the cost, poverty and distributional effects -Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the emulator section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026). +Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the benefit imputation section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026). ## 5. PolicyEngine today (4–5 min) @@ -201,7 +201,7 @@ Answers Thesia’s production-reliability and version-notes questions. Release s Live page: https://www.policyengine.org/us/taxsim/run -Go straight into the live demo after the routing diagram and before validation. Click inside the frame to use the page. The frame keeps keyboard focus, so click the slide title before you press the arrow keys again. Use Expand for a larger view. Do not use the email form. Run and download in browser saves a CSV on the presentation laptop; open it to show the results for each household. Rehearse on the presentation laptop and network: confirm that the frame loads and note how long the run takes. Start by loading the 3-household sample and reading household 1 aloud: a married couple in California (state code 5, mstat 2) with two dependents and $80,000 and $50,000 in wages. If the frame does not load, open policyengine.org/us/taxsim/run in a browser tab. Demo steps: (1) Load the 3-household sample; (2) Keep Standard output: federal and state tax, FICA and marginal rates; (3) Run and download in the browser; (4) Read the results for each household; (5) Switch to Full for AGI, credits, deductions and AMT. +Go straight into the live demo after Versions and releases and before Beyond TAXSIM. Click inside the frame to use the page. The frame keeps keyboard focus, so click the slide title before you press the arrow keys again. Use Expand for a larger view. Do not use the email form. Run and download in browser saves a CSV on the presentation laptop; open it to show the results for each household. Rehearse on the presentation laptop and network: confirm that the frame loads and note how long the run takes. Start by loading the 3-household sample and reading household 1 aloud: a married couple in California (state code 5, mstat 2) with two dependents and $80,000 and $50,000 in wages. If the frame does not load, open policyengine.org/us/taxsim/run in a browser tab. Demo steps: (1) Load the 3-household sample; (2) Keep Standard output: federal and state tax, FICA and marginal rates; (3) Run and download in the browser; (4) Read the results for each household; (5) Switch to Full for AGI, credits, deductions and AMT. # Beyond TAXSIM @@ -326,7 +326,7 @@ Present the change this work has driven in both engines. Do not say how quickly Commitment: every state’s 2026 income tax rules complete by March 31, 2027. -BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule. +BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. If the change panels are hidden on a short screen: major law changes in 2025 were Iowa’s flat 3.8% rate, New Hampshire’s interest and dividends tax repeal, Maryland’s new top brackets and capital gains surtax, and Wisconsin’s wider 4.4% bracket and $1,200 exemption; added or corrected in the model were New Jersey’s ANCHOR and Stay NJ property tax relief, Minnesota’s K-12 education credit and subtraction, Indiana county tax rates and California’s alternative minimum tax thresholds. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule. # Benefit imputation diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index f886441..aca17d2 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -220,7 +220,7 @@ export const blsSlides: BlsSlideContent[] = [ "minutes": 1, "notes": "The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic on slide 4; funding and staffing on PolicyEngine today (slide 5); users on slides 6, 7 and 9; versions, release notes, input and output changes and support on Versions and releases (slide 13); in-kind benefits on slides 18 and 27; testing in the validation section (slides 20–23); the annual update on slide 24; the road map in What’s next (slides 30–33). Each of those slides’ notes carries the spoken answer." }, - // Introduction and context (Max Ghenis): 11 minutes + // Introduction and context (Max Ghenis): 9 minutes, 11 with the cover and agenda { "id": "section-intro", "title": "Introduction and context", @@ -238,7 +238,7 @@ export const blsSlides: BlsSlideContent[] = [ "Reforms: change any parameter and see the cost, poverty and distributional effects" ], "minutes": 2, - "notes": "Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the emulator section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026).", + "notes": "Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the benefit imputation section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026).", "custom": "what-is-pe" }, { @@ -472,7 +472,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Live demo: run the sample file", "body": [], "minutes": 10, - "notes": "Go straight into the live demo after the routing diagram and before validation. Click inside the frame to use the page. The frame keeps keyboard focus, so click the slide title before you press the arrow keys again. Use Expand for a larger view. Do not use the email form. Run and download in browser saves a CSV on the presentation laptop; open it to show the results for each household. Rehearse on the presentation laptop and network: confirm that the frame loads and note how long the run takes. Start by loading the 3-household sample and reading household 1 aloud: a married couple in California (state code 5, mstat 2) with two dependents and $80,000 and $50,000 in wages. If the frame does not load, open policyengine.org/us/taxsim/run in a browser tab. Demo steps: (1) Load the 3-household sample; (2) Keep Standard output: federal and state tax, FICA and marginal rates; (3) Run and download in the browser; (4) Read the results for each household; (5) Switch to Full for AGI, credits, deductions and AMT.", + "notes": "Go straight into the live demo after Versions and releases and before Beyond TAXSIM. Click inside the frame to use the page. The frame keeps keyboard focus, so click the slide title before you press the arrow keys again. Use Expand for a larger view. Do not use the email form. Run and download in browser saves a CSV on the presentation laptop; open it to show the results for each household. Rehearse on the presentation laptop and network: confirm that the frame loads and note how long the run takes. Start by loading the 3-household sample and reading household 1 aloud: a married couple in California (state code 5, mstat 2) with two dependents and $80,000 and $50,000 in wages. If the frame does not load, open policyengine.org/us/taxsim/run in a browser tab. Demo steps: (1) Load the 3-household sample; (2) Keep Standard output: federal and state tax, FICA and marginal rates; (3) Run and download in the browser; (4) Read the results for each household; (5) Switch to Full for AGI, credits, deductions and AMT.", "headerLink": TAXSIM_RUN, "embed": { "url": "https://www.policyengine.org/us/taxsim/run" @@ -885,7 +885,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "When the 2026 tax rules will be ready", "body": [], "minutes": 2, - "notes": "BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule.", + "notes": "BLS will want to know when each year’s rules are ready. Last year, the 2025 state income tax update ran from the first pull request on December 3, 2025 (Missouri, PR #6898) to the last merge on February 18, 2026 (California, PR #7418): 77 days, or 11 weeks. It covered 44 jurisdictions (the 41 states with a wage income tax, DC, New Hampshire’s interest and dividends tax repeal and Washington’s capital gains tax) in 47 pull requests from 5 contributors, about 22,400 added lines across 1,669 files. Pace: 2 states were done by December 31, 7 by January 31 and 14 by February 10, each worked one at a time with a full model review (median 24 days per pull request; Minnesota, New Jersey, Arizona and Michigan each added 1,300 to 3,100 lines, including programs that were missing). From February 11 to 18 the remaining 30 states were done in parallel (median 4 days per pull request), so most of the 11 weeks was the one-at-a-time phase. After release, federal non-conformity fixes followed from March to May (DC PR #7930, Idaho issue #7837, Maine issue #8122, South Carolina PR #7870), because those states did not adopt parts of the 2025 federal tax law (OBBBA), such as its larger standard deduction. The federal 2026 parameters are already in (IRS Rev. Proc. 2025-32, PR #7915). Plan for 2026: in November, set up agents that draft each state’s update from its forms (about a week of setup); from December, run states in parallel as forms are published; in February, finish the late states and rerun the TAXSIM comparison for 2026. We expect the update itself to take 1 to 6 weeks once forms are out. The commitment is that every state is complete by March 31, 2027, which leaves March as a buffer after last year’s February 18 finish. The update ships in PolicyEngine US and the emulator, independent of the Axiom migration. If the change panels are hidden on a short screen: major law changes in 2025 were Iowa’s flat 3.8% rate, New Hampshire’s interest and dividends tax repeal, Maryland’s new top brackets and capital gains surtax, and Wisconsin’s wider 4.4% bracket and $1,200 exemption; added or corrected in the model were New Jersey’s ANCHOR and Stay NJ property tax relief, Minnesota’s K-12 education credit and subtraction, Indiana county tax rates and California’s alternative minimum tax thresholds. Sources: PolicyEngine US pull requests and issues on GitHub, pulled October 7, 2026. Answers Thesia’s question on annual updates: yes, every year; the federal 2026 parameters are already in, and this slide is the state schedule.", "updateTimeline": { "stats": [ { @@ -1220,7 +1220,7 @@ export const blsSlides: BlsSlideContent[] = [ "minutes": 2, "notes": "Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. On the AI skills, which speak to the CE program’s limited implementation resources: PolicyEngine’s skills are open source (MIT) in PolicyEngine/policyengine-skills, published for Claude Code as the policyengine-claude plugin (/plugin marketplace add PolicyEngine/policyengine-claude) with a Codex install script and an MCP server; they include household calculations and microsimulation runs on the same rules. There is no TAXSIM-specific skill yet, so do not say it maps CE files out of the box; mapping CE fields to TAXSIM inputs would be pilot work. Confidential CE records stay under BLS’s own rules for AI tools; the skills are useful with public-use microdata and for writing the comparison code.", "process": { - "steps": [ + "steps": [ { "title": "Scope", "text": "Agree one year, one sample and the key tax outputs.", "output": "Scope note" }, { "title": "Map", "text": "Document input mappings and missing-data assumptions.", "output": "Mapping document" }, { "title": "Compare", "text": "Run both calculations and log every difference.", "output": "Comparison and discrepancy log" }, diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index 6164ce9..f6dfda8 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -143,7 +143,7 @@ export function PolicyEngineTodaySlide() {

    - PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. Grants to date include + PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. Funders to date include Arnold Ventures, the National Science Foundation (POSE Phase I, 2025–26), the Nuffield Foundation, NEO Philanthropy and the Pritzker Children’s Initiative, with support from organizations that build on the models, such as MyFriendBen. From f5718523302e093b11316f3ee70081ab9ecb3923 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 13:06:44 -0400 Subject: [PATCH 14/18] BLS deck: why-we-built tells the story in order; Axiom demo starts on axiom.org Slide 7 drops the BEA hero, which read as the motivation; the cards now go microsimulation first, state taxes needed a benchmark, TAXSIM's author on a successor, one model for both uses. The BEA fact moves to the slide 6 notes. Slide 31 embeds axiom.org itself (the home page's rule graph), and the notes and footnote give the path to 26 USC 21: Explore the law, search 'dependent care', graph, Run. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/README.md | 2 +- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 16 ++++++------- slideshows/bls-taxsim-2026/content.ts | 25 +++++++++------------ 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/slideshows/bls-taxsim-2026/README.md b/slideshows/bls-taxsim-2026/README.md index 2bbe45e..7ce54c7 100644 --- a/slideshows/bls-taxsim-2026/README.md +++ b/slideshows/bls-taxsim-2026/README.md @@ -21,7 +21,7 @@ Agenda and presenters: introduction (Max Ghenis, 11 min); the TAXSIM emulator wi - `slides/Releases.tsx`: versions and releases: release figures, the command that pins both packages, and what ships with every release (slide 13). - `slides/AxiomPlan.tsx`: the move to Axiom in three stages: today, planned and throughout (slide 30). - `slides/DetailContent.tsx`: a table layout with a footnote; no slide uses it at present. -- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 9), the routing diagram: an example input file, two engines by tax year, an example output file (slide 12), the three-calculations triangle with the validation steps beside it (slide 20), imputation sources (slide 26), resource bars (slide 27), cards with a headline figure (slides 7 and 28), the comparison diagram (slide 32), and questions with resource links (slide 34). `BenefitChains` is kept but no slide uses it at present. +- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 9), the routing diagram: an example input file, two engines by tax year, an example output file (slide 12), the three-calculations triangle with the validation steps beside it (slide 20), imputation sources (slide 26), resource bars (slide 27), cards with a headline figure (slide 28) and without one (slide 7), the comparison diagram (slide 32), and questions with resource links (slide 34). `BenefitChains` is kept but no slide uses it at present. - `SPEAKER-NOTES.md`: readable presenter track and preparation checklist, kept in step with `content.ts`. - `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 20–23, 10 minutes). diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index b310cc2..50c7c05 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -66,18 +66,16 @@ Use the numbers to show scale and testing, not to sell. The NBER memorandum of u - Research institutions: Brookings, AEI, Niskanen, CRFB, Georgetown, USC, the University of Michigan and UHERO - Benefit navigators: MyFriendBen, Amplifi, Mirza and Starlight -Point out the federal statistical user, BEA, because it is closest to the CE team’s work, and the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026). +Point out the federal statistical user, BEA, because it is closest to the CE team’s work: BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” Quote only those fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law (apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf). Also point out the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026). ## 7. Why we built a TAXSIM emulator (6–7 min) -**2021+** BEA runs PolicyEngine for tax years 2021 forward in its distribution of personal income. (BEA, Distribution of Personal Income technical document, June 2026) - -- **Microsimulation first.** PolicyEngine launched in 2021 to model taxes and benefits for any household or survey. -- **State taxes, checked against TAXSIM.** Our first state income tax and TAXSIM35 validation began in April 2022; beta coverage of every state followed in 2024. +- **Microsimulation first.** PolicyEngine launched in 2021 to model federal and state taxes and benefits for any household or survey. +- **State taxes needed a benchmark.** In April 2022 we merged our first state income tax and began validating against TAXSIM35, record by record. - **TAXSIM’s author on a successor.** “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page - **One model for both uses.** The emulator runs TAXSIM files on the same open rules that score reforms and benefits. -Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). The dashboard now compares tax years 2021 to 2025. Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement. Quote only those BEA fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf. +Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, every fix made for TAXSIM users also improves reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org. ## 8. How the collaboration started (7–9 min) @@ -399,11 +397,11 @@ Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. Shipped evidence for the wrapper approach: policyengine.py already runs one country on Axiom, a Belgium pilot for worker social contributions and personal income tax (policyengine.py PR #448, tests/test_be_axiom_pilot.py); a US model on Axiom has no code yet. Axiom’s validation suite already turns its cases into TAXSIM rows and runs both TAXSIM-35 and the emulator on them (axiom-oracles adapters/taxsim). On the emulator, a CI test already pins the command-line entry point (tests/test_cli_entry_point.py). The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here. -## 31. The child care credit, live in Axiom (54–56 min) +## 31. Axiom, live: the child care credit (54–56 min) -Live page: https://axiom.org/us/statute/26/21?embed=1 +Live page: https://axiom.org -A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. +A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The frame opens on axiom.org’s home page; it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) from the home page, click Explore the law, which opens the law library and rule graph; (2) search “dependent care” and open the first result, Child and dependent care credit (Federal · 26 USC § 21): the statute text sits next to its 44 encoded rules, each citing its subsection; (3) click “graph ↗”, which opens the §21 rule graph in a new browser tab with room for the Run form, and open its Run tab; (4) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. ## 32. Where this could fit in CE research (56–58 min) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index aca17d2..54d43ea 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -263,7 +263,7 @@ export const blsSlides: BlsSlideContent[] = [ "Benefit navigators: MyFriendBen, Amplifi, Mirza and Starlight" ], "minutes": 1, - "notes": "Point out the federal statistical user, BEA, because it is closest to the CE team’s work, and the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026).", + "notes": "Point out the federal statistical user, BEA, because it is closest to the CE team’s work: BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” Quote only those fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law (apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf). Also point out the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026).", "custom": "who-uses-pe" }, { @@ -271,15 +271,10 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Why we built a TAXSIM emulator", "body": [], "minutes": 1, - "notes": "Spoken setup: PolicyEngine grew out of the UBI Center; our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. Our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704), so state taxes and TAXSIM validation began together. On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). The dashboard now compares tax years 2021 to 2025. Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement. Quote only those BEA fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org, apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf.", - "hero": { - "value": "2021+", - "label": "BEA runs PolicyEngine for tax years 2021 forward in its distribution of personal income.", - "source": "BEA, Distribution of Personal Income technical document, June 2026" - }, + "notes": "Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, every fix made for TAXSIM users also improves reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org.", "cards": [ - { "icon": "history", "title": "Microsimulation first", "text": "PolicyEngine launched in 2021 to model taxes and benefits for any household or survey." }, - { "icon": "map-pin", "title": "State taxes, checked against TAXSIM", "text": "Our first state income tax and TAXSIM35 validation began in April 2022; beta coverage of every state followed in 2024." }, + { "icon": "history", "title": "Microsimulation first", "text": "PolicyEngine launched in 2021 to model federal and state taxes and benefits for any household or survey." }, + { "icon": "map-pin", "title": "State taxes needed a benchmark", "text": "In April 2022 we merged our first state income tax and began validating against TAXSIM35, record by record." }, { "icon": "book", "title": "TAXSIM’s author on a successor", "text": "“A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page" }, { "icon": "world", "title": "One model for both uses", "text": "The emulator runs TAXSIM files on the same open rules that score reforms and benefits." } ] @@ -1164,17 +1159,17 @@ export const blsSlides: BlsSlideContent[] = [ }, { "id": "axiom-demo", - "title": "The child care credit, live in Axiom", + "title": "Axiom, live: the child care credit", "body": [], "minutes": 2, - "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The embedded page uses axiom.org’s embed mode (?embed=1: no site chrome or cross-navigation), and it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) point to the statute text and the encodings rail; (2) switch to the browser tab you prepared with the Run view (axiom.org/app?compose=us%3Astatutes%2F26%2F21, the same page as the reader’s “graph ↗” link; the run form needs a full window); (3) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; (4) add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", + "notes": "A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The frame opens on axiom.org’s home page; it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) from the home page, click Explore the law, which opens the law library and rule graph; (2) search “dependent care” and open the first result, Child and dependent care credit (Federal · 26 USC § 21): the statute text sits next to its 44 encoded rules, each citing its subsection; (3) click “graph ↗”, which opens the §21 rule graph in a new browser tab with room for the Run form, and open its Run tab; (4) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml.", "headerLink": { - "label": "axiom.org/us/statute/26/21", - "url": "https://axiom.org/us/statute/26/21" + "label": "axiom.org", + "url": "https://axiom.org" }, "embed": { - "url": "https://axiom.org/us/statute/26/21?embed=1", - "footnote": "Run tab: AGI $40,000, $3,000 of care for a child aged 4, $5,000 of tax before the credit. The engine returns a 37% rate and a $1,110 credit. Preview results, not yet certified." + "url": "https://axiom.org", + "footnote": "Explore the law → search “dependent care” → Child and dependent care credit (26 USC § 21) → graph ↗ → Run. AGI $40,000, $3,000 of care for a child aged 4, $5,000 of tax: 37% rate, $1,110 credit. Preview results, not yet certified." } }, { From 9aa77d77ff803114864be045e4c8df5ba092b60b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 13:07:00 -0400 Subject: [PATCH 15/18] BLS deck: narrow the shared-engine claim to tax-rule fixes Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 2 +- slideshows/bls-taxsim-2026/content.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 50c7c05..13b9a4f 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -75,7 +75,7 @@ Point out the federal statistical user, BEA, because it is closest to the CE tea - **TAXSIM’s author on a successor.** “A successor to Taxsim is being built by PolicyEngine with my cooperation.” Daniel Feenberg, NBER TAXSIM page - **One model for both uses.** The emulator runs TAXSIM files on the same open rules that score reforms and benefits. -Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, every fix made for TAXSIM users also improves reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org. +Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, fixes to the tax rules found through TAXSIM comparisons (163 PolicyEngine US pull requests since July 2024 cite them) also improve reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org. ## 8. How the collaboration started (7–9 min) diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 54d43ea..189ee4d 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -271,7 +271,7 @@ export const blsSlides: BlsSlideContent[] = [ "title": "Why we built a TAXSIM emulator", "body": [], "minutes": 1, - "notes": "Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, every fix made for TAXSIM users also improves reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org.", + "notes": "Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, fixes to the tax rules found through TAXSIM comparisons (163 PolicyEngine US pull requests since July 2024 cite them) also improve reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org.", "cards": [ { "icon": "history", "title": "Microsimulation first", "text": "PolicyEngine launched in 2021 to model federal and state taxes and benefits for any household or survey." }, { "icon": "map-pin", "title": "State taxes needed a benchmark", "text": "In April 2022 we merged our first state income tax and began validating against TAXSIM35, record by record." }, From 8127c6db421e2af3a6a8c0164be7685ea2d1f8d7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 13:18:58 -0400 Subject: [PATCH 16/18] BLS deck: fold PolicyEngine today into slides 4 and 5; add funder logos Max: listing NBER on 'PolicyEngine today' was odd, since NBER is the day's topic, and the logos already sit on the next slide. The model's figures (95,000+ parameters, 6,000+ variables, 4,932 test files, 103 programs, 133 contributors) move to slide 4, and slide 5 becomes 'Who uses and funds PolicyEngine', with a funders row (Arnold Ventures, NSF, Nuffield, NEO Philanthropy, Pritzker Children's Initiative; logos from policyengine-app-v2's supporters page). The funding and staffing answers move into the notes of slides 5 and 4. Slide 4 gets the freed minute; the deck is 34 slides and still 60 plus 30 minutes. Co-Authored-By: Claude Opus 5.5 --- public/logos/funders/arnold-ventures.svg | 8 + public/logos/funders/neo-philanthropy.png | Bin 0 -> 14883 bytes public/logos/funders/nsf.webp | Bin 0 -> 16958 bytes public/logos/funders/nuffield.webp | Bin 0 -> 3158 bytes .../pritzker-childrens-initiative.webp | Bin 0 -> 43830 bytes slideshows/bls-taxsim-2026/README.md | 34 ++--- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 93 ++++++------ .../bls-taxsim-2026/VALIDATION-SCRIPT.md | 10 +- slideshows/bls-taxsim-2026/content.ts | 27 +--- .../bls-taxsim-2026/slides/PEIntroSlides.tsx | 140 +++++++----------- slideshows/bls-taxsim-2026/slides/index.tsx | 3 +- 11 files changed, 134 insertions(+), 181 deletions(-) create mode 100644 public/logos/funders/arnold-ventures.svg create mode 100644 public/logos/funders/neo-philanthropy.png create mode 100644 public/logos/funders/nsf.webp create mode 100644 public/logos/funders/nuffield.webp create mode 100644 public/logos/funders/pritzker-childrens-initiative.webp diff --git a/public/logos/funders/arnold-ventures.svg b/public/logos/funders/arnold-ventures.svg new file mode 100644 index 0000000..9cf2baf --- /dev/null +++ b/public/logos/funders/arnold-ventures.svg @@ -0,0 +1,8 @@ + diff --git a/public/logos/funders/neo-philanthropy.png b/public/logos/funders/neo-philanthropy.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ffc34ff42909ba99cb14878ff1135873b0f8ba GIT binary patch literal 14883 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 ?Q7W2e l?=Ak{J?Q`MivK?=o#Mzg==l`#lySsD4cGJ!+V-?+fscZXQyVh>kZp5y&yFn~iMN&y=&N+`in0eNm znK|!@hzS43`_lv-a3Om;2Y*I^&ism*QrfshBU9 z>1Unkgz`nztTXcnu(cBEdFcw5&-|5ejwC_>9tmkPD(Z%65wSQ`0luju`xNjsBIfPr z>YxK`I_@b##CrzuzD3d(WyFg@$p=5UX*`c%_fWc&N=}0lHg(?dM6>r3-tu(l!c_p z-g;mh5iYjn*5WYoE&8iEuYtKpd=m6vM>0I&&&B22C^K>|*w}!F>k6b?r3=DJ$ngCz zdsa>@H@-zNi!KiKVbwDRX{YG|_e2WB*oY7t8XLE;(TCrfQQ*ugb6fb>(0C8OgY@Hc z0X(Kc%)2{(Q2TmSLPJBV)@wI#;*JMN#i+pa`4OIh zB+Ui6xw(aARJyq+FE=;ejI1Z=0>{^^)N!#cD4(Zh$8|wVRP$sXJupg?+*g;E{`B?d z-TVA>v4l&>r_A)soC1?5*hdc>5+Nb#kJiCuK)zi9E7R?HovVlVdHDucsoQ4k>Jv{g z1vsJuD&%l`zo}hWplw#nreFZj+WIw}aWdd&3J$iSjLt*eEqTmh63OKPH;is9 zgzJ^8#wy@^a=sWYTaf=^9*3FS;}KTC4|9hK;24RRRNvw`M5?oCEJ$A?Jz?(b=1r(Q6#xymj$n+bMfw+^U@yLD{!;Etum8lwD)T zq1+ZT5b;rm@V1c?9CVKzDk3IDBOv0P3d;iXEf z+^44@VcdwaAiI!FvXGw*c}HZ1NgO*_H1SarSK?3i~N`�EZQqGUq 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 ViXUJZ6_VZ_Ln+*s{5Svr005TZ7#9El literal 0 HcmV?d00001 diff --git a/public/logos/funders/nuffield.webp b/public/logos/funders/nuffield.webp new file mode 100644 index 0000000000000000000000000000000000000000..0dc6c8c51c73932caec2e859cac67c99c4cb63d7 GIT binary patch literal 3158 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: free, open-source microsimulation +

    {pillars.map((pillar) => (
    @@ -73,11 +74,14 @@ export function WhatIsPolicyEngineSlide() { ))}
    -
    -

    - Five years open source. Used by governments, Congress, researchers and benefit - navigators, from 10 Downing Street to US statehouses. -

    +
    + {stats.map((s) => ( +
    +
    {s.value}
    +
    {s.label}
    +
    + ))} +
    ); @@ -85,75 +89,12 @@ export function WhatIsPolicyEngineSlide() { const stats = [ { value: '95,000+', label: 'parameters in the US model' }, - { value: '5,500+', label: 'variables' }, + { value: '6,000+', label: 'variables' }, { value: '4,932', label: 'test files' }, { value: '103', label: 'programs in the coverage registry' }, + { value: '133', label: 'contributors to the US model since 2021' }, ]; -const institutions = [ - { org: 'NBER', detail: 'Memorandum of understanding for an open-source TAXSIM emulator.' }, - { - org: 'Federal Reserve Bank of Atlanta', - detail: 'Memorandum of understanding that brings the Policy Rules Database into our validation.', - }, - { - org: 'No 10 Downing Street', - detail: 'The data science team built 10ds-microsim on PolicyEngine.', - }, -]; - -/** Adapted from the gettsim-2026 PEOverviewSlide. */ -export function PolicyEngineTodaySlide() { - return ( - - - PolicyEngine today - - -
    -

    - Free, open-source software to compute the effect of public policy. US and UK tax-benefit - models, with public code since June 2021 and 133 contributors to the US model. -

    - -
    -
    - {stats.map((s) => ( -
    -
    {s.value}
    -
    {s.label}
    -
    - ))} -
    - -
    -

    - In other institutions’ hands -

    -
    - {institutions.map((c) => ( -
    -

    {c.org}

    -

    {c.detail}

    -
    - ))} -
    -
    -
    - -
    -

    - PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. Funders to date include - Arnold Ventures, the National Science Foundation (POSE Phase I, 2025–26), the Nuffield Foundation, - NEO Philanthropy and the Pritzker Children’s Initiative, with support from organizations that - build on the models, such as MyFriendBen. -

    -
    -
    -
    - ); -} - /** maxWidth evens out visual weight: wide wordmarks get more room, tall marks less. */ const organizations: { name: string; logo: string; maxWidth: number; className?: string }[] = [ { name: 'BEA', logo: '/logos/organizations/bea.png', maxWidth: 150 }, @@ -161,7 +102,7 @@ const organizations: { name: string; logo: string; maxWidth: number; className?: { name: 'University of Michigan', logo: '/logos/organizations/umich.png', maxWidth: 170 }, { name: 'USC', logo: '/logos/organizations/usc.png', maxWidth: 70 }, { name: 'Georgetown (Better Government Lab)', logo: '/logos/organizations/georgetown.png', maxWidth: 140 }, - { name: 'UHERO', logo: '/logos/organizations/uhero.png', maxWidth: 130, className: '!max-h-[100px]' }, + { name: 'UHERO', logo: '/logos/organizations/uhero.png', maxWidth: 130 }, { name: 'MyFriendBen', logo: '/logos/organizations/myfriendben.png', maxWidth: 160 }, { name: 'Amplifi', logo: '/logos/organizations/amplifi.png', maxWidth: 110 }, { name: 'Mirza', logo: '/logos/organizations/mirza.png', maxWidth: 110 }, @@ -173,27 +114,54 @@ const organizations: { name: string; logo: string; maxWidth: number; className?: { name: 'Committee for a Responsible Federal Budget', logo: '/logos/organizations/crfb.png', maxWidth: 150, className: 'invert' }, ]; -/** Adapted from the cpid-webinar-2026 WhoUsesItSlide. */ +const funders: { name: string; logo: string; maxWidth: number }[] = [ + { name: 'Arnold Ventures', logo: '/logos/funders/arnold-ventures.svg', maxWidth: 170 }, + { name: 'National Science Foundation', logo: '/logos/funders/nsf.webp', maxWidth: 70 }, + { name: 'Nuffield Foundation', logo: '/logos/funders/nuffield.webp', maxWidth: 130 }, + { name: 'NEO Philanthropy', logo: '/logos/funders/neo-philanthropy.png', maxWidth: 90 }, + { name: 'Pritzker Children’s Initiative', logo: '/logos/funders/pritzker-childrens-initiative.webp', maxWidth: 170 }, +]; + +function LogoCell({ name, logo, maxWidth, className, height }: { name: string; logo: string; maxWidth: number; className?: string; height: number }) { + return ( +
    + {name} +
    + ); +} + +/** Users, adapted from the cpid-webinar-2026 WhoUsesItSlide, and funders from policyengine.org/us/supporters. */ export function WhoUsesPolicyEngineSlide() { return ( - Researchers and developers build with these rules + Who uses and funds PolicyEngine -
    - {organizations.map((org) => ( -
    - {org.name} -
    - ))} +
    +

    Used by

    +
    + {organizations.map((org) => ( + + ))} +
    + +

    Funded by

    +
    + {funders.map((f) => ( + + ))} +
    +

    + A nonprofit, fiscally sponsored by the PSL Foundation, with support from organizations that build on the models, such as MyFriendBen. +

    ); diff --git a/slideshows/bls-taxsim-2026/slides/index.tsx b/slideshows/bls-taxsim-2026/slides/index.tsx index 8dbd055..f3e3cf3 100644 --- a/slideshows/bls-taxsim-2026/slides/index.tsx +++ b/slideshows/bls-taxsim-2026/slides/index.tsx @@ -10,7 +10,7 @@ import AxiomPlanSlide from './AxiomPlan'; import { ThankYouSlide } from './ThankYouSlide'; import SectionDivider from './SectionDivider'; import UpdateTimelineSlide from './UpdateTimeline'; -import { PolicyEngineTodaySlide, WhatIsPolicyEngineSlide, WhoUsesPolicyEngineSlide } from './PEIntroSlides'; +import { WhatIsPolicyEngineSlide, WhoUsesPolicyEngineSlide } from './PEIntroSlides'; import { BenefitChains, CompareFlow, IconCards, PartnershipBridge, QuestionsAndLinks, ResourceBars, SourcesPanel, Triangle, WorkflowRouting } from './Visuals'; import Slide from '@/components/core/Slide'; import CoverSlide from '@/components/layout/CoverSlide'; @@ -23,7 +23,6 @@ const COVER_SPEAKERS = [speakers['max-ghenis'], speakers['pavel-makarchuk'], spe const CUSTOM_SLIDES = { 'what-is-pe': WhatIsPolicyEngineSlide, - 'pe-today': PolicyEngineTodaySlide, 'who-uses-pe': WhoUsesPolicyEngineSlide, 'thank-you': ThankYouSlide, } satisfies Record, () => React.JSX.Element>; From d25e659625fcf96f4114d7371b4bef57627df6dd Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 13:22:26 -0400 Subject: [PATCH 17/18] BLS deck: legible funder logos (Pritzker as a dark mark, larger Nuffield and NEO) Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx index 2893171..50b6130 100644 --- a/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx +++ b/slideshows/bls-taxsim-2026/slides/PEIntroSlides.tsx @@ -114,12 +114,12 @@ const organizations: { name: string; logo: string; maxWidth: number; className?: { name: 'Committee for a Responsible Federal Budget', logo: '/logos/organizations/crfb.png', maxWidth: 150, className: 'invert' }, ]; -const funders: { name: string; logo: string; maxWidth: number }[] = [ +const funders: { name: string; logo: string; maxWidth: number; className?: string }[] = [ { name: 'Arnold Ventures', logo: '/logos/funders/arnold-ventures.svg', maxWidth: 170 }, { name: 'National Science Foundation', logo: '/logos/funders/nsf.webp', maxWidth: 70 }, - { name: 'Nuffield Foundation', logo: '/logos/funders/nuffield.webp', maxWidth: 130 }, - { name: 'NEO Philanthropy', logo: '/logos/funders/neo-philanthropy.png', maxWidth: 90 }, - { name: 'Pritzker Children’s Initiative', logo: '/logos/funders/pritzker-childrens-initiative.webp', maxWidth: 170 }, + { name: 'Nuffield Foundation', logo: '/logos/funders/nuffield.webp', maxWidth: 190 }, + { name: 'NEO Philanthropy', logo: '/logos/funders/neo-philanthropy.png', maxWidth: 140 }, + { name: 'Pritzker Children’s Initiative', logo: '/logos/funders/pritzker-childrens-initiative.webp', maxWidth: 190, className: '[filter:brightness(0)_saturate(100%)] opacity-80' }, ]; function LogoCell({ name, logo, maxWidth, className, height }: { name: string; logo: string; maxWidth: number; className?: string; height: number }) { @@ -156,7 +156,7 @@ export function WhoUsesPolicyEngineSlide() {

    Funded by

    {funders.map((f) => ( - + ))}

    From ef76850e020995b719304a0a88634a90af50dc95 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 13:43:26 -0400 Subject: [PATCH 18/18] BLS deck: show the OBBBA household explorer and CliffWatch live as motivation Two one-minute live slides after 'Who uses and funds PolicyEngine': the OBBBA Household Explorer (57,240 records, 21 provisions each) and CliffWatch on a DC household. They set up why every record's taxes must be right. Slide 4 and the origins slide give up a minute each to keep 60 plus 30; slide numbers from 6 on move up by two in the agenda notes, README, SPEAKER-NOTES and VALIDATION-SCRIPT. Co-Authored-By: Claude Opus 5.5 --- slideshows/bls-taxsim-2026/README.md | 32 +++---- slideshows/bls-taxsim-2026/SPEAKER-NOTES.md | 92 +++++++++++-------- .../bls-taxsim-2026/VALIDATION-SCRIPT.md | 10 +- slideshows/bls-taxsim-2026/content.ts | 36 +++++++- 4 files changed, 105 insertions(+), 65 deletions(-) diff --git a/slideshows/bls-taxsim-2026/README.md b/slideshows/bls-taxsim-2026/README.md index 47ee7a6..15b3148 100644 --- a/slideshows/bls-taxsim-2026/README.md +++ b/slideshows/bls-taxsim-2026/README.md @@ -2,29 +2,29 @@ Local route: `/slides/bls-taxsim-2026`. -34 slides, including 6 section dividers and a closing slide, with 60 minutes of presentation time (no slack) and a dedicated final slide for 30 minutes of Q&A. +36 slides, including 6 section dividers and a closing slide, with 60 minutes of presentation time (no slack) and a dedicated final slide for 30 minutes of Q&A. Agenda and presenters: introduction (Max Ghenis, 11 min); the TAXSIM emulator with versions and releases and the live demo (Pavel Makarchuk, 18 min); beyond TAXSIM (Pavel Makarchuk, 5 min); validation and the 2026 tax rules (David Trimmer, 12 min); benefit imputation (Max Ghenis, 6 min); what’s next: Axiom with a live walk-through, and a possible CE pilot (Max Ghenis, 8 min); Q&A (30 min). Speakers change only at section dividers. Thesia Garner’s question list (October 7) is answered in the notes of the slides that cover each question; the agenda slide’s notes map them. - `content.ts`: slide copy, timing, sources, speaker notes, screenshots and live embeds. - `slides/index.tsx`: React rendering with the repository’s shared slide components. The cover uses the shared `CoverSlide` with speaker headshots. - `slides/PEIntroSlides.tsx`: PolicyEngine introduction: what it is, with the model’s figures, and who uses and funds it with logos (slides 4–5), adapted from the cpid-webinar-2026 and gettsim-2026 decks. -- `slides/SectionDivider.tsx`: section openers on the cover gradient, with the section number and title (slides 3, 9, 14, 18, 24 and 28), each naming its presenter, which is where the speakers hand off. -- `slides/Origins.tsx`: how the collaboration started: the record-by-record testing before the emulator, a real YAML test from policyengine-us issue #1504 beside it, and the milestones up to the agreement (slide 7). -- `slides/InputMapping.tsx`: story cards by general area, aligned across each row with CSS subgrid. Slide 15: the TAXSIM variables, the limit of the TAXSIM format, and the PolicyEngine variables that remove it. Slide 17: what PolicyEngine calculates beyond TAXSIM (benefit programs, health coverage, additional state tax credits and federal provisions), how the emulator handles each, and the PolicyEngine variables. Each ends with a “why it matters” card. -- `slides/DropInTabs.tsx`: the TAXSIM site’s Installation section on top and its Get started section below, as on policyengine.org/us/taxsim (slide 10). Each section has its title centered above its tabs: macOS/Linux and Windows for the two install steps, and CLI, Python, R, Stata, SAS and Julia for the before and after code. Clicks on the tabs and the Copy buttons do not advance the slide. On screens 820px tall or less, the widget scales down so that it fits. -- `slides/ThankYouSlide.tsx`: the closing slide, with each speaker’s photo, name and email (slide 34). -- `slides/UpdateTimeline.tsx`: when the 2026 tax rules will be ready: the 2025 state update’s figures, the 2025 cycle and the 2026 plan on one November-to-March axis in half-month slots, the major changes, and the March 31, 2027 commitment (slide 23). -- `slides/CeInputsTable.tsx`: CE inputs that PolicyEngine can use and TAXSIM cannot: CE variables, PolicyEngine inputs, what PolicyEngine does with them and TAXSIM’s limit (slide 16). CE variable names are from the 2024 Interview public-use microdata dictionary. -- `slides/LiveEmbed.tsx`: live iframe with a side column of demo steps (slides 13, 21 and 30). -- `slides/ProcessFlow.tsx`: step-card processes with optional figures, real examples and who-provides-what columns (slides 20, 22 and 32). -- `slides/Releases.tsx`: versions and releases: release figures, the command that pins both packages, and what ships with every release (slide 12). -- `slides/AxiomPlan.tsx`: the move to Axiom in three stages: today, planned and throughout (slide 29). +- `slides/SectionDivider.tsx`: section openers on the cover gradient, with the section number and title (slides 3, 11, 16, 20, 26 and 30), each naming its presenter, which is where the speakers hand off. +- `slides/Origins.tsx`: how the collaboration started: the record-by-record testing before the emulator, a real YAML test from policyengine-us issue #1504 beside it, and the milestones up to the agreement (slide 9). +- `slides/InputMapping.tsx`: story cards by general area, aligned across each row with CSS subgrid. Slide 17: the TAXSIM variables, the limit of the TAXSIM format, and the PolicyEngine variables that remove it. Slide 19: what PolicyEngine calculates beyond TAXSIM (benefit programs, health coverage, additional state tax credits and federal provisions), how the emulator handles each, and the PolicyEngine variables. Each ends with a “why it matters” card. +- `slides/DropInTabs.tsx`: the TAXSIM site’s Installation section on top and its Get started section below, as on policyengine.org/us/taxsim (slide 12). Each section has its title centered above its tabs: macOS/Linux and Windows for the two install steps, and CLI, Python, R, Stata, SAS and Julia for the before and after code. Clicks on the tabs and the Copy buttons do not advance the slide. On screens 820px tall or less, the widget scales down so that it fits. +- `slides/ThankYouSlide.tsx`: the closing slide, with each speaker’s photo, name and email (slide 36). +- `slides/UpdateTimeline.tsx`: when the 2026 tax rules will be ready: the 2025 state update’s figures, the 2025 cycle and the 2026 plan on one November-to-March axis in half-month slots, the major changes, and the March 31, 2027 commitment (slide 25). +- `slides/CeInputsTable.tsx`: CE inputs that PolicyEngine can use and TAXSIM cannot: CE variables, PolicyEngine inputs, what PolicyEngine does with them and TAXSIM’s limit (slide 18). CE variable names are from the 2024 Interview public-use microdata dictionary. +- `slides/LiveEmbed.tsx`: live iframe with a side column of demo steps (slides 6, 7, 15, 23 and 32). +- `slides/ProcessFlow.tsx`: step-card processes with optional figures, real examples and who-provides-what columns (slides 22, 24 and 34). +- `slides/Releases.tsx`: versions and releases: release figures, the command that pins both packages, and what ships with every release (slide 14). +- `slides/AxiomPlan.tsx`: the move to Axiom in three stages: today, planned and throughout (slide 31). - `slides/DetailContent.tsx`: a table layout with a footnote; no slide uses it at present. -- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 8), the routing diagram: an example input file, two engines by tax year, an example output file (slide 11), the three-calculations triangle with the validation steps beside it (slide 19), imputation sources (slide 25), resource bars (slide 26), cards with a headline figure (slide 27) and without one (slide 6), the comparison diagram (slide 31), and questions with resource links (slide 33). `BenefitChains` is kept but no slide uses it at present. +- `slides/Visuals.tsx`: the NBER partnership: TAXSIM on the left, the agreement and year routing in the middle, PolicyEngine on the right (slide 10), the routing diagram: an example input file, two engines by tax year, an example output file (slide 13), the three-calculations triangle with the validation steps beside it (slide 21), imputation sources (slide 27), resource bars (slide 28), cards with a headline figure (slide 29) and without one (slide 8), the comparison diagram (slide 33), and questions with resource links (slide 35). `BenefitChains` is kept but no slide uses it at present. - `SPEAKER-NOTES.md`: readable presenter track and preparation checklist, kept in step with `content.ts`. -- `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 19–22, 10 minutes). +- `VALIDATION-SCRIPT.md`: full speaker script for the validation section (slides 21–24, 10 minutes). -The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, at the end of the emulator section, before Beyond TAXSIM. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (7) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (15 and 17) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. +The live demo runs the 3-household sample in the web runner at policyengine.org/us/taxsim/run, at the end of the emulator section, before Beyond TAXSIM. The validation section starts with the four steps that resolve a disagreement beside the three calculations (TAXSIM, PolicyEngine and third-party validators such as TaxAct and Axiom) and the law as the arbiter, then covers how resolved cases shape the emulator, the live public dashboard at policyengine.org/us/taxsim/dashboard, and our progress with recent issues. The early-partnership slide (9) is based on policyengine-us issues #704 and #1504 (with PR #1505) and discussion #2389, NSF award 2518372 and the PolicyEngine blog posts on the POSE grant and the NBER MOU. The input and output slides (17 and 19) are based on policyengine-taxsim 3.0.1 (`config/variable_mappings.yaml`, `runners/policyengine_runner.py`), the TAXSIM source (`law87.for`) and PolicyEngine US source as of October 6, 2026. The CE pilot and benefit extension are proposals, not completed implementations. -The example results on slide 11 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 26 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 22 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 23 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. +The example results on slide 13 come from real policyengine-taxsim 3.0.1 runs, and the numbers on slide 28 come from PolicyEngine US 2.25.2, all run on October 5, 2026. The figures on slide 24 come from the policyengine-taxsim GitHub issue tracker on the same day. The 2025 timeline on slide 25 comes from the PolicyEngine US pull requests and issues for each state’s 2025 update (PRs #6898 to #7421), pulled on October 7, 2026. diff --git a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md index 3347ec0..2a42f81 100644 --- a/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md +++ b/slideshows/bls-taxsim-2026/SPEAKER-NOTES.md @@ -1,19 +1,19 @@ # BLS TAXSIM seminar: slide text and speaker notes -34 slides, including 6 section dividers and a closing slide: 60 minutes presenting, no slack, then a dedicated 30-minute Q&A slide. +36 slides, including 6 section dividers and a closing slide: 60 minutes presenting, no slack, then a dedicated 30-minute Q&A slide. Based on the September 2025 CRS TAXSIM section, PWBM 2026 validation material, IARIW 2026 imputation/calibration material in this repository, and the PolicyEngine TAXSIM site (policyengine.org/us/taxsim), captured October 5, 2026. ## Before presenting - Presenters: Max Ghenis (sections 01, 05 and 06), Pavel Makarchuk (02 and 03), David Trimmer (04). Speakers change only at the section dividers, which name the presenter. -- Rehearse the live demo (slide 13) and the live dashboard (slide 21) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. -- On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 20 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). -- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 20 notes if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. -- The validation section (slides 19–22, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. +- Rehearse the live demo (slide 15) and the live dashboard (slide 23) on the presentation laptop and the BLS network. Confirm that both frames load. If a frame does not load, open the page in a browser tab. +- On the morning of the talk, open the dashboard and check that it loads. Its headline figures are in the notes for slide 22 for questions (2023: 89.8% federal and 94.9% state agreement within ±1% of gross income, data of September 23, 2026). +- The dashboard’s September 23 data treats S-corporation income as active. PR #1199 (September 29) made passive the default, so a refresh before the talk would change the federal figures; update the slide 22 notes if it does. NBER’s request to suspend testing (policyengine-taxsim #1248, September 25) was closed by Dan Feenberg on September 29. +- The validation section (slides 21–24, 10 minutes) has a full speaker script in `VALIDATION-SCRIPT.md`. - Open policyengine.org/us/taxsim/run once before the talk: its first load took 9 seconds on October 8. -- Open slide 30 once before the talk: the embedded Axiom page took about 20 seconds to render the first time on October 8. -- Rehearse the Axiom run on slide 30 in a separate browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21, Run tab) and leave that tab open: answers are lost on reload. The slide notes have the household and the fallbacks. +- Open slide 32 once before the talk: the embedded Axiom page took about 20 seconds to render the first time on October 8. +- Rehearse the Axiom run on slide 32 in a separate browser tab (axiom.org/app?compose=us%3Astatutes%2F26%2F21, Run tab) and leave that tab open: answers are lost on reload. The slide notes have the household and the fallbacks. - Thesia Garner’s questions are answered in the notes of the slides that cover them; the agenda notes (slide 2) map each question to its slide. - Confirm the CE-specific benefit methodology and pilot scope. These sections describe proposed research choices rather than a completed CE implementation. @@ -29,7 +29,7 @@ Introduce the speakers and thank the BLS hosts and the CE team. ## 2. Today’s discussion (1–2 min) -- Introduction and context — What PolicyEngine is, who uses and funds it, why we built an emulator, and how the NBER collaboration started. +- Introduction and context — What PolicyEngine is, who uses and funds it, what it shows household by household, why we built an emulator, and how the NBER collaboration started. - The TAXSIM emulator — A drop-in TAXSIM interface, where each calculation happens, versions and releases, and a live demo in the browser. - Beyond TAXSIM — What PolicyEngine models beyond TAXSIM’s inputs and outputs, and the CE fields that could feed it. - Validation — How a disagreement is resolved with the engines, independent validators and the law, the public dashboard, and the 2026 tax rules. @@ -37,13 +37,13 @@ Introduce the speakers and thank the BLS hosts and the CE team. - What’s next — Axiom as our next-generation rules engine, with a live run, and a possible CE pilot. - Q&A and discussion — Questions on the methods, implementation, and opportunities for collaboration. -The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, slides 1–8, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, slides 9–17, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, slides 18–23, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, slides 24–32, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic, the model’s scale and staffing on slide 4; users and funding on slide 5; why we built the emulator on slide 6; versions, release notes, input and output changes and support on Versions and releases (slide 12); in-kind benefits on slides 17 and 26; testing in the validation section (slides 19–22); the annual update on slide 23; the road map in What’s next (slides 29–32). Each of those slides’ notes carries the spoken answer. +The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, slides 1–10, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, slides 11–19, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, slides 20–25, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, slides 26–34, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic, the model’s scale and staffing on slide 4; users and funding on slide 5; why we built the emulator on slide 8; versions, release notes, input and output changes and support on Versions and releases (slide 14); in-kind benefits on slides 19 and 28; testing in the validation section (slides 21–24); the annual update on slide 25; the road map in What’s next (slides 31–34). Each of those slides’ notes carries the spoken answer. ## 3. Introduction and context (section divider) Section divider 01, presented by Max Ghenis. Move on after a few seconds. -## 4. PolicyEngine: free, open-source microsimulation (2–5 min) +## 4. PolicyEngine: free, open-source microsimulation (2–4 min) - Rules: federal and state taxes and major benefit programs - Households: survey data enhanced and calibrated, or any household you enter @@ -51,7 +51,7 @@ Section divider 01, presented by Max Ghenis. Move on after a few seconds. Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the benefit imputation section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026). The figures along the bottom: 95,000+ parameters (from the gettsim-2026 deck, September 3, 2026), 6,000+ variables (6,216 variable classes on October 8, 2026), 4,932 YAML test files and 103 programs in the coverage registry (policyengine-us main, October 8, 2026), and 133 contributors to the US model since 2021 (the GitHub list shows 136 accounts, 3 of them bots). Answers Thesia’s staffing question: the emulator is maintained by Pavel Makarchuk, David Trimmer and Max Ghenis; the US model it calls had 20 people committing in the past 12 months, and its code, tests and every issue are public, so the work does not depend on any one person. Do not put headcount or turnover figures on the record beyond what Max chooses to say. -## 5. Who uses and funds PolicyEngine (5–6 min) +## 5. Who uses and funds PolicyEngine (4–5 min) - Federal users: BEA and the Joint Economic Committee - Research institutions: Brookings, AEI, Niskanen, CRFB, Georgetown, USC, the University of Michigan and UHERO @@ -59,7 +59,19 @@ Give the one-minute version of PolicyEngine: an open-source rules engine, a hous Point out the federal statistical user, BEA, because it is closest to the CE team’s work: BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” Quote only those fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law (apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf). Also point out the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026). Answers Thesia’s funding question: PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. The funders shown are from the public supporters page (policyengine.org/us/supporters): Arnold Ventures, the National Science Foundation (a POSE Phase I grant, $299,974, September 2025 to August 2026, now ended), the Nuffield Foundation, NEO Philanthropy and the Pritzker Children’s Initiative, with support from organizations that build on the models, such as MyFriendBen. Max speaks to future funding. -## 6. Why we built a TAXSIM emulator (6–7 min) +## 6. OBBBA, household by household (5–6 min) + +Live page: https://www.policyengine.org/us/obbba-households + +Motivation, shown live: this is what the rules do for real households. The OBBBA Household Explorer (policyengine.org/us/obbba-households) shows 57,240 modeled records from PolicyEngine’s certified Microcosm Build P, weighted to 124.6 million US households in 2026; each record shows its total change in household resources and the marginal contribution of 21 modeled provisions, against a baseline in which the 2017 tax cuts expire. Its headline, as the page states it today: OBBBA increases resources by $546.1 billion, or $4,384 per household on average. Scroll through one or two income bands and open a single record. The point for this audience: every record runs the full federal and state tax and benefit rules, so every one of them has to be right, which is why we check our taxes against TAXSIM record by record (next slides). If the frame does not load, open the page in a browser tab. + +## 7. Benefit cliffs as earnings rise (6–7 min) + +Live page: https://www.policyengine.org/us/cliffwatch?s=DC&zip=20001&p=30%3Aa%3A%3A0%2C2%3Ac%3A%3A0&max=100000 + +Motivation, shown live. CliffWatch (policyengine.org/us/cliffwatch) maps benefit cliffs and marginal tax rates for a household as its wages and salaries rise: net resources, cliff zones and the contribution of each program, including SNAP, TANF, the EITC, the child tax credit, Medicaid, CHIP, ACA premium tax credits, WIC, school meals, Head Start, child care subsidies, housing assistance, SSI and federal and state income taxes, for all 50 states and DC. The link opens a District of Columbia household preset; change the state or household in the sidebar if asked. The point for this audience: these curves depend on taxes and benefits interacting correctly at every income, which is the same machinery the emulator exposes in TAXSIM’s format. If the frame does not load, open the page in a browser tab. + +## 8. Why we built a TAXSIM emulator (7–8 min) - **Microsimulation first.** PolicyEngine launched in 2021 to model federal and state taxes and benefits for any household or survey. - **State taxes needed a benchmark.** In April 2022 we merged our first state income tax and began validating against TAXSIM35, record by record. @@ -68,7 +80,7 @@ Point out the federal statistical user, BEA, because it is closest to the CE tea Tell it in order, as cause and effect. PolicyEngine grew out of the UBI Center: our first model code dates to August 2020 (the openfisca-uk repository, now policyengine-uk), we launched PolicyEngine UK in October 2021, and the US model’s code started in June 2021. Say “started in 2020” or “launched in 2021” rather than “founded six years ago”: no page gives a founding year. We built a microsimulation model first, for scoring reforms and computing benefits. To get state income taxes right we needed a benchmark, and TAXSIM was the field’s: our first state income tax, Massachusetts, merged on April 30, 2022 (policyengine-us PR #715), and we opened the issue to validate against TAXSIM35 on April 19, 2022 (#704). On April 15, 2024 we launched beta state income tax modeling for all 50 states and DC, checked against TAXSIM for tax year 2021 in each state (43 states and DC have a broad income tax; the other seven have none). Dan Feenberg’s TAXSIM home page (taxsim.nber.org; first person, footer contact Daniel Feenberg) says: “A successor to Taxsim is being built by PolicyEngine with my cooperation.” The sentence uses “is being built”: do not say NBER has named or certified PolicyEngine as TAXSIM’s replacement, and do not quote the next sentence on that page, which says the emulator is fully compatible with TAXSIM files. Because the emulator runs on the same rules engine as the rest of PolicyEngine, fixes to the tax rules found through TAXSIM comparisons (163 PolicyEngine US pull requests since July 2024 cite them) also improve reform and benefit analysis, and the reverse. No public source says anything about Dan Feenberg’s plans; do not raise them. Sources: github.com/PolicyEngine/policyengine-us/pull/715, github.com/PolicyEngine/policyengine-us/issues/704, policyengine.org/us/research/state-tax-model-beta, taxsim.nber.org. -## 7. How the collaboration started (7–9 min) +## 9. How the collaboration started (8–9 min) Before the emulator: record by record: 1. **Compare one record:** One household runs through both models. @@ -102,7 +114,7 @@ From testing to partnership: Ease into the partnership before the agreement slide. Validation against TAXSIM35 started in April 2022 (policyengine-us issue #704, “Validate against TAXSIM 35”). Before the emulator existed, the team compared records one at a time and turned each one into a YAML integration test in policyengine-us. The example on the slide is issue #1504 (November 15, 2022), trimmed: a 70-year-old with $36,000 of tax-exempt pension income in 2021, with SSI and WIC set to zero because they are not in TAXSIM35, and the expected values from the online TAXSIM35 (income_tax of −$1,400, the 2021 recovery rebate). The test failed because PolicyEngine counted tax-exempt pension income in AGI; PR #1505 fixed it the same day and the test stayed in the suite. Issues #1031 (Massachusetts senior circuit breaker, July 2022) and #1279 (2021 AMT, August 2022) follow the same pattern. The method then scaled up to differential testing: random samples of 100,000 tax units, about 1.6 million units across two sample sequences, went through TAXSIM35 and PolicyEngine US for tax year 2021, federal and each state. The units with the largest differences came out one at a time, and the team filled out the relevant part of the tax form by hand to decide which model was wrong. If TAXSIM35 was wrong, its code was patched; if PolicyEngine was wrong, an issue with a failing test was filed. NBER made this possible by sharing the TAXSIM35 source code. The method is written up in policyengine-us discussion #2389. The policyengine-taxsim emulator started in May 2024, and NBER filed its first issue on its public tracker on September 22, 2024, and has filed about 830 since. In 2025, NSF awarded PolicyEngine a POSE Phase I grant (award 2518372, September 2025 to August 2026), and NBER’s TAXSIM developer served as the external mentor through the I-Corps for POSE training. The September 2025 memorandum of understanding (next slide) formalized more than three years of this work. Sources: github.com/PolicyEngine/policyengine-us/issues/704, github.com/PolicyEngine/policyengine-us/discussions/2389, nsf.gov/awardsearch/show-award/?AWD_ID=2518372, policyengine.org/us/research/nsf-pose-phase-1-grant. -## 8. The NBER collaboration (9–11 min) +## 10. The NBER collaboration (9–11 min) TAXSIM at NBER: - **Developed since the 1970s:** At NBER, which still maintains it @@ -124,11 +136,11 @@ Start on the left with TAXSIM, end on the right with PolicyEngine, and use the m # The TAXSIM emulator -## 9. The TAXSIM emulator (section divider) +## 11. The TAXSIM emulator (section divider) Section divider 02, presented by Pavel Makarchuk. Move on after a few seconds. -## 10. A drop-in replacement for TAXSIM35 (11–14 min) +## 12. A drop-in replacement for TAXSIM35 (11–14 min) Installation (top of the slide), with macOS/Linux and Windows tabs: install the uv package manager (if you don't have it), then `uv tool install policyengine-taxsim`. @@ -138,7 +150,7 @@ Existing TAXSIM workflows carry over in every supported environment, with no add The table shows the swap that the TAXSIM site gives for six environments; the teal part is what changes. Shell, SAS and Julia only swap the command name. R swaps the package and function (library(policyenginetaxsim), then policyengine_calculate_taxes). Stata writes the file, runs the command and reads the result back. Python can call the runner on a data frame. After installation, setup_policyengine() is a one-time environment setup in R, and the R package also provides compare_with_taxsim(inputs). Ask CE staff which environment their current tax-imputation code uses. Source: https://www.policyengine.org/us/taxsim, read October 5, 2026. For Stata, SAS and Julia: if the command is not found, run uv tool dir --bin and use the full path it prints. -## 11. Where each calculation happens (14–17 min) +## 13. Where each calculation happens (14–17 min) TAXSIM input file (One row per tax unit, any tax year): @@ -161,7 +173,7 @@ One file in and one file out. The tax year decides which engine calculates each Show where the calculation happens. The emulator reads each row’s tax year: rows for 1960–2020 run on the TAXSIM35 binary bundled with the package, and rows for 2021 onward run on PolicyEngine US. Both paths write the same TAXSIM output variables, so one file can mix years. The example is one California household (married, two children aged 8 and 12, $80,000 and $50,000 in wages) run for 2019 and 2024 with policyengine-taxsim 3.0.1 and PolicyEngine US 2.25.2 on October 5, 2026: 2019 gives fiitax $10,949, siitax $4,583 and fica $19,890 through TAXSIM35; 2024 gives fiitax $8,282, siitax $3,214 and fica $19,890 through PolicyEngine. The input columns: state 5 is California in TAXSIM’s codes, mstat 2 is married filing jointly, depx is the number of dependents, and pwages and swages are the two spouses’ wages. fica is payroll tax, employee and employer shares together. Mapping details if asked: pwages and swages become each person’s employment_income, page and sage become ages, and fiitax and siitax map to income_tax and state_income_tax. State codes follow TAXSIM’s own numbering, so New Jersey is 31, while 34 (the Census FIPS code for New Jersey) means North Carolina and silently applies the wrong state’s law. A run record should note the emulator and model versions. -## 12. Versions and releases (17–19 min) +## 14. Versions and releases (17–19 min) - **One release, every tax year.** Parameters carry dated values, so there is no separate version per tax year. - **Merged changes ship automatically.** Tests run on every pull request, and a release reaches PyPI only after its tests pass. @@ -186,7 +198,7 @@ Answers Thesia’s production-reliability and version-notes questions. Release s # Live demonstration -## 13. Live demo: run the sample file (19–29 min) +## 15. Live demo: run the sample file (19–29 min) Live page: https://www.policyengine.org/us/taxsim/run @@ -194,11 +206,11 @@ Go straight into the live demo after Versions and releases and before Beyond TAX # Beyond TAXSIM -## 14. Beyond TAXSIM (section divider) +## 16. Beyond TAXSIM (section divider) Section divider 03, presented by Pavel Makarchuk. Move on after a few seconds. -## 15. Additional inputs beyond TAXSIM (29–31 min) +## 17. Additional inputs beyond TAXSIM (29–31 min) | Area | TAXSIM input | Limit | PolicyEngine adds | |---|---|---|---| @@ -212,7 +224,7 @@ Section divider 03, presented by Pavel Makarchuk. Move on after a few seconds. Explain how a TAXSIM input row becomes a PolicyEngine household, and what the format cannot carry. Business income: the emulator maps pbusinc and sbusinc (with psemp and ssemp) to self-employment income, pprofinc and sprofinc to income from a specified service trade or business, and scorp to partnership and S-corporation income. TAXSIM’s own QBI deduction is a flat 20% with the service-business phase-in, capped by taxable income, with no W-2 wage or property test. PolicyEngine applies those limits, so without W-2 wages the deduction phases out above the threshold; the emulator’s --assume-w2-wages option reproduces TAXSIM’s simpler rule (available on the policyengine and compare commands, not on the default drop-in command). Itemized deductions: TAXSIM’s mortgage and otheritem are aggregates; the emulator sums them into deductible mortgage interest, which has no floor or cap, to match TAXSIM, because charity and medical would bring AGI caps and floors that TAXSIM does not apply. Property tax maps to real estate taxes. State and local taxes: PolicyEngine computes the state income tax for the SALT deduction; TAXSIM input has no county or city, so Maryland county tax is set to zero and city taxes such as New York City’s do not apply. Do not present the 2025 SALT cap as a difference: TAXSIM also applies it. Household: TAXSIM gives the two adults’ ages (page, sage), the number of dependents (depx) and each dependent’s age (age1 to ageN); filing status comes from mstat. Dependents have no disability or student status. PolicyEngine’s is_disabled input feeds SNAP, SSI and many state credits, and is_full_time_college_student sets the student rules for the EITC and dependent credits (the EITC’s own disability test uses is_permanently_and_totally_disabled). Unearned income: TAXSIM reports interest (intrec), dividends, capital gains, pensions and Social Security (gssi) for the tax unit, and the emulator divides them between spouses for joint filers (evenly, or to the older spouse across a state’s age rule for pensions and Social Security). The fields also carry no type: pensions include IRA withdrawals, and gssi does not separate retirement, disability and survivor benefits. taxable_ira_distributions and social_security_disability add those types; taxable_interest_income and qualified_dividend_income are not on the slide, because the emulator already fills them from intrec and dividends. Sources: policyengine-taxsim 3.0.1 config/variable_mappings.yaml and runners/policyengine_runner.py; TAXSIM source law87.for. Each card ends with the PolicyEngine US input variables that remove the limit, which a survey or an imputation can supply: w2_wages_from_qualified_business and unadjusted_basis_qualified_property apply the wage and property limits of the qualified business income deduction; charitable_cash_donations and other_medical_expenses give each deduction its own adjusted gross income limit or floor; county_fips places the household, which turns on city and county income taxes such as New York City’s and the Indiana county taxes; is_disabled and is_full_time_college_student give dependents the status that credits and benefits use; taxable_ira_distributions and social_security_disability add the income types TAXSIM does not carry. Related input variables not on the slide: business_is_sstb, qualified_reit_and_ptp_income, charitable_non_cash_donations, home_mortgage_interest, is_permanently_and_totally_disabled, is_incapable_of_self_care, taxable_401k_distributions, social_security_survivors and tax_exempt_interest_income. Variable names checked in PolicyEngine US source on October 7, 2026. -## 16. CE survey variables mapped to PolicyEngine inputs (31–33 min) +## 18. CE survey variables mapped to PolicyEngine inputs (31–33 min) | CE collects | PolicyEngine input | Calculations it supports | TAXSIM | |---|---|---|---| @@ -228,7 +240,7 @@ CE variables from the 2024 Interview public-use microdata dictionary; PolicyEngi Show which CE fields could feed PolicyEngine inputs that TAXSIM’s format cannot carry. All CE variables are in the 2024 Interview PUMD dictionary (FMLI unless noted; IN_COLL and SSIX are on MEMI). Medical: HEALTHCQ is the sum of HLTHINCQ, MEDSRVCQ, PREDRGCQ and MEDSUPCQ; TAXSIM takes only deductible medical expenses, already above the AGI floor, in its mortgage total, so the CE applied the floor itself. PolicyEngine applies the floor and also uses medical costs for the SNAP excess medical deduction for elderly and disabled members. Charity: CASHCOCQ also includes alimony, child support, gifts and political giving, so use the charity codes in the CNT detail file. Tuition: EDUCACQ includes K-12 tuition; college tuition is UCC 670110. College enrollment: IN_COLL is 1 full time, 2 part time, 3 not at all. TAXSIM’s documentation instead asks users to code students aged 20 to 23 as 19. Car loans: VEHFINCQ is vehicle finance charges; the 2025 deduction also requires final assembly in the United States, which the CE does not record. Utilities: UTILCQ is the sum of natural gas, electricity, fuels, telephone and water; TAXSIM has no utility field, and PolicyEngine uses utility costs for the SNAP standard utility allowance and shelter deduction. Rent is not listed, because TAXSIM already takes rentpaid. Benefits: JFS_AMT is the annual value of SNAP (with FS_MTHI months), SSIX is SSI per member, and WELFAREX is public assistance; TAXSIM takes one transfers total, used for state rebates. Quarterly spending variables (CQ and PQ) cover a three-month reference period; income variables cover 12 months. Context for this audience: from the second quarter of 2013 through the 2023 data, CE published federal and state tax estimates from TAXSIM; the 2024 data has no tax or after-tax income estimates, because the model was not updated for the 2024 tax year (CE PUMD Getting Started Guide). The emulator covers tax years 2021 onward. Sources: https://www.bls.gov/cex/pumd/ce-pumd-interview-diary-dictionary.xlsx, https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://taxsim.nber.org/taxsim35/ and PolicyEngine US source, October 7, 2026. -## 17. What PolicyEngine calculates beyond TAXSIM (33–34 min) +## 19. What PolicyEngine calculates beyond TAXSIM (33–34 min) | Area | In the emulator | PolicyEngine calculates | |---|---|---| @@ -243,11 +255,11 @@ Show what PolicyEngine calculates that TAXSIM’s output does not carry, and how # Validation -## 18. Validation (section divider) +## 20. Validation (section divider) Section divider 04, presented by David Trimmer. Move on after a few seconds. -## 19. Three calculations, one arbiter (34–37 min) +## 21. Three calculations, one arbiter (34–37 min) 1. **Issue filed.** A mismatch between PolicyEngine and TAXSIM on a CPS record becomes an issue. 2. **Agentic review.** An agentic workflow explores the disagreement using both engines, the validators and the statutes. @@ -266,7 +278,7 @@ Agreement measures consistency. The law decides correctness, because two engines Walk the four steps on the left, then point to the triangle. (1) A mismatch between PolicyEngine and TAXSIM on a CPS record becomes a GitHub issue; NBER files most of them. (2) An agentic workflow explores the disagreement: it reruns the record in both engines, checks third-party validators such as a completed TaxAct return or Axiom’s encoding of the statute, and reads the statute and the official instructions. (3) The findings become a recommendation to adjust one engine, or to agree a convention with NBER when TAXSIM’s inputs cannot carry what the law needs; a person reviews every recommendation before it is posted or merged. (4) After the fix ships, the record is rerun to confirm the disagreement is gone. The validators do not vote: the statute and the official instructions decide which calculation is right, because two engines can share an error that no agreement rate would reveal. PolicyEngine fixes carry tests whose expected values come from the form or statute. Answers Thesia’s testing question, with the next two slides: every pull request runs the automated tests, and a release reaches PyPI only after its tests pass; merging is a reviewer’s decision, so GitHub does not block a failing pull request automatically. PolicyEngine US has 4,932 YAML test files, and the emulator has 276 Python test functions that run on Linux, macOS and Windows (October 8, 2026). -## 20. How this process shapes the emulator (37–39 min) +## 22. How this process shapes the emulator (37–39 min) 1. **Compile.** Every resolved case is stored as an issue on the emulator’s GitHub tracker, with the input row, both results and the resolution. 2. **Lock in.** PolicyEngine fixes ship with a test case, so a resolved disagreement cannot quietly return. @@ -279,13 +291,13 @@ Each PolicyEngine release and each TAXSIM update reruns the comparison. Each resolved case does not end with the fix. It is compiled on the emulator’s GitHub issue tracker with the input row, both engines’ results and the resolution, PolicyEngine fixes ship with a test so the disagreement cannot quietly return, and the dashboard reruns every state and year so we can compare how complete each area’s agreement is. The lowest-agreement areas set what we look at next. The figures describe the comparison on the public dashboard: 111,347 Enhanced CPS households, tax years 2021–2025, all 50 states and DC, run through both engines. If asked for agreement rates: for 2023, 89.8% agree on federal tax and 94.9% on state tax within ±1% of gross income (data update of September 23, 2026). The comparator default is ±$15. Check the dashboard the day before: its September 23 data treats S-corporation income as active, and PR #1199 (September 29) made passive the default, so a refresh would change the federal figures. If asked about #1248: Dan Feenberg opened it on September 25 about his own TAXSIM changes, closed it on September 29, and has filed issues since. The dashboard data also fixed the Alabama coding (state 1, 1,155 households, separate from Texas) in the September 24 release. Source: https://www.policyengine.org/us/taxsim/dashboard -## 21. The public validation dashboard (39–42 min) +## 23. The public validation dashboard (39–42 min) Live page: https://www.policyengine.org/us/taxsim/dashboard About 3 minutes: a quick overview, then one or two examples. Show the dashboard as the output of the process, not as a list of figures. Pick a year, change the tolerance, scroll the state table and inspect one state to show the household list; a second state with near-complete agreement shows what a resolved area looks like. The headline figures are in the notes for the previous slide if someone asks. Check the page on the morning of the talk, because it can update. Click the slide title before you press the arrow keys. If the frame does not load, open policyengine.org/us/taxsim/dashboard in a browser tab. Dashboard steps: (1) Pick a tax year, 2021 to 2025; (2) Choose a tolerance; (3) See agreement by state; (4) Inspect a state to list its households. -## 22. From a reported difference to a fix (42–44 min) +## 24. From a reported difference to a fix (42–44 min) 1. **Report.** 2. **Reproduce.** @@ -301,7 +313,7 @@ About 3 minutes: a quick overview, then one or two examples. Show the dashboard Present the change this work has driven in both engines. Do not say how quickly NBER corrects TAXSIM: TAXSIM is closed source with no public release cadence, so we cannot track when its corrections ship, only that NBER confirmed them. NBER files most of the difference reports; we file questions when TAXSIM appears to differ from the law. Each case is reproduced with a minimal household, classified, and resolved. Exact counts on October 7, 2026: 1,186 issues on the policyengine-taxsim tracker since July 15, 2024, of which 1,010 are closed; 159 questions titled Does TAXSIM or Does taxsimtest since February 2026. TAXSIM corrections: about 106 issues have an NBER comment that confirms a TAXSIM correction (for example “Agreed, corrected”, “Fixed in Taxsim” or “I changed taxsim”), and about 60 more have only “Agreed” or “Now matches”, which do not say which engine changed. This is a lower bound: TAXSIM’s working builds are not public, so changes made without a comment are not counted. PolicyEngine changes, if asked: 163 PolicyEngine US pull requests since July 2024 cite TAXSIM comparisons (mostly state rule corrections), and the emulator has 180 merged pull requests, about a third of them tooling such as CI, versioning and the dashboard. These are not on the slide, because merged pull requests and confirmed corrections are not counted the same way and should not be compared. The tracker grows by about 40 issues a day this week, so the slide uses rounded figures. The three examples show the three outcomes: #1241 (opened September 25, fixed by PR #1244 on September 29), #1235 (opened September 24; NBER replied Agreed and corrected TAXSIM), and #1251 (Minnesota renter’s credit: the comparison return had no Schedule M1RENT). Sources: https://github.com/PolicyEngine/policyengine-taxsim/issues and https://github.com/PolicyEngine/policyengine-us/pulls -## 23. When the 2026 tax rules will be ready (44–46 min) +## 25. When the 2026 tax rules will be ready (44–46 min) **44** Jurisdictions updated for 2025: 41 income-tax states, DC, NH and WA · **47** Pull requests from 5 contributors · **11 weeks** First pull request to last merge, Dec 3 – Feb 18 · **30** States finished in the last week, worked in parallel @@ -319,11 +331,11 @@ BLS will want to know when each year’s rules are ready. Last year, the 2025 st # Benefit imputation -## 24. Benefit imputation (section divider) +## 26. Benefit imputation (section divider) Section divider 05, presented by Max Ghenis. Move on after a few seconds. -## 25. Imputing a distribution of missing inputs (46–48 min) +## 27. Imputing a distribution of missing inputs (46–48 min) Sources fused into PolicyEngine’s US microdata: - **CPS** (Current Population Survey): The spine: demographics, income, labor force. @@ -340,7 +352,7 @@ Sources fused into PolicyEngine’s US microdata: A donor survey observes the variable of interest and predictors shared with the recipient survey. A conditional distribution permits households with similar observed characteristics to have different imputed values. That can matter around tax-benefit thresholds. Multiple draws can reveal sensitivity, but they do not automatically solve model misspecification or preserve every joint relationship. The prior deck names CPS, ACS, SCF, SIPP and tax microdata. This slide does not claim a CE implementation exists. Source: local IARIW 2026 ImputationSlide.tsx. -## 26. What counts as household resources? (48–50 min) +## 28. What counts as household resources? (48–50 min) One California household in 2025 (a single parent, children aged 4 and 7, $25,000 in wages), four resource concepts. @@ -355,7 +367,7 @@ PolicyEngine US 2.25.2, run October 5, 2026. Benefits assume take-up; Medi-Cal i Each bar adds one component for one California household: a single parent with children aged 4 and 7 and $25,000 in wages (PolicyEngine US 2.25.2, 2025). A household calculation assumes take-up; in the microdata, take-up is assigned at published rates (SNAP 82% from USDA; Medicaid 78% in California, from KFF and MACPAC). Taxes and credits: the federal EITC and refundable child tax credit and California’s CalEITC and Young Child Tax Credit, less the employee payroll tax. CalWORKs is California’s TANF program. The jump from $43,931 to $71,640 shows why Medicaid needs an explicit valuation choice: cost per enrollee, insurance value and household valuation give different answers, and this talk does not pick one. Establish whether CE research wants potential entitlements, actual receipt, or a broader resource measure. Answers Thesia’s question on in-kind transfers (NSLP, WIC, Medicaid): PolicyEngine US calculates them; the emulator sets benefits to zero to stay comparable with TAXSIM, and the values come from PolicyEngine US through Python, the API or the web app. Valuation, if asked: school meals (school_meal_net_subsidy) are the federal NSLP lunch plus SBP breakfast reimbursement for the child’s tier, less the paid-meal rate, for 180 school days per K-12 child, so they are an upper bound on what a child receives; WIC is USDA’s 2018 food-package cost uprated by CPI-U, with the current cash-value benefit; Medicaid and CHIP are state spending (KFF and MACPAC) spread across enrollees by an age-rated premium index, a cost-per-enrollee value, the same kind of value as the CMS per-enrollee cost in BLS’s consumption measure (Monthly Labor Review, April 2023). Heating assistance is modeled in 9 states and DC, with no national LIHEAP formula yet (policyengine-us main, October 8, 2026). -## 27. Validation of benefit imputations (50–52 min) +## 29. Validation of benefit imputations (50–52 min) **≈40%** of SNAP recipients are missing from CPS reports, measured against linked administrative records. (Meyer and Mittag, NBER Working Paper 21676) @@ -368,11 +380,11 @@ Meyer and Mittag link the CPS to administrative records and find that the survey # What’s next -## 28. What’s next (section divider) +## 30. What’s next (section divider) Section divider 06, presented by Max Ghenis. Move on after a few seconds. -## 29. Axiom: our next-generation rules engine (52–54 min) +## 31. Axiom: our next-generation rules engine (52–54 min) Axiom encodes tax and benefit rules from the law, with a test for every federal rule module. We are moving PolicyEngine onto it in steps. @@ -388,13 +400,13 @@ Axiom today: 1,147 federal and 3,733 state rule modules (rulespec-us, CC BY 4.0) Answers Thesia’s road-map question. Frame Axiom as our next-generation rules engine. Today: tax years 2021 onward run on PolicyEngine US, and the 2026 update ships there by March 31, 2027, whatever Axiom’s timeline. Axiom encodes rules from the law with companion tests: at rulespec-us a9dc38f (October 6, 2026) there are 1,147 federal rule modules, each paired with a test, and 3,733 state modules across 50 states and DC, with uneven coverage (Colorado has 1,284; 25 jurisdictions have fewer than 10). The engine (axiom-rules-engine) is Rust under MIT; the encodings are CC BY 4.0. Axiom publishes its comparisons with PolicyEngine and TAXSIM as open reports (269 at axiom-oracles.vercel.app). The plan, in Max’s words: we keep powering TAXSIM for as long as it is needed, possibly with Axiom on the backend instead of PolicyEngine US, and PolicyEngine wrappers over Axiom keep existing code working for as long as needed, so the frontier moves forward in a backwards-compatible way. Shipped evidence for the wrapper approach: policyengine.py already runs one country on Axiom, a Belgium pilot for worker social contributions and personal income tax (policyengine.py PR #448, tests/test_be_axiom_pilot.py); a US model on Axiom has no code yet. Axiom’s validation suite already turns its cases into TAXSIM rows and runs both TAXSIM-35 and the emulator on them (axiom-oracles adapters/taxsim). On the emulator, a CI test already pins the command-line entry point (tests/test_cli_entry_point.py). The emulator’s side of that plan is written up in policyengine-taxsim PR #1153 (open, not merged): the command-line tool, the Python import path and TAXSIM-format files stay fixed, with contract tests for those entry points; output values still change when the law or a fix changes them. No migration date is set. If asked about readiness: Axiom does not yet compute a complete federal return (rulespec-us #1318, a cyclic dependency in the composed federal compile, is open; the payroll tax encoding lacks the wage-base cap, axiom-encode #1214), and its API has no certified release, so BLS would run on PolicyEngine US and the emulator. If asked about independence: Max leads both, and the PSL Foundation sponsors both; Axiom is a second reading of the statute, and the statute and official instructions decide disagreements. Do not cite the Axiom-versus-TAXSIM federal run (87,519 tax units): it compares Axiom with a 2026 TAXSIM test build, not with the emulator. Max speaks to funding here. -## 30. Axiom, live: the child care credit (54–56 min) +## 32. Axiom, live: the child care credit (54–56 min) Live page: https://axiom.org A two-minute walk-through of one federal tax provision running in Axiom. The page shows 26 U.S.C. 21 next to its encoded rules; each rule cites its subsection (for example “26 USC § 21(a) · parameter”). The frame opens on axiom.org’s home page; it can take about 20 seconds to render the first time, so open this slide once before the talk. Steps: (1) from the home page, click Explore the law, which opens the law library and rule graph; (2) search “dependent care” and open the first result, Child and dependent care credit (Federal · 26 USC § 21): the statute text sits next to its 44 encoded rules, each citing its subsection; (3) click “graph ↗”, which opens the §21 rule graph in a new browser tab with room for the Run form, and open its Run tab; (4) tax unit: AGI 40000, earned income 40000, expenses paid 3000, tax before the credit 5000, and set Expense Requirements, TIN Included and Service Provider Info to true; add person 2, age 4, child dependent true; (5) Run scenario: the rate is 37% and the credit $1,110; (6) change AGI and earned income to 100000 and rerun: 22% and $660. The arithmetic to say aloud: $40,000 of AGI is 12.5 steps of $2,000 above $15,000, which rounds up to 13, so the rate is 50% − 13 points = 37%, and 37% of $3,000 is $1,110. Above $75,000 a second phase-down applies, to 22% at $100,000. The credit is nonrefundable, so $500 of tax caps it at $500. These are the parameters for 2026 (50% maximum, 35% then 20% floors). The 2021 expansion is carried behind an explicit input flag, and the 2022–2025 rules are not encoded, so this module does not yet reproduce past tax years by period. The run executes Axiom’s Rust rules engine, compiled to WebAssembly and served by the Axiom API, and the response names the engine release and the compiled artifact’s hash. Say plainly that this is a preview: results are uncertified (the API’s certified set is empty), and the EITC, child tax credit and income tax core do not run live yet, which is why production TAXSIM emulation stays on PolicyEngine US. The EITC page (axiom.org/us/statute/26/32) shows its statute and 26 encoded rules, for reading only. Fallbacks: rehearse the run once in a separate tab shortly before presenting, which also warms the API (a first call took about 5 seconds), and do not reload it (answers are lost on reload); if the engine call stalls (one test call in 18 timed out), stay on the statute page and narrate the $1,110 calculation; the simplest live alternative is self-employment tax (axiom.org/app?compose=us%3Astatutes%2F26%2F1401: $50,000 gives $7,650), kept below the wage base. Use the singular “statute” in URLs: /us/statutes/26/32 renders a not-found page. Checked October 8, 2026 against axiom.org master 3662668e and rulespec-us us/statutes/26/21.yaml. -## 31. Where this could fit in CE research (56–58 min) +## 33. Where this could fit in CE research (56–58 min) **CE tax-unit records** (An agreed set of inputs for one year.) → **CE’s TAXSIM estimates** (Published for 2013–2023 data.) and **PolicyEngine TAXSIM emulator** (The same file, no format changes.) → **Compare** (Household results and weighted summaries.) → **Review** (Explain differences before expanding the scope.) @@ -404,7 +416,7 @@ Keep CE definitions and weights fixed in the first comparison. This is a proposed integration path, not a tested CE implementation. CE published federal and state income tax estimates from NBER’s TAXSIM from the second quarter of 2013 through the 2023 data (BLS Monthly Labor Review, 2015; CE PUMD Getting Started Guide). The 2024 data has no tax or after-tax income estimates: BLS says the external tax model was not updated for the 2024 tax year, and it keeps a tax unit identifier on the microdata so users can produce their own tax estimates. A comparison therefore needs a year with CE TAXSIM estimates, 2023 or earlier; for the 2024 data onward, the emulator would produce estimates where CE now has none. The same TAXSIM input file can go to both engines. The slide gives only the years; mention the 2024 gap only if asked. Sources: https://www.bls.gov/cex/pumd-getting-started-guide.htm, https://www.bls.gov/cex/csxfaqs.htm (question 42) and https://www.bls.gov/cex/notices/2025/ce-after-tax.htm. Start with the core outputs: fiitax, siitax, fica, v22 (child tax credit), v25 (EITC) and frate. Ask staff which parts of their current workflow could supply the comparison inputs. Preserve existing CE definitions and weights in the initial comparison. -## 32. A manageable CE pilot (58–60 min) +## 34. A manageable CE pilot (58–60 min) 1. **Scope.** Agree one year, one sample and the key tax outputs. Output: scope note. 2. **Map.** Document input mappings and missing-data assumptions. Output: mapping document. @@ -417,7 +429,7 @@ This is a proposed integration path, not a tested CE implementation. CE publishe Proposed next steps for discussion. The emulator is an open-source package with Python, R, Stata and SAS interfaces that installs inside BLS, so confidential records do not need to leave BLS. The who-provides-what split is a proposal, not an agreement. Seek clarity on the relevant year, available inputs, computing environment and who will review discrepancies. The comparison year needs CE TAXSIM estimates, so it must be 2023 or earlier; the 2024 data has none. Avoid proposing a firm timeline before those constraints are known. On the AI skills, which speak to the CE program’s limited implementation resources: PolicyEngine’s skills are open source (MIT) in PolicyEngine/policyengine-skills, published for Claude Code as the policyengine-claude plugin (/plugin marketplace add PolicyEngine/policyengine-claude) with a Codex install script and an MCP server; they include household calculations and microsimulation runs on the same rules. There is no TAXSIM-specific skill yet, so do not say it maps CE files out of the box; mapping CE fields to TAXSIM inputs would be pilot work. Confidential CE records stay under BLS’s own rules for AI tools; the skills are useful with public-use microdata and for writing the comparison code. -## 33. Q&A and discussion (60–90 min) +## 35. Q&A and discussion (60–90 min) - Which outcomes and years would be most useful? - Which input assumptions create the most uncertainty? @@ -431,7 +443,7 @@ Proposed next steps for discussion. The emulator is an open-source package with Use the separate 30-minute discussion for questions on the methods and potential CE collaboration. The links on the slide open the TAXSIM site, the web runner, the validation dashboard and the source code. -## 34. Thank you (closing slide) +## 36. Thank you (closing slide) - Max Ghenis · max@policyengine.org - Pavel Makarchuk · pavel@policyengine.org diff --git a/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md b/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md index 06311a0..24b62e5 100644 --- a/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md +++ b/slideshows/bls-taxsim-2026/VALIDATION-SCRIPT.md @@ -1,8 +1,8 @@ # Validation section: speaker script (David) -Slides 19–22, 10 minutes in total, then slide 23, When the 2026 tax rules will be ready (44–46 min, 2 minutes; its notes carry the script), before handing back to Max for benefit imputation. Spoken pace is about 130 words a minute; the rest of the time is for pointing at the slide and clicking through the live dashboard. Timings: validation steps and triangle 3 min, shaping the emulator 2 min, dashboard 3 min, progress and recent issues 2 min. +Slides 21–24, 10 minutes in total, then slide 25, When the 2026 tax rules will be ready (44–46 min, 2 minutes; its notes carry the script), before handing back to Max for benefit imputation. Spoken pace is about 130 words a minute; the rest of the time is for pointing at the slide and clicking through the live dashboard. Timings: validation steps and triangle 3 min, shaping the emulator 2 min, dashboard 3 min, progress and recent issues 2 min. -## Slide 19. Three calculations, one arbiter (34–37 min) +## Slide 21. Three calculations, one arbiter (34–37 min) Validation for us isn't a single benchmark number. It's a process we run on every disagreement, and it has four steps. @@ -18,7 +18,7 @@ Validation for us isn't a single benchmark number. It's a process we run on ever *Point to step 4.* Once the fix ships, we rerun the record to confirm the disagreement is gone. -## Slide 20. How this process shapes the emulator (37–39 min) +## Slide 22. How this process shapes the emulator (37–39 min) A resolved case doesn't end with the fix. @@ -32,7 +32,7 @@ A resolved case doesn't end with the fix. *Point to the line at the bottom.* The loop never closes for good. Every PolicyEngine release and every TAXSIM update reruns the comparison. -## Slide 21. The public validation dashboard (39–42 min, live) +## Slide 23. The public validation dashboard (39–42 min, live) This is where that comparison lives, and it's public. A quick overview, then one or two examples. @@ -50,7 +50,7 @@ One caution: these numbers move whenever either engine changes. That's the point *If asked for headline figures:* for 2023, 89.8% of households agree on federal tax and 94.9% on state tax, within 1% of gross income (data update of September 23, 2026). Choose the two example states on the morning of the talk, after checking that the page loads. -## Slide 22. From a reported difference to a fix (42–44 min) +## Slide 24. From a reported difference to a fix (42–44 min) Here's where we are. *Point to the figures.* Since July 2024 there have been more than 1,100 issues on the emulator's public tracker, and more than 1,000 are resolved. Differences run both ways: we've sent NBER more than 150 questions about TAXSIM's own rules, and NBER has confirmed more than 100 TAXSIM corrections on the tracker. That last number is a floor. TAXSIM's working builds aren't public, so we only count the corrections NBER mentions in a comment. diff --git a/slideshows/bls-taxsim-2026/content.ts b/slideshows/bls-taxsim-2026/content.ts index 3b9f266..237b73c 100644 --- a/slideshows/bls-taxsim-2026/content.ts +++ b/slideshows/bls-taxsim-2026/content.ts @@ -209,7 +209,7 @@ export const blsSlides: BlsSlideContent[] = [ "Q&A and discussion" ], "descriptions": [ - "What PolicyEngine is, who uses and funds it, why we built an emulator, and how the NBER collaboration started.", + "What PolicyEngine is, who uses and funds it, what it shows household by household, why we built an emulator, and how the NBER collaboration started.", "A drop-in TAXSIM interface, where each calculation happens, versions and releases, and a live demo in the browser.", "What PolicyEngine models beyond TAXSIM’s inputs and outputs, and the CE fields that could feed it.", "How a disagreement is resolved with the engines, independent validators and the law, the public dashboard, and the 2026 tax rules.", @@ -218,7 +218,7 @@ export const blsSlides: BlsSlideContent[] = [ "Questions on the methods, implementation, and opportunities for collaboration." ], "minutes": 1, - "notes": "The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, slides 1–8, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, slides 9–17, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, slides 18–23, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, slides 24–32, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic, the model’s scale and staffing on slide 4; users and funding on slide 5; why we built the emulator on slide 6; versions, release notes, input and output changes and support on Versions and releases (slide 12); in-kind benefits on slides 17 and 26; testing in the validation section (slides 19–22); the annual update on slide 23; the road map in What’s next (slides 29–32). Each of those slides’ notes carries the spoken answer." + "notes": "The six sections total 60 minutes, leaving no slack before the 30-minute Q&A. Speakers change only at section dividers, and each divider names its presenter: Max Ghenis (01, introduction, slides 1–10, 11 minutes), Pavel Makarchuk (02 and 03, the emulator with the live demo and what goes beyond TAXSIM, slides 11–19, 23 minutes), David Trimmer (04, validation and the 2026 tax rules, slides 20–25, 12 minutes), then Max Ghenis (05 and 06, benefit imputation and what’s next, slides 26–34, 14 minutes). Thesia Garner’s question list (email of October 7) is answered inside the deck rather than on its own slide: transparency of the internal logic, the model’s scale and staffing on slide 4; users and funding on slide 5; why we built the emulator on slide 8; versions, release notes, input and output changes and support on Versions and releases (slide 14); in-kind benefits on slides 19 and 28; testing in the validation section (slides 21–24); the annual update on slide 25; the road map in What’s next (slides 31–34). Each of those slides’ notes carries the spoken answer." }, // Introduction and context (Max Ghenis): 9 minutes, 11 with the cover and agenda { @@ -237,7 +237,7 @@ export const blsSlides: BlsSlideContent[] = [ "Households: survey data enhanced and calibrated, or any household you enter", "Reforms: change any parameter and see the cost, poverty and distributional effects" ], - "minutes": 3, + "minutes": 2, "notes": "Give the one-minute version of PolicyEngine: an open-source rules engine, a household dataset built from public surveys, and a way to score reforms. Keep the focus on the rules and the household data, because the TAXSIM emulator uses the same rules engine. The rules and the survey data are separate, so the same rules can serve any dataset. The TAXSIM adapter maps one input format into the model’s households, but it does not remove the research choices about missing data and participation; the benefit imputation section covers those. Answers Thesia’s question on reviewing the internal logic: all of it is public. PolicyEngine US and policyengine-core are AGPL-3.0 and the emulator is MIT. The US model has 6,266 parameter files, each citing the statute, regulation or agency document that sets it (for example, the child tax credit amount cites 26 U.S.C. 24(h)(2) and IRS Rev. Proc. 2025-32), 6,177 variable formula files and 4,932 YAML test files (policyengine-us main, October 8, 2026). The emulator’s input and output mappings are open too (config/variable_mappings.yaml). Adapted from the cpid-webinar-2026 deck (September 2026). The figures along the bottom: 95,000+ parameters (from the gettsim-2026 deck, September 3, 2026), 6,000+ variables (6,216 variable classes on October 8, 2026), 4,932 YAML test files and 103 programs in the coverage registry (policyengine-us main, October 8, 2026), and 133 contributors to the US model since 2021 (the GitHub list shows 136 accounts, 3 of them bots). Answers Thesia’s staffing question: the emulator is maintained by Pavel Makarchuk, David Trimmer and Max Ghenis; the US model it calls had 20 people committing in the past 12 months, and its code, tests and every issue are public, so the work does not depend on any one person. Do not put headcount or turnover figures on the record beyond what Max chooses to say.", "custom": "what-is-pe" }, @@ -253,6 +253,34 @@ export const blsSlides: BlsSlideContent[] = [ "notes": "Point out the federal statistical user, BEA, because it is closest to the CE team’s work: BEA’s Distribution of Personal Income technical document (Marina Gindelsky, June 2026) says it runs PolicyEngine for years 2021 forward, and that the emulator “has enabled BEA to continue to produce Disposable Personal Income.” Quote only those fragments: the same footnote and section 7 call TAXSIM-35 discontinued, which we do not say, because NBER maintains TAXSIM and runs an open beta coded through 2024 law (apps.bea.gov/data/special-topics/distribution-of-personal-income/national/technical-document.pdf). Also point out the university research centers, such as the University of Michigan and UHERO (the University of Hawaii Economic Research Organization). Adapted from the cpid-webinar-2026 deck (September 2026). Answers Thesia’s funding question: PolicyEngine is a nonprofit, fiscally sponsored by the PSL Foundation. The funders shown are from the public supporters page (policyengine.org/us/supporters): Arnold Ventures, the National Science Foundation (a POSE Phase I grant, $299,974, September 2025 to August 2026, now ended), the Nuffield Foundation, NEO Philanthropy and the Pritzker Children’s Initiative, with support from organizations that build on the models, such as MyFriendBen. Max speaks to future funding.", "custom": "who-uses-pe" }, + { + "id": "obbba-explorer", + "title": "OBBBA, household by household", + "body": [], + "minutes": 1, + "notes": "Motivation, shown live: this is what the rules do for real households. The OBBBA Household Explorer (policyengine.org/us/obbba-households) shows 57,240 modeled records from PolicyEngine’s certified Microcosm Build P, weighted to 124.6 million US households in 2026; each record shows its total change in household resources and the marginal contribution of 21 modeled provisions, against a baseline in which the 2017 tax cuts expire. Its headline, as the page states it today: OBBBA increases resources by $546.1 billion, or $4,384 per household on average. Scroll through one or two income bands and open a single record. The point for this audience: every record runs the full federal and state tax and benefit rules, so every one of them has to be right, which is why we check our taxes against TAXSIM record by record (next slides). If the frame does not load, open the page in a browser tab.", + "headerLink": { + "label": "policyengine.org/us/obbba-households", + "url": "https://www.policyengine.org/us/obbba-households" + }, + "embed": { + "url": "https://www.policyengine.org/us/obbba-households" + } + }, + { + "id": "cliffwatch", + "title": "Benefit cliffs as earnings rise", + "body": [], + "minutes": 1, + "notes": "Motivation, shown live. CliffWatch (policyengine.org/us/cliffwatch) maps benefit cliffs and marginal tax rates for a household as its wages and salaries rise: net resources, cliff zones and the contribution of each program, including SNAP, TANF, the EITC, the child tax credit, Medicaid, CHIP, ACA premium tax credits, WIC, school meals, Head Start, child care subsidies, housing assistance, SSI and federal and state income taxes, for all 50 states and DC. The link opens a District of Columbia household preset; change the state or household in the sidebar if asked. The point for this audience: these curves depend on taxes and benefits interacting correctly at every income, which is the same machinery the emulator exposes in TAXSIM’s format. If the frame does not load, open the page in a browser tab.", + "headerLink": { + "label": "policyengine.org/us/cliffwatch", + "url": "https://www.policyengine.org/us/cliffwatch?s=DC&zip=20001&p=30%3Aa%3A%3A0%2C2%3Ac%3A%3A0&max=100000" + }, + "embed": { + "url": "https://www.policyengine.org/us/cliffwatch?s=DC&zip=20001&p=30%3Aa%3A%3A0%2C2%3Ac%3A%3A0&max=100000" + } + }, { "id": "why-emulator", "title": "Why we built a TAXSIM emulator", @@ -270,7 +298,7 @@ export const blsSlides: BlsSlideContent[] = [ "id": "origins", "title": "How the collaboration started", "body": [], - "minutes": 2, + "minutes": 1, "notes": "Ease into the partnership before the agreement slide. Validation against TAXSIM35 started in April 2022 (policyengine-us issue #704, “Validate against TAXSIM 35”). Before the emulator existed, the team compared records one at a time and turned each one into a YAML integration test in policyengine-us. The example on the slide is issue #1504 (November 15, 2022), trimmed: a 70-year-old with $36,000 of tax-exempt pension income in 2021, with SSI and WIC set to zero because they are not in TAXSIM35, and the expected values from the online TAXSIM35 (income_tax of −$1,400, the 2021 recovery rebate). The test failed because PolicyEngine counted tax-exempt pension income in AGI; PR #1505 fixed it the same day and the test stayed in the suite. Issues #1031 (Massachusetts senior circuit breaker, July 2022) and #1279 (2021 AMT, August 2022) follow the same pattern. The method then scaled up to differential testing: random samples of 100,000 tax units, about 1.6 million units across two sample sequences, went through TAXSIM35 and PolicyEngine US for tax year 2021, federal and each state. The units with the largest differences came out one at a time, and the team filled out the relevant part of the tax form by hand to decide which model was wrong. If TAXSIM35 was wrong, its code was patched; if PolicyEngine was wrong, an issue with a failing test was filed. NBER made this possible by sharing the TAXSIM35 source code. The method is written up in policyengine-us discussion #2389. The policyengine-taxsim emulator started in May 2024, and NBER filed its first issue on its public tracker on September 22, 2024, and has filed about 830 since. In 2025, NSF awarded PolicyEngine a POSE Phase I grant (award 2518372, September 2025 to August 2026), and NBER’s TAXSIM developer served as the external mentor through the I-Corps for POSE training. The September 2025 memorandum of understanding (next slide) formalized more than three years of this work. Sources: github.com/PolicyEngine/policyengine-us/issues/704, github.com/PolicyEngine/policyengine-us/discussions/2389, nsf.gov/awardsearch/show-award/?AWD_ID=2518372, policyengine.org/us/research/nsf-pose-phase-1-grant.", "origins": { "processTitle": "Before the emulator: record by record",