Summary
Two faults in the actions-lock machinery, both live on main today.
1 — scripts/check-actions-lock-gate.sh fails the build on a warning-severity finding. Every finding it emits is "severity": "warning", yet the run sets "valid": false and exits 1 with ::error::. A gate whose only findings are warnings but which hard-fails has no way to express "noted, not blocking", so the severity field is decorative.
2 — a stale entry in EXPECTED_ABSENT that the validator's own staleness check disagrees with. The list's comment promises "an entry that stops being used is reported as stale, so it cannot rot either" — the mechanism fires, but the two sides disagree about whether the ref is still in use, so one of them is wrong.
Measured evidence
Gate, on a clean checkout of main:
$ bash scripts/check-actions-lock-gate.sh ; echo rc=$?
{
"workflow": ".github/workflows/tailscale-connect-reusable.yml",
"category": "sha-as-ref",
"severity": "warning",
"confidence": "high",
"dependency": "tailscale/github-action@780049a30b6ff5c378a9e7b389d15ece7a204888",
"detail": "pinned to a bare SHA without a symbolic ref — weakens supply-chain traceability",
"remediation": "pin to a tag instead: https://github.com/tailscale/github-action/releases"
}
"lockfile_version": "v0.0.2",
"valid": false
::error::actions-lock gate: lockfile verification FAILED (exit 1).
rc=1
Note the remediation contradicts estate canon rule 10, which requires a full 40-hex SHA pin. "Pin to a tag instead" is the opposite of the rule the rest of the estate enforces — including validate-sha-pins.sh, which would reject a tag. Two gates in this repo are asking for incompatible things about the same line.
Validator, run from the pre-commit hook on the same tree:
[validate-actions-lock] WARNING: stale exception, no workflow uses
denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed
-- remove it from EXPECTED_ABSENT
[validate-actions-lock] ✅ 25 SHA-pinned ref(s) found among 25 lockfile keys, 1 doctrine exception(s)
EXPECTED_ABSENT is at .githooks/validate-actions-lock.sh:70.
Acceptance criteria
Neither fault is a regression from #899 or #931 — both were measured on main before and after. Found while measuring #931.
Summary
Two faults in the actions-lock machinery, both live on
maintoday.1 —
scripts/check-actions-lock-gate.shfails the build on awarning-severity finding. Every finding it emits is"severity": "warning", yet the run sets"valid": falseand exits 1 with::error::. A gate whose only findings are warnings but which hard-fails has no way to express "noted, not blocking", so the severity field is decorative.2 — a stale entry in
EXPECTED_ABSENTthat the validator's own staleness check disagrees with. The list's comment promises "an entry that stops being used is reported as stale, so it cannot rot either" — the mechanism fires, but the two sides disagree about whether the ref is still in use, so one of them is wrong.Measured evidence
Gate, on a clean checkout of
main:Note the remediation contradicts estate canon rule 10, which requires a full 40-hex SHA pin. "Pin to a tag instead" is the opposite of the rule the rest of the estate enforces — including
validate-sha-pins.sh, which would reject a tag. Two gates in this repo are asking for incompatible things about the same line.Validator, run from the pre-commit hook on the same tree:
EXPECTED_ABSENTis at.githooks/validate-actions-lock.sh:70.Acceptance criteria
sha-as-refblocks or advises. If it advises, awarning-only run sets"valid": trueand exits 0; if it blocks, its severity is raised toerrorso the JSON stops contradicting the exit code.sha-as-refremediation text is reconciled with canon rule 10 — a bare 40-hex pin is the estate requirement, so either the remediation changes to "add a# vX.Y.Zcomment alongside the pin", or the conflict withvalidate-sha-pins.shis stated explicitly and one gate yields.denoland/setup-denodisagreement is resolved by measurement: either the ref is genuinely unused and theEXPECTED_ABSENTentry is deleted, or it is still referenced and the staleness check is fixed to see it. State which, with the command.scripts/check-actions-lock-gate.shexits 0 on a cleanmain, or its failure is a tracked, ledgered exemption rather than permanent red.Neither fault is a regression from #899 or #931 — both were measured on
mainbefore and after. Found while measuring #931.