Skip to content
Merged
90 changes: 82 additions & 8 deletions .github/workflows/actions.lock
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,47 @@ workflows:
- 'haskell-actions/setup@v2.12.0'
'.github/workflows/codeql.yml':
- 'actions/checkout@v7.0.1'
- 'github/codeql-action@v4.38.0'
- 'github/codeql-action@1c5b675653bb5c22dbe9b12b556ec555138e09fd'
'.github/workflows/dogfood-gate.yml':
- 'actions/checkout@v7.0.1'
'.github/workflows/governance.yml': []
'.github/workflows/hypatia-scan.yml': []
'.github/workflows/governance.yml':
- 'hyperpolymath/standards@fad242d35291de1898242d6737ba02b74a59a2f2'
'.github/workflows/hypatia-scan.yml':
- 'hyperpolymath/standards@84355587cb2a1f86e6882de83514a32db2646e7a'
'.github/workflows/instant-sync.yml':
- 'peter-evans/repository-dispatch@v4.0.1'
'.github/workflows/label-triage.yml': []
'.github/workflows/labels.yml': []
'.github/workflows/mirror.yml': []
'.github/workflows/lock-sync-gate.yml': []
'.github/workflows/mirror.yml':
- 'hyperpolymath/standards@84355587cb2a1f86e6882de83514a32db2646e7a'
'.github/workflows/pages.yml':
- 'actions/checkout@v7.0.1'
- 'actions/deploy-pages@v5.0.1'
- 'actions/upload-pages-artifact@v5.0.0'
'.github/workflows/push-email-notify.yml':
- 'hyperpolymath/smtp-notify-action@v0.3.0'
'.github/workflows/scorecard.yml': []
'.github/workflows/scorecard.yml':
- 'hyperpolymath/standards@84355587cb2a1f86e6882de83514a32db2646e7a'
'.github/workflows/secret-scanner.yml':
- 'actions/checkout@v7.0.1'
- 'trufflesecurity/trufflehog@v3.97.5'
dependencies:
'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9':
ref: '55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
owner_id: 44036562
repo_id: 215566462
'actions/cache@v6.1.0':
ref: 'v6.1.0'
commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
owner_id: 44036562
repo_id: 215566462
'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1':
ref: '3d3c42e5aac5ba805825da76410c181273ba90b1'
commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1'
owner_id: 44036562
repo_id: 197814629
'actions/checkout@v7.0.1':
ref: 'v7.0.1'
commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1'
Expand All @@ -55,6 +70,11 @@ dependencies:
commit: 'sha1-368f82528645a54fb793d4d04e342629a3f51346'
owner_id: 44036562
repo_id: 438112499
'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a':
ref: '043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
commit: 'sha1-043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
owner_id: 44036562
repo_id: 192625955
'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f':
ref: 'v7.0.0'
commit: 'sha1-bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
Expand All @@ -67,9 +87,29 @@ dependencies:
repo_id: 496012378
uses:
- 'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f'
'github/codeql-action@v4.38.0':
ref: 'v4.38.0'
commit: 'sha1-b96794f015dfd88f77b49b1c93e0fa7110f94c63'
'dtolnay/rust-toolchain@6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772':
ref: '6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772'
commit: 'sha1-6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772'
owner_id: 1940490
repo_id: 260749683
'editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c':
ref: '840e866d93b8e032123c23bac69dece044d4d84c'
commit: 'sha1-840e866d93b8e032123c23bac69dece044d4d84c'
owner_id: 26415196
repo_id: 297874902
'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124':
ref: '54075bcc5e249e4758d363f27d099f55d843f124'
commit: 'sha1-54075bcc5e249e4758d363f27d099f55d843f124'
owner_id: 47606891
repo_id: 331103973
'github/codeql-action@1c5b675653bb5c22dbe9b12b556ec555138e09fd':
ref: 'v4.38.1'
commit: 'sha1-1c5b675653bb5c22dbe9b12b556ec555138e09fd'
owner_id: 9919
repo_id: 259445878
'github/codeql-action@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28':
ref: 'db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28'
commit: 'sha1-db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28'
owner_id: 9919
repo_id: 259445878
'haskell-actions/setup@v2.12.0':
Expand All @@ -82,6 +122,35 @@ dependencies:
commit: 'sha1-22e7bdb322c430c1d0dac6b3bb307f4bb139d0be'
owner_id: 6759885
repo_id: 1352485172
'hyperpolymath/standards@84355587cb2a1f86e6882de83514a32db2646e7a':
ref: '84355587cb2a1f86e6882de83514a32db2646e7a'
commit: 'sha1-84355587cb2a1f86e6882de83514a32db2646e7a'
owner_id: 6759885
repo_id: 1116521501
uses:
- 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
- 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1'
- 'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a'
- 'dtolnay/rust-toolchain@6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772'
- 'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124'
- 'github/codeql-action@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28'
- 'ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc'
- 'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555'
'hyperpolymath/standards@fad242d35291de1898242d6737ba02b74a59a2f2':
ref: 'fad242d35291de1898242d6737ba02b74a59a2f2'
commit: 'sha1-fad242d35291de1898242d6737ba02b74a59a2f2'
owner_id: 6759885
repo_id: 1116521501
uses:
- 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9'
- 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1'
- 'editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c'
- 'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124'
'ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc':
ref: '2d1146689b8cda280b9bc96326124645441f03bc'
commit: 'sha1-2d1146689b8cda280b9bc96326124645441f03bc'
owner_id: 67707773
repo_id: 421101922
'peter-evans/repository-dispatch@v4.0.1':
ref: 'v4.0.1'
commit: 'sha1-28959ce8df70de7be546dd1250a005dd32156697'
Expand All @@ -92,3 +161,8 @@ dependencies:
commit: 'sha1-288a8a8643a2c5a36b81d231c550dccfa0beeb64'
owner_id: 79229934
repo_id: 77726177
'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555':
ref: 'e83874834305fe9a4a2997156cb26c5de65a8555'
commit: 'sha1-e83874834305fe9a4a2997156cb26c5de65a8555'
owner_id: 135788
repo_id: 208510314
85 changes: 85 additions & 0 deletions .github/workflows/lock-sync-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# SPDX-License-Identifier: MPL-2.0
name: Lock Sync Gate

# Fails any pull request whose .github/workflows/actions.lock has drifted from
# the workflow YAML. That drift is not cosmetic: GitHub refuses such a run at
# startup, creating ZERO jobs, and reports only "This run likely failed because
# of a workflow file issue." A single grouped Dependabot bump can take out most
# of a repository's CI that way, because Dependabot rewrites `uses:` refs in the
# YAML and cannot touch the lockfile. Measured across 200 repositories on
# 2026-09-22: 39 had silently dead CI from exactly this cause.
# See hyperpolymath/standards#968.
#
# This workflow deliberately carries NO `uses:` of its own. It checks out by
# calling git in a `run:` step instead of using actions/checkout, so it has no
# lockfile entry to go stale and is structurally immune to the very failure it
# detects. Do not add a `uses:` to this file.
#
# There is also no `paths:` filter, on purpose: a filtered workflow never
# reports on pull requests that miss the filter, which deadlocks any branch
# ruleset that requires this check.

on:
workflow_dispatch:
pull_request:
push:
branches: [main]

permissions:
contents: read

concurrency:
group: lock-sync-gate-${{ github.ref }}
cancel-in-progress: true

jobs:
lock-sync:
name: actions.lock is in sync with the workflow YAML
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Check out without actions/checkout
env:
REPO: ${{ github.repository }}
SHA: ${{ github.event.pull_request.head.sha || github.sha }}
BASE_SHA: ${{ github.event.pull_request.base.sha || github.sha }}
TOKEN: ${{ github.token }}
run: |
set -euo pipefail
# Authenticate the fetch. An anonymous clone works only for public
# repositories; this gate must also run on private ones. The header
# form is used rather than a token in the remote URL so the
# credential is never written into .git/config.
AUTH="AUTHORIZATION: basic $(printf 'x-access-token:%s' "${TOKEN}" | base64 -w0)"
git init -q .
git remote add origin "https://github.com/${REPO}.git"
git -c http.extraheader="${AUTH}" fetch -q --depth 1 origin "${SHA}"
git checkout -q FETCH_HEAD
git -c http.extraheader="${AUTH}" fetch -q --depth 1 origin "${BASE_SHA}"
echo "checked out ${SHA}"

- name: Verify lockfile synchronisation
env:
BASE_SHA: ${{ github.event.pull_request.base.sha || github.sha }}
run: |
set -euo pipefail
# The checker is taken from the BASE commit, never from the pull
# request's own tree, so a PR cannot weaken the gate that judges it.
#
# Exception, and only this one: on the PR that FIRST introduces the
# checker the base has no copy of it, so the base-only form can never
# pass. Fall back to the head copy in that case alone -- there is no
# base version for the head to be weaker than, so the anti-tamper
# property is not what is being given up. Absent from both is a hard
# failure, never a skip.
if git cat-file -e "${BASE_SHA}:scripts/check-lock-sync.sh" 2>/dev/null; then
git show "${BASE_SHA}:scripts/check-lock-sync.sh" > "${RUNNER_TEMP}/check-lock-sync.sh"
echo "checker: base ${BASE_SHA}"
else
test -f scripts/check-lock-sync.sh \
|| { echo "::error::scripts/check-lock-sync.sh is absent from BOTH base and head"; exit 1; }
cp scripts/check-lock-sync.sh "${RUNNER_TEMP}/check-lock-sync.sh"
echo "::notice::base carries no checker; bootstrapping from head (first-introduction PR)"
fi
chmod +x "${RUNNER_TEMP}/check-lock-sync.sh"
"${RUNNER_TEMP}/check-lock-sync.sh"
Loading
Loading