diff --git a/.github/workflows/casket-pages.yml b/.github/workflows/casket-pages.yml index 72722a1c..325a4835 100644 --- a/.github/workflows/casket-pages.yml +++ b/.github/workflows/casket-pages.yml @@ -29,7 +29,7 @@ jobs: path: .casket-ssg - name: Setup GHCup - uses: haskell-actions/setup@f9150cb1d140e9a9271700670baa38991e6fa25c # v2 + uses: haskell-actions/setup@cd0d9bdd65b20557f41bea4dbe43d0b5fbbfe553 # v2.11.0 with: ghc-version: '9.8.2' cabal-version: '3.10' diff --git a/.github/workflows/deno-ci-reusable.yml b/.github/workflows/deno-ci-reusable.yml index 413d9abc..b31fd1c6 100644 --- a/.github/workflows/deno-ci-reusable.yml +++ b/.github/workflows/deno-ci-reusable.yml @@ -56,7 +56,7 @@ jobs: repository: ${{ github.repository }} ref: ${{ github.ref }} - - uses: denoland/setup-deno@e95548e56dfa95d4e1a28d6f422fafe75c4c26fb # v2.0.3 + - uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: ${{ inputs.deno-version }} diff --git a/.github/workflows/governance-reusable.yml b/.github/workflows/governance-reusable.yml index 3c3bc91a..9e66be0e 100644 --- a/.github/workflows/governance-reusable.yml +++ b/.github/workflows/governance-reusable.yml @@ -169,7 +169,7 @@ jobs: # version and the script version — acceptable since scripts here # are read-only governance checks. - name: Set up Deno - uses: denoland/setup-deno@e95548e56dfa95d4e1a28d6f422fafe75c4c26fb # v2.0.3 + uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: deno-version: v2.x diff --git a/.github/workflows/scorecard-enforcer.yml b/.github/workflows/scorecard-enforcer.yml index 6933b781..75e23854 100644 --- a/.github/workflows/scorecard-enforcer.yml +++ b/.github/workflows/scorecard-enforcer.yml @@ -21,6 +21,16 @@ permissions: contents: read jobs: + # The OSSF Scorecard publish endpoint enforces a hard contract: the job that + # runs `ossf/scorecard-action` with `publish_results: true` must contain + # ONLY steps with `uses:` (no `run:` steps in the same job). If a `run:` + # step is present, the publish step fails with: + # "webapp: scorecard job must only have steps with uses" + # (49 estate repos hit this; see ROADMAP audit 2026-05-30.) + # + # Fix: split the threshold check into a downstream job that depends on + # `scorecard` and consumes the SARIF artifact. The `scorecard` job stays + # uses-only; `check-score` is the gating job that emits the error. scorecard: runs-on: ubuntu-latest permissions: @@ -43,9 +53,26 @@ jobs: with: sarif_file: results.sarif + - name: Persist SARIF for downstream score-gate job + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 + with: + name: scorecard-results + path: results.sarif + retention-days: 1 + + check-score: + needs: scorecard + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Download SARIF from scorecard job + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v5.0.0 + with: + name: scorecard-results + - name: Check minimum score run: | - # Parse score from results SCORE=$(jq -r '.runs[0].tool.driver.properties.score // 0' results.sarif 2>/dev/null || echo "0") echo "OpenSSF Scorecard Score: $SCORE"