This repository has two release workflows:
Prepare PyPI Release: creates a release PR with GitHub Actions Bot.Publish Python Package: publishes an already-merged version to PyPI through Trusted Publishing.
- Open GitHub Actions.
- Run
Prepare PyPI Release. - Enter the next version, for example
0.1.2. - Review the generated PR.
- Wait for central required OpenCode and Strix checks plus Security Process evidence.
- Merge the release PR.
- Run
Publish Python Packagefromdevelop, or push the matchingvX.Y.Ztag.
The prepare workflow refuses to create a release if that version already exists on PyPI. This prevents accidental duplicate uploads.
The GitHub Actions Bot:
- validates that the requested version is not already on PyPI;
- updates
scanner/cli/appguardrail.py; - adds a changelog entry;
- installs release build tooling from
requirements-release.txtwithpip --require-hashes; - audits the installed release build tooling environment with
pip-auditagainst OSV data; - builds the source and wheel distributions;
- checks the distributions with
twine; - uploads
release-sbom.cdx.jsonandrelease-provenance.jsonas therelease-supply-chain-evidenceartifact; - opens or updates a release PR;
- dispatches the release Security Process workflow.
Central required OpenCode and Strix workflows remain the review gates. The bot prepares the PR; it does not merge or publish on its own.
requirements-release.in lists the direct release build tools. Regenerate
requirements-release.txt with hashes after changing it:
uv pip compile --generate-hashes --python-version 3.13 --universal requirements-release.in -o requirements-release.txtThe prepare and publish workflows install release build tooling only with
pip install --require-hashes. This keeps build, upload, SBOM, and audit tools
bound to the hashes reviewed in the repository.
Both release workflows create a CycloneDX environment SBOM and a provenance JSON file that records the workflow identity, commit, Python runtime, hashed release requirements file, and SHA-256 digests for the built distributions.
The publish workflow uses PyPI Trusted Publishing through
pypa/gh-action-pypi-publish, so the package upload job keeps id-token: write
isolated to the publishing step. That action publishes digital attestations by
default for Trusted Publishing flows.