Skip to content

Hold slide 12's still until the tracker settles, fix slide 15's Georgia caption, and record Build's figures - #107

Open
MaxGhenis wants to merge 6 commits into
mainfrom
appam-rebuild-7
Open

MaxGhenis wants to merge 6 commits into
mainfrom
appam-rebuild-7

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

This PR fixes slide 12's live tracker and slide 15's Georgia caption, adds the record behind Build's figures, and updates the PDF link table. Production runs 7954cfe, and these fixes waited for Max's talk to end.

What changes

Slide 12's live tracker (slides/CoverageEmbed.tsx)

  • The deck swaps the still for the tracker only after a poll, run while the slide shows, finds three things: the snapshot line with its commit (Coverage reflects policyengine-us 2.72.3 (main @ 4c65c82), no font still loading, and the four count cards (Total programs, Complete, Partial, In progress) at full opacity and size, ancestors included.
  • At 7954cfe the deck checked only the line and the fonts. A WebKit run on production (rc12-dwell-webkit.log) showed the frame 634 ms after the slide arrived, while the tracker's cards read opacity 0.38, 0, 0 and 0 at scale 0.9, so the frame replaced the still while three cards were invisible.
  • A hidden frame's cards read as at rest before the tracker fades them in (same log, before arrival), so the deck polls only while the slide shows.
  • A reload inside the frame (pagehide) brings the still back until the check passes again, because the tracker prints its fallback counts first.
  • On a branch preview, the frame's origin differs from the deck's, the deck can't read its document, and the still stays for good. At 7954cfe a preview swapped in the frame at the first poll.
  • The year menu no longer keeps the arrow keys. Every key pressed in the frame reaches the deck unless its target is a text field (input, textarea or contentEditable).

Slide 15's caption (slides/AxiomSlide.tsx) now reads: "Georgia allows the deduction for a household with earned income, and applies the rate to its total countable gross earned income." The old caption required the household to report on time. In section 3650, Georgia denies the deduction only for income reported late, when it computes an overpayment, and 7 U.S.C. 2014(e)(2)(C) and 7 CFR 273.18(c)(1)(ii)(B) set the same limit; the regulation keeps the deduction in an agency-error claim. Axiom's 3612.yaml zeroes the whole deduction and doesn't encode 3650 yet, so the caption states the rate and its base, and the notes' Questions cover the late-report case. The body now opens with "For example," since it features one rule.

Build's figures (data/build_report_4940.json, analysis/massachusetts_reform_national.py, data/massachusetts_reform_221_national.json, EVIDENCE.md). Report 4940's record, saved from api.policyengine.org/us/report/4940, names and hashes the national file, and holds $657,359,316 with child poverty falling from 22.23% to 21.72%. On the local-area file at 2.2.1, we estimate $657,356,800 and a fall from 22.25% to 21.73%. On the national file, we estimate $628.7 million, and child poverty stays at 21.4%. Neither run reproduces the report's 45.7% of people gaining; on the national file, we estimate 46.7% gain more than $1 and 44.5% gain more than 0.1% of household income.

Notes (SPEAKER-NOTES.md): Build's paragraph, three Questions (versions, Build's 45.7% against slide 9's 29.4%, and Georgia's late report), and slide 12's stage direction for the search box and the year menu.

PDF links (analysis/finish_pdf.py): nine rectangles on slides 11, 12, 14 and 15, from the anchors measured on the 31b59c3 preview at 1440×810 (rc14-links.json).

Invariants

  1. The frame shows (opacity 1, pointer events on) only after a poll that ran while the slide showed, since the frame's last pagehide, and found the snapshot line with its commit, no font loading, and the four count cards with every ancestor at opacity 1 and no transform or the identity matrix.
  2. If the deck can't read the frame's document (null, or a SecurityError), the still stays.
  3. Every key pressed in the frame reaches the deck unless its target is a text field, and when the deck prevents its copy of the key, forwardKey prevents the original too.
  4. An export prints the still and no frame.
  5. Once shown, the frame stays shown when the slide leaves and comes back.

We assume the tracker starts its fade-in within 400 ms of the slide showing, before the deck's first poll. Neither engine's run found a shown sample with unsettled cards.

Tests

  • CoverageEmbed.test.tsx (18 tests) enumerates 5 page texts × 2 font states × 7 card states, every combination of loaded × showing × document state, the reload, a cross-origin frame, and 8 keys × 7 targets.
  • Each of eleven mutants of CoverageEmbed.tsx fails the suite (checks/mutation.txt). They skip the card check, the font check, opacity, transform or ancestors, accept any one card, or match the release without the commit. Others poll while the slide hides, keep the frame after a reload, show an unreadable frame, or let the year menu keep the arrows.
  • bunx vitest run slideshows/appam-2026 passes 197 tests and analysis/test_finish_pdf.py passes 15, and tsc --noEmit and ESLint report nothing.

Browser runs

We ran the 31b59c3 preview in Playwright under Docker, routed under www.policyengine.org so the frame shares the deck's origin, with a 45-second dwell (rc14-reveal-*.log):

  • WebKit and Chromium showed the frame about 1.3 s after the slide arrived, with all four cards at opacity 1 and no transform. No shown sample had unsettled cards (51 and 30 samples) or the fallback registry line.
  • After a click in the search box, ArrowRight stayed in the box (step 13 stayed 13). After a click on the tracker's title, the arrows moved the deck (13 → 14 → 13). With the year menu focused, they moved the deck too (13 → 14 → 13), and the frame stayed shown.

Not verified here

  • Firefox doesn't render the deck under routing. The production check after the merge covers Chromium, WebKit and Firefox.
  • No PDF export ran through finish_pdf.py, whose off-address check would confirm the new rectangles.
  • Nobody has run this head on the presenting laptop.

Reviews

  • Two Opus delta reviews covered earlier heads: review-delta-609c612.md and review-delta-b3e057e.md.
  • GPT-6.1 Sol reviews 4d3ec67 on two lenses (code and tests; claims, numbers and voice).
  • The voice pass ran on all changed copy, against the whole voice guide.

🤖 Generated with Claude Code

Slide 11's caption and the notes now say we ran slide 9 on 2.90.2 and estimate
each state cost, in place of giving those verbs to a release. EVIDENCE names
the local-area file for the 2.2.1 run in place of "the same records", which
read as the national file above it, and records that #1445 will rerun
acs_local without the -1 id.

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

vercel Bot commented Nov 5, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
policyengine-slides Ready Ready Preview Nov 6, 2026 12:51am UTC

Request Review

MaxGhenis and others added 2 commits November 5, 2026 11:31
Speaker notes: drop the PDF lines, state what a Build report takes
instead of narrating the recording, call differences from Census
differences, and add answers for Build's 2.3% and 45.7% and for
Georgia's late-report rule.

Slide 15: mark Georgia as an example and print the graph's "total
countable gross earned income".

Ledger: state when the still gives way to the live tracker, and
record that section 3650 narrows the loss section 3612 states.

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

Slide 12's frame:
- Keep the still until the tracker's four count cards reach full opacity and
  full size. WebKit showed the frame while three cards still read opacity 0.
- Pin the snapshot line to its commit as well as its release.
- Bring the still back when the frame's page goes away, so a reload can't show
  the fallback counts.
- Drop the same-origin shortcut, so a branch preview keeps the still for good.
- Let the arrows drive the deck from the year menu. Only a text field keeps them.

Slide 15 and its spoken line said Georgia allows the deduction when a household
"reports it on time". Section 3650 and 7 CFR 273.18 limit that loss to the income
reported late, in an overpayment computation, so the caption now states the rate
and its base, and Questions carries the limit.

Add the 2.2.1 run on the national file. It gives $628.7 million and no change in
child poverty, so Build's $657.4m and 2.3% match the local-area file, though the
report's record names the national file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and remeasure the PDF links

The notes now say what the search box and the year menu do to the arrow
keys and the counts: after a click in the search box the arrows move its
cursor, and a year limits the counts to programs we mark verified for it.
EVIDENCE gives Build's figures "we estimate" and the Georgia entry its
actors (Georgia, Congress, USDA, Axiom). finish_pdf.py takes the anchor
rectangles measured on the 31b59c3 preview for slides 11, 12, 14 and 15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis MaxGhenis changed the title Own the slide 9 and Build figures Hold slide 12's still until the tracker settles, fix slide 15's Georgia caption, and record Build's figures Nov 6, 2026
@MaxGhenis
MaxGhenis marked this pull request as ready for review November 6, 2026 00:46
…runs

api.policyengine.org/us/report/4940 names and hashes the national file and
holds $657,359,316 and child poverty from 22.23% to 21.72%. EVIDENCE now
cites that record, so the claim no longer rests on the ledger, and sets it
beside our local-area run ($657,356,800; 22.25% to 21.73%) and our
national-file run ($628.7 million; no change).

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

This branch was successfully deployed

1 active deployment
Preview – policyengine-slides — 4d3ec671 Deployed Nov 6, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant