996102e0
GazeAudit release qualification
GazeAudit now carries stable 0.2.0 candidate metadata in the release-preparation
branch. That metadata does not, by itself, mean that v0.2.0 has been tagged or that a
GitHub Release, PyPI upload, DOI, or archival publication exists. Formal release status
begins only after the exact stable candidate has passed the release-candidate gate and a
separate publication action has been explicitly authorized.
Release-engineering principle
Release qualification is deliberately separated from publication. The repository may build and archive candidate distributions automatically, but it must not publish them to PyPI or create a GitHub Release implicitly. A human-controlled publication step comes only after the candidate artifacts and their exact source commit have been reviewed.
The release workflows therefore request read-only repository contents permission and do
not request id-token: write, packages: write, registry credentials, or release-write
permissions.
Ordinary distribution qualification
Every pull request and push to main runs .github/workflows/distribution.yml.
It must:
- build one source distribution and one universal wheel from a clean
dist/; - pass
twine check; - verify package metadata and required frozen scientific JSON resources with
tools/verify_distribution.py; - install the built wheel—not the checkout—in a fresh virtual environment;
- import GazeAudit and verify a packaged scientific resource;
- upload the two qualified distribution files as a GitHub Actions artifact.
The uploaded distribution artifact is CI evidence only. It is not a release.
Stable 0.2.0 metadata gate
The dedicated release-preparation change must keep all release identities synchronized:
[project].versioninpyproject.tomlmust equal0.2.0;CITATION.cffmust report the same0.2.0version;CHANGELOG.mdmust contain a level-20.2.0release entry;- the canonical GazeBase, Korthals, and Pedrotti scientific records must remain unchanged;
- the release-preparation pull request must pass the full standard tests, live interoperability, and distribution workflow;
- the pull request must be merged pinned to its exact qualified head and the merge must then pass exact-main tests, interoperability, distribution, and Pages certification.
On that exact certified main, the stable metadata gate must pass:
python tools/release_gate.py \
--expected-version 0.2.0 \
--require-stable \
--require-changelog-entry
A mismatch between project version, citation version, expected version, changelog entry, or tag remains a hard failure.
Pre-tag candidate qualification
After stable 0.2.0 metadata is merged and exact-main certified, run the manual
workflow_dispatch path of .github/workflows/release-candidate.yml from main with
expected_version=0.2.0. This pre-tag qualification does not create a tag or publish a
release. It reruns the stable metadata gate, rebuilds the candidate distributions,
validates them, installs the candidate wheel in a fresh environment, and archives the
candidate artifacts for review.
Only after that exact-main candidate artifact has been reviewed should v0.2.0 be
created.
Tag-bound candidate qualification
Create the tag v0.2.0 only on the exact certified main commit that passed the
pre-tag candidate qualification. A tag push triggers
.github/workflows/release-candidate.yml, which additionally requires:
python tools/release_gate.py \
--expected-version 0.2.0 \
--tag v0.2.0 \
--require-stable \
--require-changelog-entry
The tag must therefore equal v{project_version} exactly. The workflow then rebuilds the
sdist and wheel from the tagged commit, validates them, installs the wheel in a fresh
environment, and archives the tag-bound candidate artifacts.
Publication boundary
A successful release-candidate workflow means only that the candidate source and built distributions satisfy the repository’s release contract. Actual publication—PyPI, GitHub Release creation, archival deposition, or DOI registration—requires a separate, explicitly authorized action after reviewing:
- the exact tag and commit;
- sdist and wheel SHA-256 digests;
- package metadata and contents;
- citation/changelog identity;
- exact-main CI evidence;
- pre-tag and tag-bound release-candidate evidence; and
- the unchanged authoritative scientific validation records.
No scientific protocol, cohort, endpoint, perturbation, threshold, seed, or canonical classification may be altered as part of release preparation or publication.