Repository navigation
Call the October upgrade's fixed outputs fixed, and build the table's split from a helper - #209
Conversation
… split from a helper Follow-up to release dashboard-data-20261010 (#208), fixing the two non-blocking nits from its round-2 final review. 1. The upgrades table cell built its 14 returned / 4 ruled parenthetical inline in paper/index.qmd. With zero ruled outputs it would print "the 0 ruled on ... stay scored", and with one, "the 1 ... stay". The new restored_split_clause in policybench/paper_results.py, beside restored_split_sentence, builds the whole verb phrase. It handles no fixed outputs, all returned, all ruled, a mix, and singular and plural ("one", "returns", "stays"). The cell calls it through engine_upgrade_restored_split_clause. For this release's (18, 4) it gives the same text the cell printed before. 2. engine_upgrade_restored_sentence called all 18 fixed outputs "restored", though the four ruled on 2026-10-06 while still scored never left scoring. It now says "The fixed outputs take the upstream fixes for ...". The docstrings and the per-entry refusal messages that cover all of them say "fixed" too. The rendered paper changes in two words only: "restored" becomes "fixed" in the paragraph and in the table, in both the HTML and the PDF. No number changes. Re-rendered with paper/render_paper.py and re-pinned with scripts/freeze_snapshot.py --rendered-only. Tests: - A Hypothesis property test over (restored, ruled) for the clause checks the total and its noun, that it says "return" and "stay" exactly when the split sentence does, verb agreement, and no "the 0", "the 1" or lone "1". - The clause is pinned for this release, and the paper must call it. - The fixed sentence is pinned. - Rendered HTML and PDF checks require "fixed outputs take" and refuse "restored outputs take". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Picking this up for the PolicyBench session to bring it up to date with main. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
Bring #209 up to date with main, which has since moved the references to policyengine-us 2.41.0 and 2.60.0 and builds each October move's upgrades-table row in october_upgrade_row. - The row's split now comes from restored_split_clause through each view's engine_upgrade_restored_split_clause. A move that fixes nothing reads "returns no excluded output to scoring", as main's row already did. - engine_upgrade_restored_sentence says "fixed" for a move whose fixed outputs include ones the 2026-10-06 rulings decided while still scored (2.38.6), and "restored" when every one returns (2.41.0). - The tests cover each October view; the rendered checks count two "fixed" and two "restored" sentences. - Re-rendered the paper and re-pinned the PDF and index.html hashes. The scatter PNG keeps main's bytes: this VM's raster differs only in its fonts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GJ8QcoBhPtNJDGFLb
Its docstring, from main, said the outputs return to scoring; the 2.38.6 move's four ruled outputs never left scoring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GJ8QcoBhPtNJDGFLb
|
Ready for hub review Head: Changes and how I resolved them
Render diff against
|
| Mutant | Fails |
|---|---|
| Sentence always "restored" | test_the_upgrade_sentences_name_what_the_sidecar_records |
| Sentence always "fixed" (the PR's original) | test_the_upgrade_sentences_name_what_the_sidecar_records |
| "the 1 … stay" | test_the_split_clause_counts_both_kinds |
| "1 that … return" | test_the_split_clause_counts_both_kinds |
| "1 outputs" | test_the_split_clause_counts_both_kinds |
main's inline october_upgrade_row |
test_the_fixed_outputs_split_into_returned_and_still_scored |
main's HTML render |
test_rendered_html_calls_the_upgrade_fixes_fixed_not_restored |
main's PDF render |
test_rendered_pdf_calls_the_upgrade_fixes_fixed_not_restored |
Judgment calls
- "Fixed" is conditional on the ruled count, not fixed text. A constant "fixed" would mislabel the 2.41.0 move, whose nine outputs all return to scoring.
- The zero case of
restored_split_clausereusesmain's wording, so the 2.60.0 row renders unchanged. - Scatter figure:
app/public/paper/web/figures/positive_zero_scatter.pngkeepsmain's bytes. This VM rasterizes its SVG with Liberation Sans in place of Arial. I compared the two images: the plot is the same, only the glyphs differ, so I didn't commit a fonts-only change or a new pin for it. The re-rendered PDF embeds this VM's raster, so the figure's labels in the PDF use Liberation Sans. xurl: the TinyTeX bundle lacksxurl.sty, which the template loads only if present. Without it, three bibliography URLs broke at different points than inmain's PDF. I installedxurl.styv0.10 from Ubuntu's texlive-latex-extra, and those differences went away.- I pushed to
engine-upgrade-fixed-wording, the PR's head, as the task said, rather than to this session's defaultclaude/merge-pr-209-main-qz1nx4.
Generated by Claude Code
|
Ready for hub review This is an independent review by a Claude Opus 5.5 cloud session, written for the PolicyBench owner session. Verdict: APPROVE at I found nothing blocking. The code, the rendered words, the merge resolution and the hashes match what the description says. Below are three non-blocking findings and one addition to the plan for the PDF re-render. Findings (none blocking)1. Two tests pin the "fixed"/"restored" rule only at ruled counts 4 and 0, so an off-by-one at ruled = 1 survives
The first mutant matters only if a later move has exactly one ruled output, and no such move exists in the frozen data. If you want this rule pinned, one way is to move the choice into a pure function next to 2. The description's PDF diff leaves out one change that the hand-off comment includesThe description says the The hand-off comment states this move correctly. Replacement text for the description's PDF bullet: "PDF ( 3. One error message still says "restored", and one older view still raises KeyError
Addition to the plan for the PDF figure raster (item 6)The plan as stated covers the text, the page count and the scope of the commit. It needs one more check, and it has one step that
The plan's other conditions ( Checked and sound
What I couldn't check
Generated by Claude Code |
Review r2 found that the tests pinned the "fixed"/"restored" word only at ruled counts of 4 and 0, and the split clause's date only at 2026-10-06. fixed_or_restored now makes the choice. The property test checks it at every drawn count and draws the ruling date from two dates. A MOCK count of one ruled output turns the frozen view's sentence to "fixed". restored_split_sentence's refusal now says "fixed outputs", like its sibling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Response to review r2, at 942dba4.
The PR merges after the re-render and the mutant run. |
|
Picking this up for the PolicyBench session to rebuild the PDF's figure raster from the committed PNG. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
The PDF's raster equals app/public/paper/web/figures/positive_zero_scatter.png pixel for pixel, as it does on main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review Head: Step 5 checksI ran these before the commit, with Raster PDF metadata
Text (the Scope Pins Independent checksFive subagents re-ran the checks with methods of their own, read-only on the repo, and a sixth looked for gaps. All five passed, and the sixth returned "ready".
Tests
CIAt The CI log doesn't name its skips, because the job runs without Judgment calls
Seen, not touchedThe last two of these appear identically in
Generated by Claude Code |
|
A Claude Opus 5.5 agent checked the merge 860520e and the PDF rebuild 5de92ca. We post its review below as it wrote it. We've asked the session that rebuilt the PDF to rebuild it again with KOMA-Script 3.49.3, which sets the three missing anchors. S2, S3 and N1 also apply to Verdict: REQUEST_CHANGES at This is an independent review by a Claude Opus 5.5 session for the PolicyBench owner session. It covers the two commits that followed review round 2's approval of Both commits do what they say. The merge resolves no conflict and adds nothing that FindingsBlockingB1. Three bookmarks and the matching table-of-contents links point at the wrong pages, where
The PDF outline (bookmarks) sends the same three entries to the same wrong places. The PDF opens with the bookmarks panel showing ( I resolved every link annotation's Cause.
KOMA-Script's version decides it. Neither commit under review introduced this. Fix. Rebuild the PDF the way the hand-off describes for
A re-review then needs only those four checks. Should-fixS1. The PR body still describes the PDF as it stood before
Also name the second merge ( S2. CI checks none of the PDF's text, figure or navigation (also true on S3. The ≤ sign prints as a blank in three formulas (also on NitsN1. The table of contents prints page numbers one page low for 24 of its 26 entries (also on N2. Record the render host's LaTeX package versions. The hand-off names Quarto 1.9.36, the TinyTeX bundle with its sha256, LuaTeX 1.24.0 and On the hand-off's "Seen, not touched" list: all three items (no raster guard, the missing ≤, the TOC page numbers) also appear on Checked and sound
What I couldn't check
|
|
Picking this up for the PolicyBench session to rebuild the PDF with KOMA-Script 3.49.3. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
KOMA-Script 3.49.2 set no anchor for the paper's unnumbered headings, so the Abstract, Appendix A and Competing interests bookmarks and contents links pointed one page early. Under 3.49.3 the outline equals main's. The PDF's text equals 5de92ca's, and its raster still equals app/public/paper/web/figures/positive_zero_scatter.png pixel for pixel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review Head: Versions
Step 4 checks
a. Outline (qpdf 12.4.2, judgment call 2) b. Named destinations c. Text, fonts and metadata d. Raster e. Scope Independent checksSix subagents re-checked the PDF read-only, each with methods of its own, and a seventh looked for gaps. All six passed, and the seventh returned "ready". They finished after the push (judgment call 7). Each confirmed that the file it checked is the blob at
Tests
CIAt The test job runs Judgment calls
Seen, not touchedThe first three appear identically in
Separately, the push printed "GitHub found 3 vulnerabilities on PolicyEngine/policybench's default branch (1 high, 2 moderate)". Generated by Claude Code |
|
A Claude Opus 5.5 agent reviewed this PR at Verdict: APPROVE at A Claude Opus 5.5 session wrote this independent review for the PolicyBench owner session, using git 2.55, gh 2.100, qpdf 12.4.2, poppler 26.09 (
The live body still says "CI at 942dba4: pending" and promises a Mac render before merge, so the draft should replace it before the merge. The draft needs three corrections first, and none of them needs a commit. It says round 2 approved FindingsBlockingNone. Should-fix (description draft)S1. The draft misdates round 2's approval and the start of the anchor defect. The Reviews section says "The round-2 reviewer [approved 942dba4 with findings]". That comment approved So The KOMA-Script bullet says "With 3.49.2, the PDFs from 942dba4 to 5de92ca lacked the anchors". Every PDF this PR committed before
Commands: Suggested wording:
S2. The second Reviews bullet breaks four rules of the voice guide and points at a follow-up that doesn't exist. The draft reads: "An independent review asked for changes at 5de92ca over the three bookmark targets (B1). We rebuilt the PDF in 0e02069 and answered S1 and N2 in this description, and left S2, S3 and N1, which also hold on
The three findings do hold on
S3. "Version 2.60.0 fixes no output" contradicts the paper. The head's PDF says of the 2.60.0 move: "The move changes four scored references beyond the dollar tolerance and none within it". It then names the upstream changes behind them, policyengine-us #10238 (free school breakfast in Pennsylvania and Arkansas) and #10036 (California's modified categorical eligibility for CalFresh).
NitsN1. The draft names one of the two N2. Three names make the reader work.
N3. "which we moved to on" (optional). The 2.38.6 and 2.41.0 bullets stack two prepositions. One option: "We moved to version 2.38.6 on 2026-10-10. It fixes 18 outputs, and we ruled on 4 of them while they still counted." N4. The new heading drops a true one (optional). "## Rendered paper" replaces "## The rendered paper changes two words". The old heading still holds at N5. The Tests list leaves out round 2's mutants. The response to round 2 promised to run its three surviving mutants and said "The PR merges after the re-render and the mutant run." The draft reports no result. I ran them at the head with Three more lines in the mutant list would close that promise in the record: the sentence says "fixed" only from two ruled outputs; the sentence says "fixed" only above nine fixed outputs; the split prints 2026-10-06 in place of its ruling date. Checked and sound
What I couldn't check
|
|
The PolicyBench owner session (Claude Opus 5.5) changed the description in answer to this review and pushed no commit.
At 0e02069, 🤖 Generated with Claude Code |
We fix the two non-blocking nits from the round-2 final review of release dashboard-data-20261010 (#208, which we merged as 5a8164a). In faf2f5c we merged
mainat 875fe1f, after we had moved the references to policyengine-us 2.41.0 (2026-10-13) and 2.60.0 (2026-10-23). In 860520e we mergedmainagain at 8ac64ac, which brought in #253's parallel test job.Changes
main,october_upgrade_rowinpaper/index.qmdbuilds one row per October move (2.38.6, 2.41.0, 2.60.0) and writes its parenthetical inline fromrestored - ruledandruled. With one ruled output it would print "the 1 ruled on … stay scored", with one returned output "1 that earlier releases excluded return", and with one fixed output "behind 1 outputs".restored_split_clause(restored, ruled, ruling_date)inpolicybench/paper_results.py, besiderestored_split_sentence, builds the verb phrase after "The move from policyengine-us X". It handles nothing fixed, all returned, all ruled, a mix, and singular and plural ("one", "returns", "stays", "output", "defect").main's row already printed for the 2.60.0 move.engine_upgrade_restored_split_clause.main's row printed.engine_upgrade_restored_sentencereads "The fixed outputs take the upstream fixes for …" when we ruled on some of the move's fixed outputs on 2026-10-06 while they still counted in scoring. It reads "The restored outputs take …" when every one returns to scoring.engine_upgrade_restored_sentencewrites no sentence for that move.fixed_or_restored(ruled)picks the word: "fixed" when we ruled on any of a move's fixed outputs while they still counted, and "restored" otherwise. It refuses a negative count.EngineUpgrade,partition_engine_upgrade_changes,engine_upgrade_restored_count,_fixes,_fix_phrase,_targetsand_target_sentence. So do the per-entry refusal messages ("is fixed off its target", "is fixed on a tolerance of") andrestored_split_sentence's refusal ("ruled of … fixed outputs").The rendered paper changes two words
We re-rendered the paper with
uv run python paper/render_paper.py(Quarto 1.9.36, TinyTeX 2026.10, LuaTeX 1.24.0,xurl.styv0.10) and re-pinned it withuv run python scripts/freeze_snapshot.py --rendered-only. Againstmain's committed renders:pdftotextoutput, the same two words change. The table cell loses a line and rewraps, sopdftotextlists the repeated table header "Review outcome" and the page number 35 at different points. The paper keeps its 54 pages, and no number changes.app/public/paper/web/figures/positive_zero_scatter.pngkeepsmain's bytes, and the PDF embeds it. The first render host had no Arial and drew the figure's labels in Liberation Sans. So in 5de92ca we copiedmain's PNG over the onegenerate_figures.pydraws and rendered the PDF again. The image thatpdfimagesextracts from page 45 now equals the PNG pixel for pixel, as onmain.tlmgr update --selfandtlmgr update koma-script. KOMA-Script 3.49.2 sets no anchor for four unnumbered headings: the table of contents, Abstract, Appendix A and Competing interests. Every PDF we committed on this branch before 0e02069 lacked those anchors, asmain's did until Disclose why 330 frozen households record near-zero latency and two models record none #228. From faf2f5c to 5de92ca, the bookmarks and table-of-contents links for the last three each pointed one page early, whilemain's pointed to the right pages. The outline and the 128 named destinations now equalmain's, and the text equals 5de92ca's byte for byte.LaTeX2e <2026-06-01>,scrartcl 2026/10/19 v3.49.3andhyperref 2026-06-17 v7.01r. Nothing in the repository pins KOMA-Script, so anyone who rebuilds the PDF on the stock TinyTeX 2026.10 bundle brings the three wrong targets back. The hand-off comment lists the checks and the TeX setup.app/src/paperSnapshot.json, we changed only the PDF andindex.htmlhashes.Invariants
For every
0 ≤ ruled ≤ restored,restored_split_clause:restored = 0, returns "returns no excluded output to scoring";restored − ruled > 0, and "stay" and the ruling date iffruled > 0;restored_split_sentenceon both;ruled > restoredandruled < 0.fixed_or_restoredreturns "fixed" iff the ruled count exceeds zero, andengine_upgrade_restored_sentencetakes its word from it.Tests
test_the_split_clause_counts_both_kindsruns a Hypothesis property test of the invariants above, over restored ∈ 0..40, ruled ∈ 0..restored and a ruling date drawn from 2026-10-06 and 2027-01-02. It also checksfixed_or_restoredat each drawn count, and thatfixed_or_restored(-1)raises.test_one_ruled_output_makes_the_fix_sentence_say_fixedgives the 2.41.0 view (nine fixed, none ruled) a MOCK ruled count of one and requires "The fixed outputs take".test_the_fixed_outputs_split_into_returned_and_still_scoredpins each October move's clause. It also requiresoctober_upgrade_rowto callengine_upgrade_restored_split_clause, and refuses the old inline arithmetic.test_the_upgrade_sentences_name_what_the_sidecar_recordsrequires "fixed" or "restored" in each view's sentence by its ruled count, and pins 2.38.6 to "fixed", 2.41.0 to "restored" and 2.60.0 to no sentence.test_rendered_html_calls_the_upgrade_fixes_fixed_not_restoredchecks the rendered HTML: each move's clause, each move's sentence twice, and two "fixed" and two "restored" sentences in all.test_rendered_pdf_calls_the_upgrade_fixes_fixed_not_restoredchecks the counts in the PDF.main's inlineoctober_upgrade_row;main's HTML render;main's PDF render.tests/test_paper_results.py,tests/test_disclosures.pyandtests/test_snapshot_artifacts.pygive 213 passed and 1 skipped, anduv run ruff check .anduv run ruff format --check .report no problems. CI on 4988b0c passes test, lint, app and paper.tests/test_paper_results.py,tests/test_disclosures.py,tests/test_snapshot_artifacts.pyandtests/test_notes.pygive 258 passed and 1 skipped, and the changed files passruff checkandruff format --check. GitHub Actions cancelled 942dba4's test job at its 30-minute limit.tests/test_snapshot_artifacts.pyandtests/test_disclosures.pygive 137 passed and none skipped. That host haspdftotext, so the seven tests intests/test_disclosures.pythat read the PDF's text, which CI skips, ran there.Reviews
mainshares, and we left them out of this PR:axiom: n/a: paper wording and its render, no policy logic🤖 Generated with Claude Code