Skip to content

fix(release): accept the .publish.attestation sidecars the publish action writes - #327

Merged
abrichr merged 1 commit into
mainfrom
claude/release-attestation-files
Sep 1, 2026
Merged

fix(release): accept the .publish.attestation sidecars the publish action writes#327
abrichr merged 1 commit into
mainfrom
claude/release-attestation-files

Conversation

@abrichr

@abrichr abrichr commented Sep 1, 2026

Copy link
Copy Markdown
Member

pypa/gh-action-pypi-publish writes <distribution>.publish.attestation beside each file it uploads. The release workflow then runs scripts/verify_pypi_release.py on that same dist/ directory ("Verify immutable PyPI publication bytes"), and the script refuses any file that is not the wheel or the sdist. On the v0.95.1 tag push (run 33572718878) the upload succeeded, 0.95.1 is on PyPI, the verification step failed on the sidecar, and publish-github-release never ran. So there is no GitHub release for v0.95.1.

The published bytes were verified another way: a local uv build --no-sources of the v0.95.1 tag produced a wheel and sdist that scripts/verify_pypi_release.py --version 0.95.1 matched against PyPI byte for byte (wheel 65eb9509…, sdist 96858802…).

What changes: _local_artifacts skips files ending in .publish.attestation. The wheel and sdist are still required by name and still compared by hash and by body. One test pins it.

What a reviewer should check: whether skipping a sidecar can hide a wrong artifact. It cannot, because the skip is by suffix and the two real distributions are still mandatory.

After this lands the proposal bot will open chore(release): prepare 0.95.2. Publishing that is the first release where both post-#303 gates pass end to end and a GitHub release is created.

Opened by an agent session, not the founder.
🤖 Generated with Claude Code

…tion writes

pypa/gh-action-pypi-publish writes <distribution>.publish.attestation
beside each file it uploads. The post-publication step 'Verify immutable
PyPI publication bytes' runs scripts/verify_pypi_release.py on the same
dist/ directory afterwards, and that script refused the sidecars as
unexpected local distributions. On the v0.95.1 tag push (run
33572718878) the upload succeeded, the verification step failed, and the
GitHub release job never ran. The sidecars are skipped; the wheel and
sdist are still required and still compared byte for byte.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@abrichr
abrichr merged commit a19cec5 into main Sep 1, 2026
2 checks passed
@abrichr
abrichr deleted the claude/release-attestation-files branch September 1, 2026 23:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant