Repository navigation
Conversation
Scores each released policyengine-taxsim / policyengine-us pair against the TAXSIM side of the published full-data release, with the dashboard's own households, tolerances and match_flags(). Pairs PyPI can no longer install are recorded with the reason rather than scored with a substitute. - scripts/alignment_history.py: plan, reference, measure, merge - scripts/alignment_worker.py: runs one batch inside the pair's own venv - .github/workflows/alignment-history.yml: after CI on main, daily, on demand - dashboard: Agreement by release section (chart, table, unscored releases) - property, differential and invariant tests (Hypothesis, fast-check) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he README Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first full run (37981903700) showed a worker that ran all five years in turn passing 6 GiB. One process per batch and year matches the dashboard refresh, whose workers peaked at 3.2 GiB. A worker stopped for memory or time, or one that crashes, now fails the job and writes no row, so the pair is measured again later. Only a year the release itself cannot compute is recorded as failed. Failed and install-failed pairs are planned again while in scope. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…output artifacts - record: the versioning check now runs immediately before each push, inside the retry loop, so the window in which a push could land between a release's checkout and its push is a second or two, not the length of the merge. - measure: row.json is its own small artifact, so record no longer downloads every pair's per-household outputs. - chart: label the first and last day when the releases span under two months. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ter checks Pairing - A release is available from its first uploaded file, which is what uv --exclude-newer sees; the environment is resolved once both are complete. - A version-bump commit is only a lower bound on publication. A release PyPI lacks is placed from its publish job: published in that job's window, or never published. Evidence is read newest candidate first, and only as far as needed (96 lookups for the full backfill plan). - All modes use the same rule, so a release deleted after publishing is no longer replaced by an older one. A pair that can't be settled is reported as undetermined and not recorded, so better evidence can settle it later. - A release published within the last day but missing from PyPI's index is left undetermined rather than called deleted. Recording - ci.yml: the versioning job fast-forwards over commits that touch only alignment_history.json, so a row recorded during CI can't fail that run's release. The record job still refuses to push while a versioning job runs, and now treats a GitHub API error as running. - merge replaces a recorded row only with one that measured more years, adds new triggers to a kept row, and drops a not-installable row once its releases are re-paired. It copies its inputs. - Only planned, full-population rows for years the reference has are valid. Measuring - MemoryError and OSError crash the worker (retried, never recorded as the release's failure). Every worker's process group is cleared on exit. - measure verifies the source and reference hashes before scoring. - reference checks every TAXSIM input and the tax year against the source. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r; thin date labels - docs/alignment-history.md: pairing evidence, the two kinds of failure, how recording stays clear of releases, and measured figures (34 minutes and 4,480 MiB per worker in run 38006256962). - dashboard: the TAXSIM reference selector stays when the chosen reference has nothing scored; month labels thin to the chart's width. - tests: crashed workers leave no children; the total-memory requeue. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Why
At the BLS Consumer Expenditure seminar on 2026-10-08, BLS asked whether we share how each release changes results. We said the validation dashboard would show alignment with TAXSIM by version. This PR adds that view, backfills it, and keeps it current.
What it shows
A new Agreement by release section on
/us/taxsim/dashboard, under the headline metrics. It follows the page's year, state and tolerance controls:policyengine-taxsim/policyengine-uspair, with a crosshair tooltip (keyboard: arrow keys);Version labels match
policyengine-taxsim --versionand the provenance keys in #1412 / #1414 (policyengineTaxsimVersion,policyengineUsVersion,policyengineCoreVersion,taxsimBinaryBuild,taxsimBinarySha256).How a row is measured
Details are in
docs/alignment-history.md.full-ecps-comparison-run-35953332152). They come from build cd2026090910, except GA and MD in 2024–2025, which use build cd2026081819. Every row is scored against the same outputs, so a change between rows comes from the emulator or the model.uv pip install --exclude-newer), with the refresh's options. Options a release lacks are recorded.refresh_dashboard.match_flags(), the same function as the summaries. The file stores counts only, overall and per state. The dashboard computes the rates.Which pairs
policyengine-usthat was newest when it came out.policyengine-usrelease per day (the last one PyPI serves), with the emulator release that was newest then.not-installablewith the reason, never scored with a substitute. Of 112 emulator releases, 83 can't be installed: PyPI deleted the release, itspolicyengine-uscounterpart, or both.policyengine-usversion's Publish job. A failed, skipped or cancelled publish means nobody could have installed that version. For example, taxsim 2.31.3 pairs with policyengine-us 2.6.17, because 2.6.18 to 2.6.20 never published.Wiring
.github/workflows/alignment-history.ymlruns:main(which publishes each release);policyengine-usreleases;releasefor one emulator release,backfillfor all of them.Its jobs are plan → reference → one measure job per pair → record. Record commits the file to
main, after waiting until noversioningjob is running, because that job pushes without pulling.ci.ymland the release process are unchanged.Invariants (all tested)
score()doesn't depend on household order.score()andrefresh_dashboard.summarize()tally identically (Hypothesis).summary_{year}.jsonexactly (run in thereferencejob; verified locally for 2021–2025).policyengine-uswas newest, it is right for every consistent history (Hypothesis).Status
Draft. The backfill is running from a scratch branch. Numbers will be added here only from computed rows.
axiom: n/a: dashboard and validation tooling; no policy logic.
🤖 Generated with Claude Code