Build1 distinct publisher3 min readPublished
SHA pinning drew a clean line through the tj-actions compromise, and then Dependabot began bumping hashes faster than anyone could read them. The claim worth enforcing is the version comment that nothing verifies.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The check is one line of logic. Resolve the tag named in the pin comment, compare the result against the SHA on that line, and fail the build when they disagree. That is one API call, and according to the dev.to writeup almost nobody performs it [13]. It catches precisely the shape tj-actions had, where the tags were moved and the commits were not [12]. A disagreement narrows to two cases and both deserve a human look: either your pin is behind the tag, or the tag was repointed under you [13].
That check has to live in software because the review it replaces cannot work. A pinned line followed by `# v5.1.0` makes two claims, and GitHub enforces the first while ignoring the second, because the second is a comment [11]. The diff a reviewer is asked to approve is two hex strings that differ, carrying nothing that says what changed [7].
Volume finishes the job. GitHub's own engineering blog describes a repository where roughly one in six commits were Dependabot version bumps, 61 of them in twelve months, sometimes several in a single day [8]. That works out to about five a month [1]. One maintainer wrote on her own blog that she blindly accepts Dependabot pull requests and that this negates the benefit of pinning [9].
The 61 is a claim about someone else's repository. For it to describe yours you need a comparable count of third-party actions and upstreams that cut releases as often. Four pinned actions with a quarterly bump is a workload a person can genuinely read, and there the reviewer is a real control. A dozen workflows deep in composite actions is the other case, and there the reviewer is a rubber stamp with a merge button.
The asymmetry underneath is the part I would raise at review. Dependabot Alerts do not cover SHA-pinned actions, and users have been asking GitHub to fix that for a while [10]. The format you are told to adopt is the one the vulnerability alerting does not read, so your staleness signal arrives instead as version-update pull requests whose diffs contain no information [7].
The scale is why this belongs in a required check rather than in someone's discipline. GitHub reported 11.5 billion Actions minutes in 2025, up 35% year over year [14], which puts the prior year near 8.5 billion [2]. Datadog's security research found two out of three organisations have at least one vulnerability in an Actions workflow [15]. The incidents kept arriving after tj-actions: in May 2026 a threat group compromised 5,561 public repositories in about six hours by pushing workflows carrying dormant `workflow_dispatch` backdoors [16], and TanStack's router was breached through cache poisoning that led to OIDC token theft and 84 malicious npm packages [17]. The source's explanation for the move to CI is unglamorous. CI holds credentials and gets less review than application code [18].
My read, with the context stated. Keep the pin, since the immutability is real and it held in March 2025 [4]. Then stop treating the bump review as a control and enforce the comment mechanically, so the line that looks like diligence has something behind it besides eyesight.
Ranked by verification strength, evidence, and original report placement.
In March 2025 an attacker compromised tj-actions/changed-files and rewrote its release tags to point at malicious code.
The injected code dumped runner memory into workflow logs, which on a public repository means printing your secrets where anyone can read them.
Around 23,000 repositories depended on tj-actions/changed-files, most of them through a mutable tag such as @v45.
Repositories that had pinned the action to a commit SHA were unaffected by the tj-actions compromise.
A tag reference runs whatever the tag points at when the workflow starts, and the upstream author can move that pointer at any time; a commit SHA reference runs that exact commit and nobody can repoint it.
A pin is a snapshot and snapshots go stale, so teams enable Dependabot because an un-updated pin is its own risk.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · September 2, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
invest
Cursor ships Origin to paying users as GitHub's outage count reaches 2571 distinct publisher
build
Checkout v7 warns and exits rather than clone fork code under pull_request_target1 distinct publisher
build
npm's trust contract moved on 20 May, and older CLIs just get a 400 with nothing in it1 distinct publisher
security
Eight versions of glob in one repo produced a year of mostly unexploitable security alerts1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Strong where you can check it, thin where you cannot
The durable part of this story needs no citation at all: what a tag reference resolves to, what a hash reference resolves to, and the fact that GitHub honours the hash while ignoring the comment sitting next to it. Anyone can confirm that in a terminal. The fragile part is everything wearing a number — 23,000 dependents, 11.5 billion minutes, 5,561 repositories in six hours, 84 packages — all of it relayed by dev.to from material it paraphrased rather than linked, with no second publisher in our coverage to check it against.
Pins are everywhere; the verification is nowhere
Two adoption signals point in opposite directions. The exposed surface is genuinely vast — one small action sitting under 23,000 repositories, Actions minutes growing 35% in a year — so the practice under discussion is mainstream. The fix at the centre has no uptake to measure: dev.to's own summary is that almost nobody makes the tag-resolution call, and no count exists anywhere in this reporting of pins whose comments have already drifted from the tags they name.
Disciplined argument, urgency borrowed from elsewhere
This piece talks itself down more than up: it states that no static check can be certain, that a tool claiming certainty is lying, and that a clean report is not a safety guarantee. What tips the balance slightly positive is the drumbeat around the argument — a nameless threat group, thousands of repositories, a second ecosystem breach — arriving without anything a reader can follow, supplying alarm the verified mechanism did not require. The core claim about the unverified version comment is, if anything, undersold.
The closing section reads as a requirements document
Read the last third as a build list and it becomes one: fetch two revisions, compare declared interface and execution model, flag new network calls or dynamic execution, report what could not be determined. That is a product specification published under a personal handle on dev.to with no statement of interest either way. It does not make the mechanism wrong — the tag-versus-hash asymmetry checks out independently — but the party defining the problem is visibly also the party positioned to sell the fix.
Trust the mechanism, hold the numbers loosely
Our confidence splits along the same seam everything else here does. On how tags, hashes and comments actually behave: high, because it is testable and nothing disputes it. On the statistics and the post-tj-actions incident roll call: low — one publisher, no primary documents in hand, and an author's note that the underlying reporting was rephrased rather than quoted.