Bump the four GitHub Actions majors under the clean room standard - #218
Merged
Conversation
Reconstruction of Dependabot's #204, #205, #206 and #207 on main: checkout 4 → 7, setup-python 5 → 7, upload-artifact 4 → 7, download-artifact 4 → 8. Their branches were not merged, not checked out and not run locally — under ADR-009 a bot's bytes get the same treatment as anyone else's. The four land in one commit rather than four merges because two of them are coupled. From upload v7 / download v8 the artifact actions share a direct upload contract: upload can skip zipping via `archive: false`, and download decides whether to decompress by sniffing Content-Type. Neither option is used here, but bumping one side alone leaves a producer and a consumer of that contract straddling it for as long as the other change sits unmerged. The rule is recorded beside the steps, since a later session bumping one of them is precisely who needs it. The jumps look worse than they are. Three of the four crossed a major only to move to Node 24 — a change the publishers themselves describe as "not a breaking change per-se but we're treating it as such". Every real break across the seven majors is gated behind an input this project does not set or a trigger it does not use: download-artifact v5 changed the path layout for artifacts fetched by ID and we fetch by name; setup-python v7 dropped `pip-install`, never passed here; checkout v7 refuses to check out a fork PR under `pull_request_target` or `workflow_run`, and neither workflow uses either trigger. setup-python v7 also carries a commit called "remove EOL Python versions", which is the one plausible way this breaks a five-version matrix — reading its file list, it touches only that action's own CI matrices and test fixtures, and nothing about which interpreters it installs. download-artifact v8 promotes a digest mismatch from a warning to an error. Taken deliberately rather than by omission: this is the one path that feeds PyPI, and a corrupted dist should stop there. checkout@v7 and setup-python@v7 are proven, not assumed — they touch ci.yml, so the upstream PRs' own sandboxed runs exercised them green across Python 3.10 through 3.14. The artifact pair is not: it appears only in publish.yml, which fires on `release: published`, so the green checks on #205 and #207 ran the unchanged ci.yml and say nothing about it. The next release is its first real exercise. Accepted because the usage is entirely default-shaped and the failure would be a failed release job before PyPI receives anything. Suite 805 green.
This was referenced Sep 8, 2026
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.
What
Bumps the four GitHub Actions majors Dependabot proposed, in one commit:
actions/checkoutactions/setup-pythonactions/upload-artifactactions/download-artifactReconstructed on
mainunder the clean room standard inCONTRIBUTING.md— those four brancheswere not merged, not checked out and not run locally. Under ADR-009 a bot's bytes get the same
treatment as anyone else's. They can be closed when this merges.
Why one PR and not four
The two artifact actions are coupled. From upload v7 / download v8 they share a direct-upload
contract: upload can skip zipping (
archive: false) and download decides whether to decompress bysniffing
Content-Type. Neither option is used here — we upload a directory, so it zips, and theround trip is by name — but merging them separately would leave a producer and a consumer of that
contract straddling it for as long as the second PR stayed open. The pairing rule is recorded in
publish.ymlbeside the steps, because a future session bumping one of them is exactly who needs it.The audit
Full record:
.prawduct/artifacts/queued-actions-bumps-204-207.md(untracked, per thepublic-tree-product-only ruling).
Every target tag was verified as a real upstream release through the API rather than recalled — all
four postdate this session's model cutoff. Every major in every jump was read for breaking changes.
The jumps are smaller than they look. Three of the four crossed a major only to move to Node 24,
which the publishers themselves call "not a breaking change per-se but we're treating it as such".
Every genuine break across the seven majors is gated behind an input this project does not set or a
trigger it does not use:
download-artifactv5 changed the path layout for artifacts fetched by ID; we fetch by name,which upstream's migration guide lists under "no action needed".
setup-pythonv7 removed thepip-installinput, never passed here.checkoutv7 now refuses to check out a fork PR underpull_request_targetorworkflow_run.Neither workflow uses either trigger — and the hardening runs with this repo's fork-PR posture.
setup-pythonv7 also carries a commit titled "remove EOL Python versions", the one plausibleway this breaks a five-version matrix. It does not: reading that PR's file list, it touches only
that action's own CI matrices and test fixtures, nothing about which interpreters it can install.
download-artifactv8 promotes a digest mismatch from a warning to an error. Taken deliberatelyrather than by omission — this is the one path that feeds PyPI.
Runner floor (≥ v2.327.1 for three of the four) is met: both workflows are
ubuntu-latest,GitHub-hosted, no self-hosted runners.
The gap, stated rather than glossed
checkout@v7andsetup-python@v7are proven — they touchci.yml, so this PR's own matrix runexercises them, as did the upstream PRs' (green on Python 3.10–3.14).
The artifact pair is not. It appears only in
publish.yml, which fires onrelease: published,so nothing here reaches it — the green checks on #205 and #207 ran the unchanged
ci.ymland saynothing about those actions. The next release is the first real exercise of that round trip.
Accepted because the usage is entirely default-shaped and the failure mode is a failed release job
after the tag is cut and before PyPI receives anything: loud, and recoverable.
Test plan
make test— 805 passed, 17 skipped, lint + mypy green (make testdepends onlint).checkout@v7andsetup-python@v7across 3.10–3.14.publish.yml; see the gap above.Notes
.github/workflows/, andgh pr mergefails on the missingworkflowOAuth scope. (The SSH push was unaffected.)CLAUDE.mdalso forbids--autoonanything touching CI or deploy config, so this one waits for you either way.
.prawduct/change-log.mdentry written and hand-checked;check-change-log-entrycannot see itbecause
.prawduct/is gitignored here (prawduct-upstream: [chore] change-log gate unsatisfiable when gitignored #180).floor raises that owe a deprecation announcement.
filed as [chore] Pin GitHub Actions to full commit SHAs, not mutable major tags #219. Out of scope for a version bump; it is a posture change.
Critic review
rev-20260908T213506Z-dbdb1ae6(cumulative) — 0 blocking, 3 warning, 3 note. Nothing gated.All six dispositioned; the three warnings are fixed rather than waved through:
arithmetic slip:
Ran 805is the total including the 17 skipped, so passed is 788, not 805.python-minor-and-patchshould have collapsed four of them — filed as [bug] Dependabot's pip group did not collapse four minor/patch bumps, and the ecosystem is now at its PR ceiling #220. Verified beforefiling: Watch Python dependencies and workflow actions with Dependabot #203 merged at
06:26:06Zand all nine PRs opened within 95 seconds, so the config wasread. Root cause not diagnosed; the next weekly run is the free discriminator, and the
recommendation is to change nothing until it reports. This is why the pip ceiling matters now:
a new pip major currently cannot open a PR.