Repository navigation
Add the APPAM 2026 roundtable deck - #95
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Adds the one-family household, its 51-state earnings sweep, the property and differential tests, and a real Axiom engine run of Georgia SNAP 3612. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the family, program-line and earnings charts, the Texas subsidy run, the tools and scope slides, the Axiom slide, and speaker notes. Reconciles net resources against household_net_income as well as spm_unit_net_income. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Runs one fixed sample through every state's rules, keeps household roles in the flat file, and restores a space the JSX compiler dropped on the first chart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reform slide scores a doubled Massachusetts child and family credit on the state's own records. The scope slide reports the state baseline check against Census, which is why the deck prints no state poverty rate from Populace US. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slide 2's reform line now reads "Who would gain or lose if lawmakers adopted a proposed reform.", so it no longer promises state poverty results that slides 8 and 10 warn against. d2291 decides the same sentence for the paragraph to Cynthia. The fixed sample now draws with replacement in proportion to weight and gives each draw fresh ids. The old draw without replacement took 72% of the weight in 3,000 of 23,407 records, so it was not proportional. The script reads the pinned file's tables, which matches the old route to every digit on the same households and needs no national simulation. Slide 5 ranks all 51 states, slide 8 prints the Massachusetts baseline its gap rests on, and slide 10 gives the Census gap's direction and an effective sample of households with children. Slide 4 credits Congress for the SNAP deduction, and slide 11 dates the encoded section. Tests that could not fail went away. New ones check the 51-state cliff ranking, the subsidy attribution, marginal rates from the sweep, the state each run read, the national comparison, the Census source, and the typed figures in the notes and ledger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slide 7's caption and the ledger drop reduced passives, slide 8 gives the model its own verb, and the notes' longest spoken sentences split where they held two thoughts. The ledger's $30,000 line now matches the fixed hours in the sweep. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slides 8 and 10 described the national default file, but policyengine.py routes state regions to the Populace US local-area file. Rerun the Massachusetts reform and the 51-state baseline on that file, keep the default-file runs in the ledger, and move the notes, slide copy and tests to the new figures. Fix ruff findings in the analysis scripts and load the QR code eagerly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Correctness: - Read blank parent links as 0, the value PolicyEngine US treats as an unknown parent, and rerun all 51 state baselines and the Massachusetts reform. California moves 0.56 points, Delaware 0.006, Missouri 0.00001; no slide figure changes. - Count state payroll taxes and paid leave contributions on the state line. Rerun the family sweeps; the rug's end labels change. - Say that we take earnings and paid leave benefits as inputs on slide 10. - Say "any state" and "wherever a state taxes income" for the Child Poverty Impact Dashboard's reforms, from its option list at 977661f. - Add committed sources for every ledger figure: the 2.2.1 Massachusetts run, the fixed sample's column audit, the slide code check, Wisconsin's schedules, and the group-quarters column. Wisconsin's ledger figures now match the committed run. Voice: give fiscal claims, deductions and held-fixed inputs their actors, take "we estimate" on PolicyEngine's figures, introduce the local-area file and SPM once, and rewrite the ledger's concept subjects and passives. Tests: property tests for parent-link fill, effective samples and group quarters; a state-line payroll test; typed-figure checks across the ledger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slide 8 overflowed at 1280x720 after the round 2 title and footer. Shorten the dashboard sentence to "state by state", drop a blank code line and tighten the gaps. A sibling session found state reform effects too thin to quote to the tenth, so compute household-clustered standard errors for the slide's figures, say "about 0.2 points" on the slide and in the notes, and record the errors in the ledger. Property tests cover the estimator, and content.test.ts ties its output to the slide's run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- finish_pdf.py: measure slide 6's link again after its text moved up, and add links for slide 7's TAXSIM interface and slide 11's axiom.org. - content.test.ts: check the code slides 7 and 8 print against the script that runs it, slide 6's values against the reform run, slide 11's rate against the Axiom run and slide 5's step against the sweep. Name the three cliff states in the notes and ledger, rank Massachusetts's gap from Census, and count each figure the notes and ledger print twice. - EVIDENCE.md: say Massachusetts's gap ranks third in size, since Louisiana's runs below Census. - SPEAKER-NOTES.md: join and trim sentences for rhythm. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- EarningsChart.tsx: a label below the lines moves left of its drop when the next drop leaves no room, so "Iowa" no longer runs into "Idaho". - CliffsSlide.tsx: each cliff reads "Maryland, $97,000 to $97,500", so the reader sees the raise that costs the family its subsidy. - SPEAKER-NOTES.md: say slide 8's estimate the way its footer prints it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slide 3's base segment moves from gray-300 to gray-400, which lifts its contrast on white from 1.45:1 to 2.5:1 and brings it inside the palette validator's lightness band. The rug marks on slides 4 and 7 rise from 40% to 70% opacity, so a single jurisdiction's mark reads on a washed-out projector, and both captions say that overlapping marks darken. The ledger names the four Social Security variables the sample renames. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slide 10 counts effective households with children, about 125 in the median state, so slide 8 now gives Massachusetts's figure on the same base: about 395 households, or 173 among households with children. The notes, the ledger's slide 8 row and the shared figure test follow. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
policyengine-us#10573 adds the Alaska dividend and New Jersey's ANCHOR payment to the SPM unit totals, so the comment beside CASH_OUTSIDE_SPM_TOTALS tells whoever moves the pin past it to empty the tuple. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The estimates, not the jurisdictions, fall outside Census's margin of error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Populace stores some CPS ASEC households twice, as the ASEC record and as a puf_tax_detail clone whose members have the same ages. We now merge each pair before taking Kish's effective sample, and we cluster the Massachusetts standard errors by source household. - Slide 8: about 301 effective households, or 132 among those with children (was 395 and 173). - Slide 10: a median of 108 effective households with children (was 125). On the default file the median falls from 75 to 63. - Standard errors: 4.6 points on the 2026 rate, $42 million on the fall in the poverty gap and $64 million on the state cost (was 3.8 points, $34 million and $54 million). The run now reads each group's household from its first member, because map_to between two groups splits the id across members. - effective_samples.py writes data/effective_samples.json and stops if a shared source holds anything but one ASEC record and one clone with the same ages. Property tests cover source_kish's bounds and its invariance to record order and weight scale. - audit_sample_columns.py treats only *_id columns as ids, as sample_families.py does, which leaves 181 undefined names (was 179). - Review fixes: smaller state codes under the family chart, the sweep's earnings range on the cliffs slide, the 2.2.1 provenance of the national 16.6%, the column-mapping step on the microdata slide, Congress's 20% deduction on the Axiom slide, "Any parameter" on the tools card, "household records" on slide 8, and policyengine.py 6.12.0 in the ledger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The S6 comment ran past the code box on slide 7, so it now takes two lines. Slide 11's paragraph gained a line, which moved axiom.org down 14.13 pixels at 1440x810; finish_pdf.py's link box follows it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The S6 comment ran past the code box on slide 7 and lost "geography." It now takes two lines. 06ef06f's message described this change, but the edit missed that commit and lands here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The two-line comment adds a line to slide 7's code block, which moves the policyengine.org/us/taxsim address down 11.51 pixels at 1440x810. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
We moved the precision run's unit-to-source lookup into standard_errors.unit_clusters, which reads each unit's household from its members and stops if they span two households. We test it on a toy file, over random unit sizes and member orders, and against the household that policyengine-core reads from each unit's first member. On that file, map_to from households to SPM units would split household 7's id into 7/3 and 14/3. When we reran massachusetts_precision.py, it wrote the same data/massachusetts_precision.json. In the ledger, we now say the fixed sample holds 2,075 distinct household records. There and in the precision docstring, we also name the errors that every clone shares through the model that imputes its tax detail. We added a Questions section on sampling error to the speaker notes, and content.test.ts pins its figures and both of its comparisons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n to main The second PDF reviewer found that slide 12's QR code and deck address had PDF links but no web anchors, and our link test passed anyway. We wrap both in anchors to the deck. In content.test.ts, we now render every slide and require the PDF to link each target on a page as often as the matching slide holds an anchor to it. At 1440x810, the QR box and the address still fill the rectangles that finish_pdf.py links, to the pixel. On slide 6, we now cite Sections 21, 22, 45 and 49 of the 2023 act in the excerpt, matching amount.yaml on main since policyengine-us#10651 merged. In the ledger, we split the standard-error sentence and count each ASEC household and its clone as one household. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Slide 9 shows CliffWatch's net income chart for a single parent of two in Cambridge, and Build's editor with the Massachusetts child and family tax credit amount at $880 from 2026. The address under each screenshot links to its app, and finish_pdf.py links both addresses on page 9 of the PDF. The deck now runs 13 slides. In the speaker notes, we give slide 9 45 seconds and cut the tools slide to one sentence. In the ledger, we record how we captured the screenshots. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
marked this pull request as ready for review
November 5, 2026 03:28
Contributor
Author
|
Max asked on November 4 to publish this deck at policyengine.org/slides/appam-2026 so he can send the moderator the link, and to keep editing after that. Merging at
|
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Max presents this deck at the APPAM 2026 roundtable "State Policy Impacts on Family Resources: Tools to Improve Policy Analysis". The roundtable meets on Thursday, November 5, from 10:15 to 11:45am ET in the Wellesley room, and he has 10 to 12 minutes. On November 4, he asked us to publish it at policyengine.org/slides/appam-2026 and keep editing after that, so later edits land in follow-up PRs.
Slides
The deck in
slideshows/appam-2026runs thirteen slides:We wrote the talk in
SPEAKER-NOTES.md, and inEVIDENCE.mdwe trace each claim to a computed result or to code at a named commit. We computed every PolicyEngine US figure with 2.90.2 at469ad12, apart from the 2.2.1 runs, using the scripts inanalysis/. For slides 3 to 5 we run one family, and for slide 7 we sample the default Populace US file. We run slides 8 and 11 on the Populace US local-area file, whichpolicyengine.pyuses for state regions, and keep their default-file runs indata/*_default.json. For their effective samples, we count each survey household once, merging an ASEC record with its tax-data clone (analysis/effective_samples.py). Slide 12's figures come from the Axiom Rules Engine 0.2.2, and the Census rates from P60-290 Table 18.The PDF
The moderator asked for slides by Wednesday evening, November 4, to load on a laptop. Max sends the link, and we export a PDF if he needs one to post or if the room's laptop can't reach the site. Export it from the deployment that serves the slides you want, then finish it:
finish_pdf.pytrims each page to its image, links the addresses the slides print, and names the deck and its author in the file. On November 3, we exported the current PDF from Vercel deploymentdpl_9X9zS2oSQnTQFbxgNbo27UVnmcxFofe07b7b8, whose slides match2fb11e9's, and finished it withfinish_pdf.pyat2fb11e9. We used headless Chrome 156 and pypdf 6.21.4. The finished file hashes to sha256dd073b554414349b236e43acb0409a9013109830254a7285f9135d9a70806923, and the raw export to080e09f9c86c00cdbd9c82ef021e66f9239c8ef532d4768b3b90f60af4a5123a. After2fb11e9, we changed two slides in the web deck alone. We wrapped the closing slide's QR code and address in anchors without moving either out of the rectangle its PDF link covers. On slide 6, we now cite the 2023 act's sections as main'samount.yamldoes, while the PDF's excerpt still reads "Section 22 & Section 45", as in 2.90.2. We then added slide 9, so the current PDF runs twelve pages and lacks it.finish_pdf.pynow expects thirteen pages.Invariants
household_net_incomeandspm_unit_net_incometo within two cents, across random states and earnings (analysis/test_invariants.py).cliff_rankingrecords each state's largest one-step drop in that range, and the slide lists the top three.analysis/test_sample_families.py).content.test.ts).content.test.ts).content.test.ts. Massachusetts's standard error exceeds twice Census's margin of error there. A normal error of that size would miss Census by more, on average, than our state estimates do, and the median state holds fewer effective households with children than Massachusetts.state_filereads blank parent links as 0 and keeps every other id. The model reads 0 as an unknown parent, and any nonzero id that matches no one as an absent parent (analysis/test_state_baseline.py).analysis/test_invariants.py).analysis/test_state_baseline.py).effective_samples.pystops unless records that share a source household pair one ASEC record with one tax-data clone whose members have the same ages. It keeps matching ids on the local-area file's two spines apart (analysis/test_effective_samples.py).policyengine.pynames (analysis/test_state_baseline.py).analysis/test_standard_errors.py).analysis/test_finish_pdf.py).content.test.ts).Differential checks
data/massachusetts_national_check.json).content.test.ts).analysis/audit_sample_columns.py).analysis/check_slide_code.py).content.test.tsmatches each printed line to that script, apart from the sample file and the state loop.content.test.ts).analysis/test_standard_errors.py).map_tofrom households to SPM units would instead split household 7's id into 7/3 and 14/3 (analysis/test_standard_errors.py).analysis/wisconsin_schedules.py,content.test.ts).data/massachusetts_reform_221.json).cpid-webinar-2026deck maps (content.test.ts).content.test.tsholds it to the reform run's JSON, file, model version and parent-link fill. It clusters each person, SPM unit and tax unit by the source household of the one household its members share, and stops if a unit's members span two households. We treat the calibrated weights as fixed, so the standard errors leave out what calibration adds. They also leave out errors that every record shares, such as a data-wide error in rent, and those that every clone shares through the model that imputes its tax detail (analysis/massachusetts_precision.py).data/effective_samples.jsonreproduce the simulation runs' values to within one part in a million on both files. Massachusetts's source-level values match the reform run (content.test.ts).content.test.ts).Slide 2
Slide 2's reform line reads "Who would gain or lose if lawmakers adopted a proposed reform." The session blurb's line reads "How proposed reforms would change poverty and household incomes in each state," and Max can switch the slide back to it with one edit in
WhatItDoesSlide.tsx.Slide 9
Slide 9 shows two of our web apps. In CliffWatch, we entered a single parent, 33, with children aged 6 and 10 in Cambridge, Massachusetts, and kept its default programs. In Build, we set the Massachusetts child and family tax credit amount from slides 6 and 8 to $880 from 2026. We captured both from the live sites on November 4. For Build, we set the browser's time zone to UTC: in New York time, Build labels each gridline in its chart of historic values with the year before.
We keep CliffWatch's figures off the slide. CliffWatch runs PolicyEngine US 1.755.5 and counts Medicaid and CHIP in net income. We computed the deck's figures with 2.90.2 and leave health coverage out of net resources. In the speaker notes, we cite one CliffWatch result: this family loses TAFDC, Massachusetts's cash assistance, when its earnings pass $18,000.
Review
Reviewers in rounds 1 and 2 requested changes, and we recorded what we changed in
RESOLUTION-r2.md. In round 3, five reviewers read the deck at0129c2a, one of them the PDF alone. Skeptics then tried to refute each finding, and a critic looked for gaps. The skeptics confirmed 89 findings, four of them must-fix, and refuted two. Three findings needed a microsimulation, which we ran on November 3: we now cluster the standard errors by source household (A3), and the column audit lists 181 undefined names (A11). We also reran the reform with blank parent links read as 0, recorded that fill, and found slide 8's figures unchanged (A7).On November 5, an Opus 5.5 reviewer approved slide 9's commit (
8d86641..236e809). It replayed CliffWatch's household on the live API, compared the screenshots with the capture run's stills, checked every slide reference and ran vitest and pytest. Its four smaller findings go in a follow-up PR.With the Codex lanes closed, an Opus 5.5 reviewer then read the deck at
d07f110and requested changes, with one must-fix, five should-fix and six optional findings. Max decides one of them: whether slide 8 keeps its $169 million poverty gap card or moves that figure into the footer. We fixed or answered the rest, and recorded what we did with each round-3 and final finding inRESOLUTION-r3.md. Both resolution files sit in~/reviews/appam-2026/on Max's machine.We now count each survey household once in the effective samples. Massachusetts's falls from 395 to 301 households, or from 173 to 132 among those with children. Among households with children, the median state's falls from 125 to 108 on the local-area file and from 75 to 63 on the default file. We also fixed a bug that had mislabeled the SPM-unit and tax-unit clusters. With the source-household clusters and that fix, the standard errors rise to $64 million on the cost, $42 million on the gap and 4.6 points on the 2026 child rate. They had read $54 million, $34 million and 3.8 points.
Two verification reviewers then read the deck at
2fb11e9. The statistics reviewer approved it and asked for a test that holds the cluster fix, so we added one toanalysis/test_standard_errors.py. When we rerananalysis/massachusetts_precision.py, it wrote the samedata/massachusetts_precision.json. The PDF reviewer could open the page images but not the text files, so it checked how the pages look and found nothing to fix there. We extracted each PDF link and cropped the page image under it for a second PDF reviewer.On November 4, that reviewer approved the deck at
8f07254. It compared all 12 page images with the slide source and found no differences, checked all nine link boxes, and asked for no new export. We fixed its findings on the closing slide's anchors, the link test and two ledger sentences in8d86641, and corrected two sentences in this description. It had no network, so we checked the outside sources ourselves: the TAXSIM cutoff, the dashboard's reform options, the 2035 horizon, the RuleSpec excerpt and the Department of Labor's wage table. Each matches the deck and the ledger. Another reviewer then checked those fixes and our source checks. It asked for no change to the PDF and found no fault in the deck, and we corrected the records it flagged.Impact
The PR adds one registry entry in
lib/slideshows.tsand the QR image and two screenshots inpublic/images/appam-2026/, and everything else sits in the deck folder. GitNexus impact failed on a storage version mismatch, and its change detection reads the main checkout rather than this worktree. So we checked the scope by hand, andgit diff --stat origin/mainshows no other shared code.axiom: n/a: slides and analysis, no change to a country model🤖 Generated with Claude Code