ci: gate releases on the py_vollib differential, drop the nightly cron#24
Merged
Conversation
The differential (compat shim vs py_vollib, 20,448 cases) backs pyvolr's headline "matches reference" claim but gated nothing: it ran only on a nightly cron + workflow_dispatch, while merge-to-PyPI is ~1 day. A compat regression could reach PyPI unnoticed. - differential.yml: add `workflow_call` (reusable) and drop the `schedule` cron. pyvolr's outputs only move on our own commits and py_vollib is abandoned (frozen), so a nightly run just recomputed an identical result -- the signal that matters is "are we about to publish something that no longer matches?", which is the release gate, not the clock. workflow_dispatch is kept for manual runs. - release.yml: add a `differential` job that calls the reusable workflow and add it to publish-pypi's `needs`. Wheels cannot reach PyPI unless the differential passes; it runs in parallel with the wheel builds, so no added wall-clock on a green release. Deliberately minimal (maintainer call): no PR-path trigger and no pinning of the unpinned py_vollib reference -- both deferred. Verified with actionlint (reusable-call + needs references resolve clean). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
yipjunkai
added a commit
that referenced
this pull request
Jun 11, 2026
#24 dropped the differential's nightly schedule and wired it into the release path (publish-pypi needs the differential job), so the Sustainability bullet's "Nightly differential tests ... to catch numerical drift" was stale. Reframe it as the release gate it now is. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
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.
What
Wires the py_vollib differential (20,448 cases) into the release path as a hard gate, and drops the now-redundant nightly cron.
Why
The differential backs pyvolr's headline "matches py_vollib" claim but gated nothing — it ran on
schedule(nightly) +workflow_dispatchonly, while merge-to-PyPI is ~1 day, so a compat regression could reach PyPI unnoticed. And the nightly was mostly wasted: pyvolr's outputs only move on our own commits and py_vollib is abandoned (frozen), so a nightly recomputed a bit-identical green ~365×/year. (It was also the lone CI stack installing unpinned, against #16's "lockfiles govern CI" line.)Changes
differential.yml:+ workflow_call(reusable),- schedule.workflow_dispatchkept for manual runs.release.yml: newdifferentialjob that calls the reusable workflow, added topublish-pypi'sneeds. Runs in parallel with the wheel builds, so no added wall-clock on a green release — but no wheel reaches PyPI unless the differential passes.Gate semantics
publish-pypi→needs: [build-sdist, build-wheels, differential]. If the differential fails at tag time,publish-pypiis skipped →create-release(which needs it) is skipped → nothing publishes. No branch-protection change needed — it's a workflow-internal dependency.Deferred (deliberately minimal, per maintainer call)
Verification
actionlintclean locally (validates the reusable-workflowuses:+needs:references) — the same linterci.ymlruns.differential.ymlon this branch to confirm the reusable refactor still runs green (see Actions)..md), soci.ymlruns andci-passedreports — normally mergeable.🤖 Generated with Claude Code