Skip to content

fix(ci): pin comments name the exact version, not the floating major - #13

Merged
hseshadr merged 1 commit into
mainfrom
fix/pin-comments-name-exact-versions
Aug 3, 2026
Merged

fix(ci): pin comments name the exact version, not the floating major#13
hseshadr merged 1 commit into
mainfrom
fix/pin-comments-name-exact-versions

Conversation

@hseshadr

@hseshadr hseshadr commented Aug 3, 2026

Copy link
Copy Markdown
Owner

main went red at ca31ca0 and nothing in this repo changed. Upstream shipped pnpm/action-setup v6.0.10 at 12:06 UTC today and moved the floating v6 tag onto it. Our SHA 0ebf4713 is exactly v6.0.9, but the comment said # v6 — and zizmor's ref-version-mismatch resolves that comment against upstream. The label became false the moment somebody else cut a release.

This is not the pnpm bump PR. It fixes the class.

Five pins carried the same trap

Pin Comment was Comment now Floating tag points to
codecov/codecov-action # v7 # v7.0.0 a99c28d3f0daalready mismatched, just not reported yet
gitleaks/gitleaks-action # v3 # v3.0.0 e0c47f4f8be3 (still matches, for now)
actions/cache ×2 # v6 # v6.1.0 55cc8345863c (still matches, for now)
pnpm/action-setup # v6 # v6.0.9 f520eceda224today's failure

No SHA changed. Every pin resolves to the identical commit. Only the label now says which release that commit actually is.

A floating-major comment on an immutable SHA pin is unfalsifiable — it looks right indefinitely, then goes red for a reason that has nothing to do with this repo. Two of the five were already wrong before today.

Deliberately not bumping

pnpm/action-setup@v6.0.10 is three hours old. The minimum-release-age discipline applies; a dependency failing an age gate is the gate working. Dependabot will propose it once it has aged.

Claim touched

Every third-party action is SHA-pinned with an accurate version label.

Proof the guard can fail

Verdicts are exit codes, and the mutation was asserted to have applied to the file before its run was trusted.

Run Command Exit Result
main in CI run 30819268560 13 1 medium ref-version-mismatch at setup-pnpm/action.yml:65
This branch uvx zizmor@1.26.1 . 0 No findings to report. Good job! (1 ignored, 10 suppressed)
Branch + comment reverted to # v6 uvx zizmor@1.26.1 . 13 same finding returns — restored after, back to exit 0

Follow-up, not in this PR

astral-sh/setup-uv is split-brain: ci.yml is on v9.0.0 after #12, while .github/actions/setup-python-uv/action.yml:54 — the composite consumers actually execute — is still v8.3.2. #12 never touched it. Separate PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_015o7tjWLFZvzRv4KyNfDukx

main went red at ca31ca0 with no change in this repo. Upstream shipped
pnpm/action-setup v6.0.10 at 12:06 UTC today and moved the floating `v6` tag
onto it. Our SHA 0ebf4713 is exactly v6.0.9, but the comment said `# v6`, and
zizmor's ref-version-mismatch resolves that comment against upstream — so the
label became a lie the moment someone else cut a release.

Five pins carried the same trap. codecov was already mismatched and simply had
not been reported yet:

  codecov/codecov-action    # v7 -> # v7.0.0   (v7 had already moved to a99c28d3)
  gitleaks/gitleaks-action  # v3 -> # v3.0.0
  actions/cache (x2)        # v6 -> # v6.1.0
  pnpm/action-setup         # v6 -> # v6.0.9   (today's failure)

No SHA changes. Every pin still resolves to the identical commit; only the
label now tells the truth about which release that commit is. This is the
opposite of weakening the gate — a floating-major comment on an immutable SHA
pin is unfalsifiable until upstream moves the tag, and then it fails for a
reason that has nothing to do with this repo.

Deliberately NOT bumping to pnpm/action-setup v6.0.10: it is three hours old
and the portfolio's minimum-release-age discipline applies. Dependabot will
propose it once it has aged.

Claim touched: every third-party action is SHA-pinned with an accurate version
label. Watched red run: CI run 30819268560 on main, exit 13, one medium
ref-version-mismatch. Locally reproduced by reverting the pnpm comment to
`# v6` — asserted the mutation applied, then `uvx zizmor@1.26.1 .` exit 13;
restored, exit 0, "No findings to report."

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015o7tjWLFZvzRv4KyNfDukx
@cursor

cursor Bot commented Aug 3, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@hseshadr
hseshadr merged commit ae644d7 into main Aug 3, 2026
4 checks passed
@hseshadr
hseshadr deleted the fix/pin-comments-name-exact-versions branch August 3, 2026 13:52
hseshadr added a commit that referenced this pull request Aug 3, 2026
…#14)

#12 bumped astral-sh/setup-uv 8.3.2 -> 9.0.0 but touched only
.github/workflows/ci.yml — this repo's own self-test. The file consumers
actually execute, .github/actions/setup-python-uv/action.yml, stayed on
v8.3.2, so the bump reached nobody downstream.

The split was already visible in the field: edge-proc and edgeproc-core
run v9.0.0 directly in their own ci.yml while calling this composite on
their publish path — v9 on test, v8.3.2 on publish, same repo, same PR.

c771a70e6277c0a99b617c7a806ffedaca235ff9 is v9.0.0, confirmed against
`gh api repos/astral-sh/setup-uv/tags` (v8.3.2 there is the outgoing
11f9893b), and is the same SHA #12 and both consumers already run.

The version comment names v9.0.0 exactly. #13 just removed five
floating-major comments for this reason: zizmor's ref-version-mismatch
resolves the comment against upstream, so `# v9` turns main red the
moment astral-sh cuts a patch. No floating major tag exists upstream
anyway — `v9` and `v8` both 404.

Claim touched: "consumers of this composite run a pinned, immutable,
auditable setup-uv." It was true about immutability and false about
which version — the audited pin and the executed pin were different files.

Evidence:
- GH_TOKEN=... uvx zizmor@1.26.1 . -> exit 0, "No findings to report"
- actionlint -> clean; shellcheck -x + bash -n -> clean
- tests/security-policy.sh -> exit 0
- tests/lint-examples.sh -> exit 0, 173 refs resolved, 0 MISSING

Still on the old SHA after this change: nothing executable. README.md:422
and CHANGELOG.md:273,401 mention v8.3.2 as prose; README.md:197 shows
v8.1.0 in a sample. Reported, not edited — no gate reads them.


Claude-Session: https://claude.ai/code/session_015o7tjWLFZvzRv4KyNfDukx

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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