ci: consolidate action pins — one SHA per action, no moving tags - #49
ci: consolidate action pins — one SHA per action, no moving tags#49noahgift wants to merge 1 commit into
Conversation
The fleet asks GitHub for SIX different `actions/checkout` refs, and each one is a separate cache entry on each of 16 runners. Measured 2026-08-17: @v7 (tag) 31 uses -> v7.0.1 today @df4cb1c0… 20 -> v6.0.3 @de0fac2e… 13 -> v6.0.2 @v6, @v5 (tags) 4 @34e11487… THIS FILE 6 -> v4.3.1 16 runners x 6 refs is ~96 downloads of one action, which is why CI spent the afternoon failing on Failed to download action 'https://codeload.github.com/actions/checkout/...' 429 (Too Many Requests) ... after 3 attempts That is NOT an API rate limit — `gh api rate_limit` read core 106/5000 and graphql 0/5000 at the time. codeload is a different endpoint with no published limit, so being inside the documented budget and being 429'd are both true at once. The amplification is ours. This file is the highest-leverage single place: every repo consumes it, and it was pinning the OLDEST checkout in the fleet — v4.3.1, three majors behind. actions/checkout 34e11487 (v4.3.1) -> 3d3c42e5 (v7.0.1) actions/upload-artifact @v4 (moving tag) -> ea165f8d (v4.6.2) v7.0.1 is not a leap into the unknown: 31 uses across the fleet already run `@v7`, which resolves to exactly this commit today and passes. For those it is a no-op that removes a moving tag; for this file it is the upgrade it had been missing. No moving tags remain in this workflow. A moved tag is both a re-download and an unaudited change, so pinning is a supply-chain fix as much as a bandwidth one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Heads-up from paiml/infra's nightly This branch:
No action needed beyond merging/rebasing main before this lands. Flagging it Not pushing to your branch. Found while getting infra's nightly audit green |
The fleet asks GitHub for six different
actions/checkoutrefs, and each is a separate cache entry on each of 16 runners. Measured 2026-08-17:@v7(tag)@df4cb1c0…@de0fac2e…@v6,@v5(tags)@34e11487…← this file16 runners × 6 refs ≈ 96 downloads of one action, which is why CI spent the afternoon failing on:
This is not an API rate limit
gh api rate_limitread core 106/5000, graphql 0/5000 while it was happening.codeload.github.comis a different endpoint with no published limit — so "we're inside our documented budget" and "we're being 429'd" are both true simultaneously, and nothing inrate_limitwill ever show it. The amplification is ours.Why this file first
Every repo consumes it, and it was pinning the oldest checkout in the fleet — v4.3.1, three majors behind everything else.
v7.0.1 is not a leap into the unknown: 31 uses across the fleet already run
@v7, which resolves to exactly this commit today and passes. For those it becomes a no-op that removes a moving tag; for this file it is the upgrade it had been missing.Supply chain, not just bandwidth
No moving tags remain in this workflow. A moved tag is both a re-download and an unaudited change.
Follow-up
Per-repo pins still need consolidating onto the same SHA — mechanical, sequenced after the open dependabot bumps rather than colliding with them.
A shared runner-level cache (
ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE, confirmed present in runner 2.336.0) would remove the 16× multiplier too, but its seeding convention isn't recoverable from the binary and needs an empirical test first.🤖 Generated with Claude Code