Problem
Releases publish to PyPI via Trusted Publishing, which is already a strong story — no long-lived tokens. But there's nothing linking the artifact on PyPI back to the commit that produced it, and no machine-readable dependency inventory.
For a tool whose pitch is "this runs on your machine and touches nothing", being able to verify what you installed is very much the point. It's also the first thing a security review at a larger organisation asks for.
What to build
Acceptance criteria
Notes
The workflow filename must stay release.yml — the PyPI trusted publisher is bound to it, and renaming breaks publishing entirely. See the prerequisites section of RELEASE.md.
Worth checking whether PyPI's own attestation support (PEP 740) covers part of this, in which case pypa/gh-action-pypi-publish may do the work already and this becomes mostly a documentation and SBOM task.
Pointers
.github/workflows/release.yml — two jobs; the publish job is the one with id-token: write
- RELEASE.md
Problem
Releases publish to PyPI via Trusted Publishing, which is already a strong story — no long-lived tokens. But there's nothing linking the artifact on PyPI back to the commit that produced it, and no machine-readable dependency inventory.
For a tool whose pitch is "this runs on your machine and touches nothing", being able to verify what you installed is very much the point. It's also the first thing a security review at a larger organisation asks for.
What to build
actions/attest-build-provenance, so the wheel and sdist can be traced to the workflow run and commitRELEASE.mdupdated with how to verify an artifactSECURITY.mdupdated — supply chain is already named as in-scope thereAcceptance criteria
gh attestation verifysucceeds against a published wheelNotes
The workflow filename must stay
release.yml— the PyPI trusted publisher is bound to it, and renaming breaks publishing entirely. See the prerequisites section ofRELEASE.md.Worth checking whether PyPI's own attestation support (PEP 740) covers part of this, in which case
pypa/gh-action-pypi-publishmay do the work already and this becomes mostly a documentation and SBOM task.Pointers
.github/workflows/release.yml— two jobs; the publish job is the one withid-token: write