Releasing
Pushing a v* tag triggers the release pipeline (.github/workflows/release.yml).
The distribution name is honestml ([project] in pyproject.toml);
[project.urls] points at github.com/sukhov-is/HonestML.
Pipeline
- check — triple version gate
tag == pyproject == honestml.__version__(scripts/check_tag_version.py), then verifies the tagged SHA is onmainwith a green CI run. - build — builds the sdist and wheel.
- audit — installs the wheel with the
boostingextra into a clean venv and runs pip-audit over it; a second pip-audit invocation in the same job emits a CycloneDX SBOM. The escape valve for a CVE without a released fix isaudits/pip-audit-ignore.txt: every entry lands via PR with a justification, a review-by date, and a CHANGELOG line. - publish — uploads to PyPI via trusted publishing (OIDC) from the
pypienvironment; attestations are generated automatically. - github-release — creates the GitHub Release with auto-generated notes and attaches the distribution files and the SBOM.
One-time setup (prerequisites)
- Trusted Publisher on PyPI: register the repository with workflow file
release.ymland environmentpypi— the environment name is part of the trust anchor. - Environment protection rules for
pypiin GitHub settings (required reviewers / tag-only deployment policy) — without them the environment is decorative. - GitHub Pages for the docs site: repository Settings → Pages → Source =
"GitHub Actions".
docs-deploy.ymlthen publishes the site (plusllms.txt/llms-full.txt) tohttps://sukhov-is.github.io/HonestML/on every push tomain— theDocumentationURL inpyproject.toml.
Per-release checklist
- Full suite green on
main(the check job enforces this mechanically). - Green
workflow_dispatchrun ofbenchmark.ymlon the commit being tagged — the gate is no regress vsbenchmarks/baseline.json. - Bump the version in BOTH places:
pyproject.tomlandhonestml.__version__(plus the pin intests/unit/test_public_api.py). - Cut the release section out of
[Unreleased]inCHANGELOG.md. - Tag
vX.Y.Zand push; the pipeline does the rest. - Paste the benchmark run URL into the auto-created GitHub Release notes (the SBOM is attached by CI).
First release
benchmarks/baseline.json does not exist until it is bootstrapped: dispatch
benchmark.yml with update_baseline: true, download the benchmark-results
artifact, and commit baseline.json together with a CHANGELOG line.
Subsequent releases gate against the committed baseline.