Repository navigation
Pin the October 5 audits' leaderboard impact, proposals and answers to the passes' inputs - #206
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The leaderboard_impact.py scripts in reference_audit/2026-10-05, 2026-10-05-louisiana, 2026-10-05-medicare-part-b and 2026-10-05-payroll read the frozen run from the working tree. Release dashboard-data-20261006 (#202) rewrote it, so on main three of them stop on duplicate exclusions and the Louisiana one exits 0 after rewriting both of its evidence files. Each script now stages every input it reads with git show at the pass's commit (the run at 8b4c0ca, the audit's inputs at 9ce4ade), checks a pinned sha256, and reads only the staged copy. --out-dir writes the evidence elsewhere, and --scratch must lie outside the repository. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es' inputs reference_audit/2026-10-05/scripts/propose_exclusions.py, 2026-10-05-medicare-part-b/scripts/propose_exclusions.py and 2026-10-05-payroll/scripts/model_answers.py also read the frozen run from the working tree. On the run #202 left, the SALT proposals exit 0 with no proposals, the Part B proposals stop on already-excluded outputs, and the payroll answers flip the scored column on 184 rows. Each now reads every input with git show at the pass's commit, checks every pin before reading or writing anything, and takes --out-dir. The tests (renamed tests/test_reference_audit_pins.py) rerun all three from a checkout whose working tree is junk and require the committed files byte for byte. Each audit's README lists every pinned input with its sha256. 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>
… junk checkout - The four impact scripts refuse a --scratch that contains the repository, not only one inside it: pass_inputs() and stage() delete scratch/<name>, so --scratch /tmp with the checkout at /tmp/pass_inputs/... deleted it. - The junk-checkout tests now load each script from the junk checkout, so HERE and ROOT both point there; a read through HERE no longer escapes. - They run always_zero and Part B's legacy impact summary for real on the staged copies, and require the committed always-zero baselines and legacy summaries, so reads inside those helpers are covered too. - Tests use a self-cleaning scratch directory instead of tmp_path, which pytest keeps for three runs (about 2 GB here). - Louisiana's README: the exclude option scored 1,918 instead of 1,926. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
force-pushed
the
impact-evidence-pinned-inputs-1005
branch
from
October 10, 2026 11:21
0fbcba8 to
8e97a32
Compare
…s in the junk - The impact scripts' overlap guard compares device and inode instead of path spelling, so a parent spelled in another case on a case-insensitive filesystem (or reached through a link) is refused too. - The junk-checkout tests chdir into the junk checkout and pass its copy of the script as argv[0], so a read relative to the working directory no longer reaches the real checkout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ds land in the junk Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Squash-merged as
|
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.
Summary
This PR does what #205 does for the reference adversary, for the four other October 5 audits (2026-10-05 SALT withholding, Louisiana, Medicare Part B, payroll). Their
scripts/leaderboard_impact.pycopied the working tree's run and compared it against the working tree'sdata.json.gz. Release dashboard-data-20261006 (#202,9ce4ade8) rewrote that run, so the scripts no longer regenerate their evidence. Three non-engine scripts in the same audits read the run the same way, and this PR pins those too.No committed evidence, proposal, reference, exclusion or score changes. The diff touches seven scripts, four READMEs and one new test file.
The bug, reproduced
I ran every unmodified script in two scratch clones of main (
4db91b5f):b1da3eae…, exclusions92741dfd….8b4c0ca1. That commit is Add GPT-6.1 Sol (release dashboard-data-20260930, 46 models) #187, release dashboard-data-20260930, the release each audit's README andpolicybench/paper_results.pyname.8b4c0ca12026-10-05/…/leaderboard_impact.pyduplicate exclusion for ('scenario_022', federal …). #202 installed all three records.2026-10-05-louisiana/…/leaderboard_impact.pyexclude), and the top-five orders and rank changes move2026-10-05-medicare-part-b/…/leaderboard_impact.py --weights-check2026-10-05-payroll/…/leaderboard_impact.py --with-saltsaltcopy2026-10-05/…/propose_exclusions.pyproposed_exclusions.jsonas "0 proposed, 5 already excluded"2026-10-05-medicare-part-b/…/propose_exclusions.pyalready-excluded outputs moved2026-10-05-payroll/…/model_answers.pymodel_answers.csv:scoredflips to False on the four outputs' 184 rows, and no other column changes2026-10-05-payroll/…/propose_changes.pyThe eight records #202 installed are exactly these audits' records: SALT's three, Part B's Virginia record and payroll's four.
The fix
Each script now has one
INPUTStable,{repo path: (commit, sha256)}, with an entry for every file it reads from the repository:8b4c0ca1: payload, predictions, references, sidecars, exclusions and scenarios. Part B also pinsanalysis/impact_summary_by_model.csv, and its proposals also pinapp/src/modelMeta.ts.9ce4ade8, the squash merge that brought these directories in: proposals, sweep CSVs and JSONs, and the classification.How the scripts read them:
git_input()/git_bytes()read each file withgit show <commit>:<path>, and stop with SystemExit unless the bytes match the pinned sha256. The impact scripts stage every input under<scratch>/pass_inputs/<path>before anything else, and read only that copy. The other three scripts check every pin before they read or write anything.--out-dirwrites the evidence elsewhere; the default is unchanged. The impact scripts also refuse a--scratchthat overlaps the repository, whether inside it, equal to it or containing it, becausepass_inputs()andstage()delete and recreatescratch/<name>. The guard,overlaps(), compares filesystem identity (device and inode), so a link or another spelling of case cannot hide an overlap. Pin the reference adversary's leaderboard impact to the pass's inputs #205's guard rejects only the inside case.#191's SALT records: the payroll script used to read them with an unchecked
git show 8af912a0:….8af912a0is #191's head, which exists only on its closed branch, not on main. #202 merged the same bytes (sha2563c330177…), so the script now reads them from9ce4ade8.leaderboard_impact.jsonstill recordssalt_commit: 8af912a0. Part B's committed copy of those records is pinned to the same sha256, and a test checks that #191's head holds those bytes whenever the branch is fetched.The scoring code (
policybench, andscripts/freeze_snapshot.pyfor Part B) is still the checkout's. Each impact script's published-reproduction check, and the slow test, catch drift there.READMEs. Each audit gains a "Pinned inputs" section: a table per script with every input, its commit and its full sha256, generated from the scripts'
INPUTS. It also says what the unpinned script did on #202's run, and gives the reproduce commands.Corrections in the touched sentences:
leaderboard_impact.logfor SALT, Part B and payroll is fixed; none of those logs was committed.Tests (
tests/test_reference_audit_pins.py)git show. The impact scripts stage exactly those files and remove stale files. The payload is the README's 46 models × 1,928 scored outputs.PAYLOAD_SHA256in the adversary'sdefinition_conformance.pyandpublication_sources.py. The SALT records are one sha256 across four pins and equal Audit the state income tax withheld in federal SALT; propose three exclusions #191's head (skipped if8af912a0is not fetched).8b4c0ca1, before the audit existed;--scratchinside the repository, equal to it, containing it, reached through a link, or spelled in another case (the last runs only on a case-insensitive filesystem).git clone --shared --no-checkoutin which every input path is junk and every other file is absent, except the script itself (and Part B'sscripts/freeze_snapshot.py). The test loads the script from that clone and runs it from inside the clone, withargv[0]naming the clone's copy. SoROOT,HEREand relative paths all point into the junk.analyze(the analyze CLI) stubbed. Every copy starts from the pinned bytes, and each variant changes only the files its records touch (exclusion record, or reference CSV and sidecar). The script writes exactly the committed file names. Every summary field computed from the inputs alone equals the committed one. That includes the always-zero baselines and Part B's legacy impact summaries, whose helpers run for real.@slow. Each impact script really runs from this checkout, whose run is Stop scoring eight tax outputs and date the response window from the last answer (release dashboard-data-20261006) #202's, and must reproduce every committed file byte for byte; for Louisiana that includes the stdout log. This takes about six minutes in total, so CI deselects it.Results, all on this branch (outputs saved under
~/reviews/policybench-impact-pins-1005/tests/):d66e02a2, none skipped;1210c65e. CI runs it again at each head;d66e02a2, from a checkout whose run Add Claude Haiku 5.5 and move the references to policyengine-us 2.38.6 (release dashboard-data-20261010, 47 models) #208 has rewritten again; they also passed atc86e78c7,1210c65eand8e97a320;--out-dir, weakens the scratch guard, or moves the pass commit to Stop scoring eight tax outputs and date the response window from the last answer (release dashboard-data-20261006) #202, and must fail a test.mutate.py: 41/41 killed atc86e78c7.1210c65e, 51 of 68 mutants ran before I stopped the loop to relieve host disk. 49 were killed. The 2 survivors are equivalent: they drop the up-front pin check in two scripts that read every input before their first write.mutate_review.py: 9/9 targeted mutants for the round-1 and round-2 review findings killed atd66e02a2.Test runs use a self-cleaning scratch directory rather than
tmp_path, which pytest would keep for three runs (about 2 GB).Invariants
Release interplay
No file the Haiku 5.5 release pins is touched. That release has since merged as #208 (dashboard-data-20261010, policyengine-us 2.38.6) and rewrote the run again. This branch is rebased onto it, and the slow regenerations pass from that checkout. #208 only added
reference_audit/2026-10-05-louisiana/proposed_exclusions.jsonin these directories, which this PR leaves alone. Nothing in2026-10-05-reference-adversary/changes. #207 moves that audit's pins intoscripts/pass_inputs.py; the cross-check test reads either form, so #206 and #207 can merge in either order.Review
Round 1 (GPT-6.1 Sol via Subfleet, at
0fbcba80): REQUEST_CHANGES.ROOT, so a read throughHEREescaped.All four are fixed in
8e97a320.Round 2 (at
8e97a320): REQUEST_CHANGES.Both are fixed in
d66e02a2.Round 3: pending.
Out of scope
variants.py,decompose_payroll.py, and Louisiana'scheck_retirement_exemption.pyandverify_convention_module.py. They need the policyengine-us 2.15.17 venv. They read the run, and they buildlatest_finalfrom2026-09-28/fixes/, which Stop passing the mortgage interest inputs policyengine-us #9605 deletes #204 changed after these passes. They follow the reference adversary'spass_inputs.pyandstage_fixeswork (stacked on Pin the reference adversary's leaderboard impact to the pass's inputs #205) and are filed as a follow-up.2026-10-05-medicaid-031-annotationsand the September audits' scripts are filed in the same follow-up.axiom: n/a: audit tooling; no policy encoding changes.
🤖 Generated with Claude Code