Skip to content

ci: arm the action-pin gate — findings fail, not just report (backend#1492) - #471

Merged
LukasWodka merged 2 commits into
developfrom
ci/1492-arm-action-pins
Aug 10, 2026
Merged

ci: arm the action-pin gate — findings fail, not just report (backend#1492)#471
LukasWodka merged 2 commits into
developfrom
ci/1492-arm-action-pins

Conversation

@LukasWodka

@LukasWodka LukasWodka commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Arms action-pins so a mutable action ref fails the PR instead of merely reporting. This is backend#1492.

Why now

The pinning work is complete — 415 mutable refs fleet-wide on 2026-08-04, zero on every develop branch today (#1490 and #1491 closed today with that scan). This is the part that makes it stay done.

action-pins has been running here in soft-fail since it reached main: it reports a violation and lets the PR merge anyway. That is exactly the state hand-pinning already proved insufficient — while #1446 was open to pin one action, #1449 added a second unpinned call site of the same action in a non-overlapping hunk of the same file. Both merged cleanly, git reported no conflict because there was none, and a human reading the diff caught it. No gate did.

Arming imports no backlog

Measured immediately before opening this, across all 15 develop branches carrying this caller:

TOTAL develop-branch pin violations: 0

So this flips a check that is already green into one that stays green. Expect quality / action-pins green on this PR.

What it enforces (D10)

Third-party and actions/* refs pinned to a full 40-character commit SHA with a trailing exact-version comment; tracebloc/* refs pinned to @main (Q3). A floating tag can be repointed by its owner at any commit — that is the supply-chain risk this removes.

.github armed this first, because it publishes these workflows to every other repo and its refs are inherited fleet-wide (.github#178, backend#1603).

Parent backend#1405.


Note

Low Risk
CI-only workflow input change with no runtime or application code impact; intended to block new unpinned actions after a zero-violation baseline.

Overview
Arms the shared code-quality workflow’s action-pin check so unpinned/mutable GitHub Action refs fail the job instead of only reporting while the PR can still merge.

The caller now passes action-pins: true and action-pins-soft-fail: false into tracebloc/.github’s code-quality.yml, with comments noting the fleet was at zero pin violations on develop before flipping the gate. Other inputs (python, shell, soft-fail, all-files) are unchanged aside from EOF newline on all-files.

Reviewed by Cursor Bugbot for commit ed80cd3. Bugbot is set up for automated code reviews on this repo. Configure here.

…#1492)

The pinning work is done: 415 mutable action refs across the fleet on
2026-08-04, zero on every develop branch today (#1490, #1491 closed with that
scan). This makes it stay done.

action-pins has been running here since it reached main, but in soft-fail: it
reports a violation and lets the PR merge anyway. That is the state hand-pinning
already proved insufficient. While #1446 was open to pin one action, #1449 added
a SECOND unpinned call site of the SAME action in a non-overlapping hunk of the
same file. Both merged cleanly, git reported no conflict because there was none,
and it was caught by a human reading the diff rather than by any gate. That
incident is why #1492 exists.

Arming imports no backlog. Measured immediately before this change, across all
15 develop branches carrying this caller: ZERO pin violations. So this flips a
check that is already green into one that stays green.

What it enforces, per D10: third-party and actions/* refs pinned to a full
40-character commit SHA with a trailing exact-version comment; tracebloc/* refs
pinned to @main (Q3). A floating tag can be repointed by its owner at any commit,
which is the supply-chain risk the whole class exists to remove.

The .github repo armed this first and for a specific reason: it publishes these
workflows to every other repo, so its own refs are inherited fleet-wide
(.github#178, backend#1603).

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 6c6e616. Configure here.

Comment thread .github/workflows/code-quality-caller.yml Outdated
…puts

My first commit anchored on the bare key `all-files:`, which matched its FIRST
occurrence in the file - the workflow_dispatch INPUT DEFINITION, not the
code-quality call's `with:` map. So `action-pins: true` landed as an invalid
input declaration (inputs need description/type), the workflow failed to load,
and code-quality did not run at all on this PR. Measured: 10 of 15 callers hit
this; the 5 that did not are the ones whose first `all-files:` happens to be in
`with:`.

Now anchored on the `with:` that follows the code-quality `uses:` line, so the
insertion point is structural rather than a name that appears twice. Validated
by parsing the result: action-pins present in jobs.quality.with, absent from
workflow_dispatch.inputs. Also restores the trailing newline the first commit
stripped.
@LukasWodka
LukasWodka merged commit 7a2a220 into develop Aug 10, 2026
25 checks passed
@LukasWodka
LukasWodka deleted the ci/1492-arm-action-pins branch August 10, 2026 07:52
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