Repository navigation
Pins the release verify job's actions and names the partial-upload remedy - #12
Merged
Merged
Conversation
The verify job checks out the source, installs the toolchain and stores the files the publish job uploads, so a moved major tag on any of its actions could change what is published without reaching a token. Each is now pinned to a full commit SHA with its version in a comment, the way the publish job already was, at the version the major tag pointed to: checkout v4.4.0, mise-action v4.3.0, upload-artifact v7.0.2. The header now says what to do about a version PyPI holds with only some of its files: a new patch version through a new release prep, with any yank left to the maintainer in the PyPI console. The address step reads the project name from pyproject.toml through a new address subcommand of the guard script, and the gate's coverage measurement now covers scripts/ as well as the package. Refs: uxpy-9q0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bead: uxpy-9q0
What changes
Every action in the release workflow's
verifyjob is pinned by commit SHA, with its version in a trailing comment, the way thepublishjob already was.verifychecks out the source the build reads, installs the toolchain that builds it and stores the filespublishuploads, so a moved major tag there could change what is published without ever reaching a token. Each pin is the version the major tagverifyused pointed to when this was written (no move to a newer major):actions/checkoutv411d5960a326750d5838078e36cf38b85af677262publishcarries)jdx/mise-actionv4c2a87611a18de5b3828c5652fe268e992400cb5cactions/upload-artifactv7cf430e030ddbb5b0abf93d22962f4752f3646cd9How each SHA was resolved:
gh api repos/<owner>/<repo>/git/ref/tags/<tag>for the major tag and for each release tag of that major, following any annotated tag object throughgit/tags/<sha>to its commit (the three major tags and the three release tags named in the table all point at commits directly). The major tag and the named release tag resolve to the same commit in each row. The newest of the three releases, upload-artifact v7.0.2, was published 2026-10-07, two weeks before this change.The header's pinning paragraph now says both jobs are pinned and why; ci.yml keeps its major tags (it holds only contents: read and nothing it builds is published), and is not touched here.
The header names the partial-upload remedy: a version PyPI holds with only some of its files is never completed (every re-run stops at the "already on PyPI" check, and nothing is uploaded by hand); the remedy is a new patch version through a new release prep and its tag; whether to yank the incomplete version is the maintainer's choice in the PyPI console, and the workflow never yanks or deletes anything.
The address step reads the project name from
pyproject.toml:scripts/release_guard.pygains anaddresssubcommand (address()), which runs the same check asversionand printshttps://pypi.org/project/<name>/<version>/with both values frompyproject.toml. The step no longer writesuxidinto the URL.The guard script is under the coverage measurement: the gate's
gate:testtask and[tool.coverage.run]now measurescripts/as well as the package (--cov=uxid --cov=scripts). Total coverage stays above the 90 percent floor (99.17 percent on this head;scripts/release_guard.py97 percent,scripts/check_corpus.py98 percent). Measuring the scripts was chosen over a header sentence saying they are unmeasured because their tests already exist and the measurement costs nothing; CLAUDE.md's Build and Test paragraph says what is measured.No changelog fragment:
changelog.d/README.mdexempts the release workflow, tests and the gate.Tests
Three new tests in
tests/test_release_guard.pycoveraddress(the name and version come frompyproject.toml; a tag naming another version refuses with nothing on standard output; the defaultpyproject.tomlis the repository's). Each was sabotaged against its own mutation ofaddress()or the default path and went red on an assertion, and the file was restored byte for byte.Checks run
mise run gategreen on this head.release.ymlandci.yml: no findings.Review
Release workflow change: the conductor dispatches the cold review.