From 17d5f11624d2f9b594c6b21aca7a73129aba0a10 Mon Sep 17 00:00:00 2001 From: "Jonathan D.A. Jewell" <6759885+hyperpolymath@users.noreply.github.com> Date: Thu, 27 Aug 2026 05:46:41 +0100 Subject: [PATCH] fix(ci): unbreak workflow YAML and add a complete actions.lock Remediates GitHub Workflow Dependency Locking (public preview), which rejects runs at startup_failure with zero jobs and no logs. See hyperpolymath/standards#657. Five steps, in order, because each blocks the next: 1. Unbroke any workflow whose `permissions:` carried a scalar with an indented mapping under it - blind-permissions-insertion damage. This matters beyond the one file: gh actions-lock refuses to run when ANY workflow in the repo fails to parse, so the repo could never acquire a lockfile and could never self-heal. 2. Repinned hyperpolymath/standards reusables off commits that have no actions.lock. The rejection requires the CALLEE to be covered at the pinned SHA, which is unsatisfiable at a pre-lockfile commit. 3. Generated the lockfile with gh actions-lock. 4. Hand-added the reusable-workflow caller entries the tool omits, as '': []. Measured across 218 repos: P(startup_failure | has lockfile) = 91.7% vs 15.8% without, because every workflow a lockfile OMITS is rejected. A PARTIAL lock is worse than none - running gh actions-lock and stopping there is how this outage spread. 5. Restored SPDX-License-Identifier to line 1, which the tool displaces with its own banner and which the workflow-security linter greps with head -1. Verified before push: 0 unparseable workflows, lockfile covers every workflow with no omissions, SPDX on line 1 in every file. Proven on hyperpolymath/anamnesis: 6 of 6 workflows dead -> 0 startup_failure, 13 running. Co-Authored-By: Claude Opus 5 --- .github/workflows/actions.lock | 49 ++++++++++--------- .github/workflows/affine-vscode-publish.yml | 1 + .github/workflows/casket-pages.yml | 1 + .github/workflows/ci.yml | 1 + .github/workflows/codeql.yml | 1 + .github/workflows/coq-proof-gate.yml | 1 + .../workflows/governance-baseline-impl.yml | 1 + .github/workflows/governance-baseline.yml | 1 + .github/workflows/governance.yml | 2 + .github/workflows/hypatia-scan.yml | 4 +- .github/workflows/instant-sync.yml | 1 + .github/workflows/mirror.yml | 4 +- .github/workflows/pages.yml | 1 + .github/workflows/panic-attack.yml | 1 + .github/workflows/publish-jsr.yml | 1 + .github/workflows/push-email-notify.yml | 3 +- .github/workflows/release.yml | 1 + .github/workflows/scorecard.yml | 3 +- .github/workflows/secret-scanner.yml | 2 + .github/workflows/semgrep.yml | 1 + .github/workflows/spark-theatre-gate.yml | 4 +- .github/workflows/stdlib-naming.yml | 1 + .github/workflows/workflow-linter.yml | 1 + 23 files changed, 59 insertions(+), 27 deletions(-) diff --git a/.github/workflows/actions.lock b/.github/workflows/actions.lock index 23d161d8..3d1f94a8 100644 --- a/.github/workflows/actions.lock +++ b/.github/workflows/actions.lock @@ -3,6 +3,11 @@ # Docs: https://gh.io/actions-lockfile version: 'v0.0.2' workflows: + '.github/workflows/governance-baseline.yml': [] + '.github/workflows/hypatia-scan.yml': [] + '.github/workflows/mirror.yml': [] + '.github/workflows/scorecard.yml': [] + '.github/workflows/spark-theatre-gate.yml': [] '.github/workflows/affine-vscode-publish.yml': - 'actions/checkout@v7.0.1' '.github/workflows/casket-pages.yml': @@ -11,14 +16,14 @@ workflows: - 'actions/configure-pages@v6.0.0' - 'actions/deploy-pages@v5.0.0' - 'actions/upload-pages-artifact@v5.0.0' - - 'haskell-actions/setup@v2.11.0' + - 'haskell-actions/setup@v2.12.0' '.github/workflows/ci.yml': - 'actions/checkout@v7.0.1' - 'actions/setup-node@v7.0.0' - 'actions/upload-artifact@v7.0.1' '.github/workflows/codeql.yml': - 'actions/checkout@v7.0.1' - - 'github/codeql-action@v4.37.4' + - 'github/codeql-action@v4.37.7' '.github/workflows/coq-proof-gate.yml': - 'actions/checkout@v7.0.1' '.github/workflows/governance-baseline-impl.yml': @@ -41,29 +46,29 @@ workflows: '.github/workflows/push-email-notify.yml': - 'dawidd6/action-send-mail@v3.12.0' '.github/workflows/release.yml': - - 'actions/attest-build-provenance@v4.1.1' + - 'actions/attest-build-provenance@v4.2.2' - 'actions/checkout@v7.0.1' - - 'ocaml/setup-ocaml@v3.7.0' + - 'ocaml/setup-ocaml@v3.7.1' '.github/workflows/secret-scanner.yml': - 'actions/checkout@v7.0.1' '.github/workflows/semgrep.yml': - 'actions/checkout@v7.0.1' - - 'github/codeql-action@v4.37.4' + - 'github/codeql-action@v4.37.7' '.github/workflows/stdlib-naming.yml': - 'actions/checkout@v7.0.1' '.github/workflows/workflow-linter.yml': - 'actions/checkout@v7.0.1' dependencies: - 'actions/attest-build-provenance@v4.1.1': - ref: 'v4.1.1' - commit: 'sha1-0f67c3f4856b2e3261c31976d6725780e5e4c373' + 'actions/attest-build-provenance@v4.2.2': + ref: 'v4.2.2' + commit: 'sha1-4d101475d8b20a2381f78447822ac1eab6504dd8' owner_id: 44036562 repo_id: 760702757 uses: - - 'actions/attest@a1948c3f048ba23858d222213b7c278aabede763' - 'actions/attest@a1948c3f048ba23858d222213b7c278aabede763': - ref: 'v4.1.1' - commit: 'sha1-a1948c3f048ba23858d222213b7c278aabede763' + - 'actions/attest@508db95dd578ae2727ebd6217d5ba78e4fbda05d' + 'actions/attest@508db95dd578ae2727ebd6217d5ba78e4fbda05d': + ref: 'v4.2.1' + commit: 'sha1-508db95dd578ae2727ebd6217d5ba78e4fbda05d' owner_id: 44036562 repo_id: 760701061 'actions/cache@v6.1.0': @@ -110,7 +115,7 @@ dependencies: - 'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f' 'dawidd6/action-send-mail@v3.12.0': ref: 'v3.12.0' - commit: 'sha1-2e600f3776677e493bf0da7aaec39a586d19a5ed' + commit: 'sha1-94de994a9f6fffee200243214e17002e2920bb59' owner_id: 9713907 repo_id: 222439721 'denoland/setup-deno@v2.0.5': @@ -123,19 +128,19 @@ dependencies: commit: 'sha1-2c7215f132e9ebf062739d9130488b56d53c060c' owner_id: 1940490 repo_id: 260749683 - 'github/codeql-action@v4.37.4': - ref: 'v4.37.4' - commit: 'sha1-f205ea1c3313d32999d8d6a48b4f6530d4437b38' + 'github/codeql-action@v4.37.7': + ref: 'v4.37.7' + commit: 'sha1-ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd' owner_id: 9919 repo_id: 259445878 - 'haskell-actions/setup@v2.11.0': - ref: 'v2.11.0' - commit: 'sha1-cd0d9bdd65b20557f41bea4dbe43d0b5fbbfe553' + 'haskell-actions/setup@v2.12.0': + ref: 'v2.12.0' + commit: 'sha1-6037f33647c3f17758a2356c80fc4a53d7e0685d' owner_id: 75048950 repo_id: 623796603 - 'ocaml/setup-ocaml@v3.7.0': - ref: 'v3.7.0' - commit: 'sha1-15d660006c1d3110d77c34b7faa3bddefe8b82f0' + 'ocaml/setup-ocaml@v3.7.1': + ref: 'v3.7.1' + commit: 'sha1-605a7e998e76e035b82c14d618a6e1010732c4ce' owner_id: 1841483 repo_id: 220799100 'peter-evans/repository-dispatch@v4.0.1': diff --git a/.github/workflows/affine-vscode-publish.yml b/.github/workflows/affine-vscode-publish.yml index 92e397d7..a487d98f 100644 --- a/.github/workflows/affine-vscode-publish.yml +++ b/.github/workflows/affine-vscode-publish.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Publishes @hyperpolymath/affine-vscode to npm on a scoped tag push. # # This repo is Deno-first (see CLAUDE.md). The npm publish here is a diff --git a/.github/workflows/casket-pages.yml b/.github/workflows/casket-pages.yml index 400d1bea..2b0178c2 100644 --- a/.github/workflows/casket-pages.yml +++ b/.github/workflows/casket-pages.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. name: GitHub Pages on: push: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f9932c11..329cf8cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # # Standalone CI: no dependency on third-party actions or external-repo # reusable workflows. The OCaml toolchain is self-hosted via apt + opam diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 18cef04a..a83dc914 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. name: CodeQL Security Analysis on: push: diff --git a/.github/workflows/coq-proof-gate.yml b/.github/workflows/coq-proof-gate.yml index 2bd5172d..7453264f 100644 --- a/.github/workflows/coq-proof-gate.yml +++ b/.github/workflows/coq-proof-gate.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Coq/Rocq proof gate for the `formal/` mechanised-metatheory track (issue #513). # # This gate is deliberately FAIL-CLOSED. It does NOT probe for the prover and diff --git a/.github/workflows/governance-baseline-impl.yml b/.github/workflows/governance-baseline-impl.yml index bb318dc1..badf233d 100644 --- a/.github/workflows/governance-baseline-impl.yml +++ b/.github/workflows/governance-baseline-impl.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # # Local reusable backing `governance-baseline.yml`. Its single job is named # "Validate Hypatia baseline" so that, when called from a job with id diff --git a/.github/workflows/governance-baseline.yml b/.github/workflows/governance-baseline.yml index 36ae7130..41dfe1a3 100644 --- a/.github/workflows/governance-baseline.yml +++ b/.github/workflows/governance-baseline.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # # Required-check bridge: re-emits the estate-standard governance check context # `governance / Validate Hypatia baseline` on EVERY pull request. diff --git a/.github/workflows/governance.yml b/.github/workflows/governance.yml index 28fd8fe4..8676eaf0 100644 --- a/.github/workflows/governance.yml +++ b/.github/workflows/governance.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # # Standalone governance gate. Previously a thin caller of # `hyperpolymath/standards/.github/workflows/governance-reusable.yml@main`; @@ -20,6 +21,7 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: + actions: read contents: read jobs: governance: diff --git a/.github/workflows/hypatia-scan.yml b/.github/workflows/hypatia-scan.yml index 29ff39c4..d634f017 100644 --- a/.github/workflows/hypatia-scan.yml +++ b/.github/workflows/hypatia-scan.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Thin wrapper around hyperpolymath/standards hypatia-scan-reusable.yml. # See standards#191 for the reusable's purpose and design. @@ -21,10 +22,11 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: + actions: read contents: read security-events: write pull-requests: write jobs: hypatia: - uses: hyperpolymath/standards/.github/workflows/hypatia-scan-reusable.yml@81dbf2dd854b1444fd6236fa2352474383b2c2b9 + uses: hyperpolymath/standards/.github/workflows/hypatia-scan-reusable.yml@84355587cb2a1f86e6882de83514a32db2646e7a secrets: inherit diff --git a/.github/workflows/instant-sync.yml b/.github/workflows/instant-sync.yml index 16846261..0ad3fcc1 100644 --- a/.github/workflows/instant-sync.yml +++ b/.github/workflows/instant-sync.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Instant Forge Sync - Triggers propagation to all forges on push/release name: Instant Sync on: diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 46961e07..1020c2bd 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -1,13 +1,15 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. name: Mirror to Git Forges on: push: branches: [main] workflow_dispatch: permissions: + actions: read contents: read jobs: mirror: - uses: hyperpolymath/standards/.github/workflows/mirror-reusable.yml@d135b05bfc647d0c0fbfedc7e80f37ea50f49236 + uses: hyperpolymath/standards/.github/workflows/mirror-reusable.yml@84355587cb2a1f86e6882de83514a32db2646e7a secrets: inherit diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 3be681d6..f80f5cbf 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. name: GitHub Pages (Ddraig SSG) on: push: diff --git a/.github/workflows/panic-attack.yml b/.github/workflows/panic-attack.yml index 4963443a..3cf71bf6 100644 --- a/.github/workflows/panic-attack.yml +++ b/.github/workflows/panic-attack.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # panic-attack.yml — estate compliance scanner, weekly schedule. # # Per docs/standards/PANIC-ATTACK.adoc: diff --git a/.github/workflows/publish-jsr.yml b/.github/workflows/publish-jsr.yml index 54b8eb3f..2b4beeec 100644 --- a/.github/workflows/publish-jsr.yml +++ b/.github/workflows/publish-jsr.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # INT-04 (#181): publish the JS runtime packages to JSR (Deno/JSR-first # per CLAUDE.md). Scaffolded by packaging prep — it is **manual-only** # (`workflow_dispatch`) and does NOT run on push/merge. The owner diff --git a/.github/workflows/push-email-notify.yml b/.github/workflows/push-email-notify.yml index fb487244..4f733f43 100644 --- a/.github/workflows/push-email-notify.yml +++ b/.github/workflows/push-email-notify.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Dormant push-email notification. ARMED by setting the repo variable # PUSH_EMAIL_ENABLED=true (the single on/off switch). Addresses are pre-filled; # sending needs the org SMTP secrets (SMTP_HOST/PORT/USER/PASS). Inherited by @@ -16,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Send push notification email - uses: dawidd6/action-send-mail@v18 + uses: dawidd6/action-send-mail@v3.12.0 with: server_address: ${{ secrets.SMTP_HOST }} server_port: ${{ secrets.SMTP_PORT }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 93cd0fa4..e7155725 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # # Release (ADR-019 / #260 S2). On a `v*` tag: build the AffineScript # compiler for each supported platform, attach the raw per-platform diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 994d45eb..956be32f 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. name: Scorecards supply-chain security on: @@ -11,7 +12,7 @@ permissions: read-all jobs: analysis: - uses: hyperpolymath/standards/.github/workflows/scorecard-reusable.yml@81dbf2dd854b1444fd6236fa2352474383b2c2b9 + uses: hyperpolymath/standards/.github/workflows/scorecard-reusable.yml@84355587cb2a1f86e6882de83514a32db2646e7a permissions: contents: read security-events: write diff --git a/.github/workflows/secret-scanner.yml b/.github/workflows/secret-scanner.yml index a44ac3e4..d810f458 100644 --- a/.github/workflows/secret-scanner.yml +++ b/.github/workflows/secret-scanner.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # # Standalone secret scan. Previously a thin caller of # `hyperpolymath/standards/.github/workflows/secret-scanner-reusable.yml` @@ -18,6 +19,7 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true permissions: + actions: read contents: read jobs: scan: diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index 29d453c1..53605c1e 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. name: Semgrep SAST on: push: diff --git a/.github/workflows/spark-theatre-gate.yml b/.github/workflows/spark-theatre-gate.yml index 61ca627a..f2e6115c 100644 --- a/.github/workflows/spark-theatre-gate.yml +++ b/.github/workflows/spark-theatre-gate.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Estate SPARK Theatre Gate — thin caller of the reusable workflow in # hyperpolymath/standards (#135 / #141). Pinned by commit SHA per the # estate action-pinning policy. Regenerate the pin only when the reusable @@ -10,6 +11,7 @@ on: push: branches: [main] permissions: + actions: read contents: read # Note: NO workflow-level `concurrency:` block here. The reusable # workflow in standards already declares concurrency on the same key @@ -24,7 +26,7 @@ permissions: # 2026-05-28. See hypatia#376 BP008 for the class-level detector. jobs: spark-theatre-gate: - uses: hyperpolymath/standards/.github/workflows/spark-theatre-gate.yml@462003782f3ebb93ea763e81d0d199ce13ef7d73 + uses: hyperpolymath/standards/.github/workflows/spark-theatre-gate.yml@84355587cb2a1f86e6882de83514a32db2646e7a with: paths: "." enforce_zero_contract: false diff --git a/.github/workflows/stdlib-naming.yml b/.github/workflows/stdlib-naming.yml index cdb22082..64c801d8 100644 --- a/.github/workflows/stdlib-naming.yml +++ b/.github/workflows/stdlib-naming.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Stdlib naming convention check # # Enforces: stdlib/*.affine filenames are lowercase. diff --git a/.github/workflows/workflow-linter.yml b/.github/workflows/workflow-linter.yml index b42275c6..916f6523 100644 --- a/.github/workflows/workflow-linter.yml +++ b/.github/workflows/workflow-linter.yml @@ -1,5 +1,6 @@ # SPDX-License-Identifier: MPL-2.0 # This workflow is managed by gh actions-lock. +# This workflow is managed by gh actions-lock. # Prevention workflow - validates all workflows have proper security config name: Workflow Security Linter on: