Skip to content

fix(ci): revive the startup-dead governance gates (0 jobs -> running) - #55

Merged
hyperpolymath merged 2 commits into
mainfrom
fix/restore-reachable-standards-pin
Sep 8, 2026
Merged

hyperpolymath merged 2 commits into
mainfrom
fix/restore-reachable-standards-pin

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented Sep 4, 2026

Copy link
Copy Markdown
Owner

What was actually wrong

Three of this repo's five governance-suite gates were dying at startup: scorecard, mirror and secret-scanner each reported 0 jobs and 0 check runs. A gate that never starts is absent, not red — so main looked green while nothing ran.

gh run view on those runs says only: "This run likely failed because of a workflow file issue."

Two causes

  1. Stale pins. Callers sat on older standards revisions (7fdc2705) whose reusables request actions: read — a permission the callers never granted. The reusable call fails validation and the run dies before any job is created.
  2. A job-level permissions: block REPLACES the workflow-level map rather than merging with it. So a job carrying its own block ran with neither contents: read nor actions: read, regardless of what the top of the file granted. This is why "just add actions: read at the top" is a no-op on these callers — the gate stays absent while looking patched.

What this PR does

  • Repoints the standards reusables to main HEAD 257869d3.
  • Grants actions: read + contents: read at both workflow and job level.
  • Adds workflow_dispatch to scorecard.yml so the gate is verifiable on demand (matching proof-burrower, the verified-working control caller).
  • Holds governance.yml at fad242d3. standards main HEAD is currently unparseable by callers: its actions.lock fell out of sync with governance-reusable.yml after Dependabot #746, so pinning HEAD returns HTTP 422 … references actions not present in the lockfile and the run dies at startup. fix(ci): resync actions.lock with the workflow refs Dependabot bumped (#746) standards#754 resyncs it; governance moves to HEAD once that lands.

Verification — dispatched on this branch, job counts measured

workflow main this branch
governance 15j 15j already alive, held at fad242d3
scorecard 0j 2j REVIVED
mirror 0j 7j REVIVED
secret-scanner 0j 3j REVIVED
hypatia-scan 0j 1j REVIVED

Job counts come from actions/runs/<id>/jobs .total_count — a failing-checks list cannot distinguish "gate passed" from "gate never ran", so the positive control is the count itself.

Newly-visible failures (e.g. mirror's bitbucket/sourcehut targets) are real findings the absent gate was concealing, not regressions introduced here.

🤖 Generated with Claude Code

https://claude.ai/code/session_01QMTyDv9CoJo5PfeNzyp519

@coderabbitai

coderabbitai Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Advanced

Run ID: f59e4b99-b823-4af5-83b9-267e600c3fc4

📥 Commits

Reviewing files that changed from the base of the PR and between f19e22e and 71dc95b.

📒 Files selected for processing (4)
  • .github/workflows/hypatia-scan.yml
  • .github/workflows/mirror.yml
  • .github/workflows/scorecard.yml
  • .github/workflows/secret-scanner.yml

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (1)
  • GitHub Check: analyze (rust, none)
⚠️ CI failures not shown inline (2)

GitHub Actions: CI / 1_container.txt: fix(ci): revive the startup-dead governance gates (0 jobs -> running)

Conclusion: failure

View job details

##[group]Run docker build -f Containerfile.alpine-fallback -t cloud-sync-tuner:test .
 �[36;1mdocker build -f Containerfile.alpine-fallback -t cloud-sync-tuner:test .�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 `#0` building with "default" instance using docker driver
 `#1` [internal] load build definition from Containerfile.alpine-fallback
 `#1` transferring dockerfile: 1.31kB done
 `#1` DONE 0.0s
 `#2` [auth] library/alpine:pull token for registry-1.docker.io
 `#2` DONE 0.0s
 `#3` [internal] load metadata for docker.io/library/alpine:edge
 `#3` DONE 0.7s
 `#4` [internal] load metadata for cgr.dev/chainguard/wolfi-base:latest
 `#4` DONE 0.8s
 `#5` [internal] load .dockerignore
 `#5` transferring context: 2B done
 `#5` DONE 0.0s
 `#6` [internal] load build context
 `#6` transferring context: 396.81kB done
 `#6` DONE 0.0s
 `#7` [stage-1 1/6] FROM cgr.dev/chainguard/wolfi-base:latest@sha256:***REDACTED_HIGH_ENTROPY_STRING***
 `#7` resolve cgr.dev/chainguard/wolfi-base:latest@sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0.0s done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 1.14kB / 1.14kB done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 2.50kB / 2.50kB done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 2.86kB / 2.86kB done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0B / 2.94MB 0.1s
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0B / 3.36MB 0.1s
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0B / 425.35kB 0.2s
 `#7` ...
 `#8` [builder 1/7] FROM docker.io/library/alpine:edge@sha256:***REDACTED_HIGH_ENTROPY_STRING***
 `#8` resolve docker.io/library/alpine:edge@sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0.0s done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 9.23kB / 9.23kB done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 1.02kB / 1.02kB done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 613B / 613B done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 3.85MB / 3.85MB 0.2s done
 `#8` extracting sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0.1s done
 `#8` DONE 0.3s
 `#7` [stage-1 1/6] FROM cgr.dev/chainguard/wolfi-ba...

GitHub Actions: CI / container: fix(ci): revive the startup-dead governance gates (0 jobs -> running)

Conclusion: failure

View job details

##[group]Run docker build -f Containerfile.alpine-fallback -t cloud-sync-tuner:test .
 �[36;1mdocker build -f Containerfile.alpine-fallback -t cloud-sync-tuner:test .�[0m
 shell: /usr/bin/bash -e {0}
 ##[endgroup]
 `#0` building with "default" instance using docker driver
 `#1` [internal] load build definition from Containerfile.alpine-fallback
 `#1` transferring dockerfile: 1.31kB done
 `#1` DONE 0.0s
 `#2` [auth] library/alpine:pull token for registry-1.docker.io
 `#2` DONE 0.0s
 `#3` [internal] load metadata for docker.io/library/alpine:edge
 `#3` DONE 0.7s
 `#4` [internal] load metadata for cgr.dev/chainguard/wolfi-base:latest
 `#4` DONE 0.8s
 `#5` [internal] load .dockerignore
 `#5` transferring context: 2B done
 `#5` DONE 0.0s
 `#6` [internal] load build context
 `#6` transferring context: 396.81kB done
 `#6` DONE 0.0s
 `#7` [stage-1 1/6] FROM cgr.dev/chainguard/wolfi-base:latest@sha256:***REDACTED_HIGH_ENTROPY_STRING***
 `#7` resolve cgr.dev/chainguard/wolfi-base:latest@sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0.0s done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 1.14kB / 1.14kB done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 2.50kB / 2.50kB done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 2.86kB / 2.86kB done
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0B / 2.94MB 0.1s
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0B / 3.36MB 0.1s
 `#7` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0B / 425.35kB 0.2s
 `#7` ...
 `#8` [builder 1/7] FROM docker.io/library/alpine:edge@sha256:***REDACTED_HIGH_ENTROPY_STRING***
 `#8` resolve docker.io/library/alpine:edge@sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0.0s done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 9.23kB / 9.23kB done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 1.02kB / 1.02kB done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 613B / 613B done
 `#8` sha256:***REDACTED_HIGH_ENTROPY_STRING*** 3.85MB / 3.85MB 0.2s done
 `#8` extracting sha256:***REDACTED_HIGH_ENTROPY_STRING*** 0.1s done
 `#8` DONE 0.3s
 `#7` [stage-1 1/6] FROM cgr.dev/chainguard/wolfi-ba...
🧰 Additional context used
🪛 GitHub Actions: Scorecards supply-chain security / 0_analysis _ Run Scorecard.txt
.github/workflows/scorecard.yml

[error] 1-1: ossf/scorecard-action failed: only the default branch 'main' is supported, but the workflow was run on 'fix/restore-reachable-standards-pin'.

🪛 GitHub Actions: Scorecards supply-chain security / analysis _ Run Scorecard
.github/workflows/scorecard.yml

[error] 1-1: ossf/scorecard-action failed because only the default branch 'main' is supported, but the workflow ran on 'refs/heads/fix/restore-reachable-standards-pin'.

🔇 Additional comments (4)
.github/workflows/hypatia-scan.yml (1)

29-29: LGTM!

.github/workflows/mirror.yml (1)

10-10: LGTM!

Also applies to: 15-15

.github/workflows/scorecard.yml (1)

5-5: LGTM!

Also applies to: 14-14, 16-16

.github/workflows/secret-scanner.yml (1)

14-14: LGTM!

Also applies to: 20-20, 22-22


📝 Summary

Summary by CodeRabbit

  • Chores
    • Updated security, mirroring, scorecard, and secret-scanning workflows to use newer reusable workflow versions.
    • Added required read permissions for workflow analysis and scanning tasks.
    • Added manual triggering for the Scorecards workflow.

Walkthrough

Four GitHub Actions workflows now pin reusable workflows to a newer commit. Permissions now include actions: read where required. The Scorecards workflow also supports manual dispatch.

Changes

Workflow pin updates

Layer / File(s) Summary
Update reusable workflow references and permissions
.github/workflows/*.yml
Hypatia, mirror, Scorecards, and secret-scanner use the newer pinned commit. Required actions: read permissions are added. Scorecards gains manual triggering.

Priority: ➖ Normal

Estimated code review effort: 1 (Trivial) | ~5 minutes

Merge Risk: ⚪ Minimal · up to 71dc9

This restores the affected governance workflows with read-only access and pinned reusable-workflow revisions. The restored gates are ready to merge without an identified production or security risk.

Suggested reviewers: metadatastician

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarises the main change: restoring governance gates that failed before creating jobs. It is concise and directly related to the workflow fixes.
Description check ✅ Passed The description accurately explains the startup failures, permission and pin changes, workflow dispatch addition, governance pin decision, and verification results. It is directly related to the chang…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🛠️ Fix failing CI checks
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

A rabbit checks the workflows bright
Pins the scans to commits tight
Read permissions hop in line
Scorecards wait for manual time
Safe little updates, neat and fine

Comment @coderabbitai help to get the list of available commands.

…ns:read

scorecard, mirror and secret-scanner were dying at startup on this repo: each
reported 0 jobs and 0 check runs, so main looked green because the gates were
ABSENT, not passing.

Two causes, both fixed here:

1. Callers sat on the older standards pin 7fdc2705, whose reusables request
   `actions: read`, which the callers did not grant.
2. A job-level `permissions:` block REPLACES the workflow-level map rather than
   merging with it, so a job with its own block ran without `contents: read` or
   `actions: read` no matter what the top of the file granted.

All four affected callers are repointed to standards main HEAD 257869d3 and now
grant `actions: read` + `contents: read` at BOTH workflow and job level.

governance.yml is deliberately left on fad242d3: standards main HEAD is currently
unparseable by callers because its actions.lock is out of sync with
governance-reusable.yml after Dependabot #746 (HTTP 422, run dies at startup).
hyperpolymath/standards#754 resyncs it; governance moves to HEAD once that lands.

Verified on the sibling canary (bofig): mirror went 0 jobs -> 7 jobs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QMTyDv9CoJo5PfeNzyp519
@hyperpolymath
hyperpolymath force-pushed the fix/restore-reachable-standards-pin branch from f19e22e to 4414048 Compare September 8, 2026 18:20
…emand

scorecard.yml triggered only on branch_protection_rule and schedule, so there was
no way to prove the startup-failure repair works before merging it. The canonical
template caller (proof-burrower, the verified-working control) carries
workflow_dispatch; this matches it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QMTyDv9CoJo5PfeNzyp519
@sonarqubecloud

sonarqubecloud Bot commented Sep 8, 2026

Copy link
Copy Markdown

@hyperpolymath hyperpolymath changed the title fix(ci): restore reachable standards workflow pins fix(ci): revive the startup-dead governance gates (0 jobs -> running) Sep 8, 2026
@coderabbitai

coderabbitai Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

CI fix PR created: #57

Follow #57 for fix progress and CI status. If CI still fails, re-run the fix-ci command to try again.

Note: Fixing CI failures is a beta feature and may encounter errors. Expect some limitations and changes as we gather feedback and continue to improve it.

ℹ️ Local verification skipped — no lint, format, or test checks were found in this PR's CI config.

Note: If your CI is configured to only run on PRs targeting specific branches (e.g., main), it may not trigger on the fix PR. You can merge the fix into your branch and CI will validate on the original PR.

3 PR-caused check(s)
  • GitHub Actions: Scorecards supply-chain security / 0_analysis _ Run Scorecard.txt
  • GitHub Actions: CI / container
  • GitHub Actions: Scorecards supply-chain security / analysis _ Run Scorecard
⏭️ 1 check(s) skipped — already failing on `main` (not caused by this PR)
  • GitHub Actions: CI / 1_container.txt
1 file(s) modified
  • Containerfile.alpine-fallback
View agent analysis
This confirms Check 2/3: the failure is scorecard-action itself refusing to run because it was triggered via `workflow_dispatch` on a non-default branch (`fix/restore-reachable-standards-pin`), and the OSSF Scorecard action hard-requires the default branch. This is exactly the kind of failure that only exists because of CI/workflow configuration (the `workflow_dispatch` trigger added in this PR, run on a feature branch), not a bug in application source code — fixing it would require editing `.github/workflows/scorecard.yml` or workflow triggering behavior, which the task rules explicitly forbid me from touching. I'm leaving that failure as-is per the constraints.

## Summary

**Check 1 (container build) — fixed.** `Containerfile.alpine-fallback:27-31` tried to `apk add gcompat` on the `cgr.dev/chainguard/wolfi-base` stage. `gcompat` provides musl→glibc compatibility on Alpine, but Wolfi is natively glibc-based, so the package doesn't exist in Wolfi's repo and isn't needed there — that's the exact "no such package" error in the log. Removed `gcompat` from that `apk add` list (Containerfile.alpine-fallback:27).

**Checks 2 & 3 (Scorecard action) — not fixed, out of scope.** The failure (`Only the default branch main is supported` / `refs/heads/... not supported with workflow_dispatch event`) comes from the OSSF `scorecard-action` itself refusing to run because the PR's newly-added `workflow_dispatch` trigger in `.github/workflows/scorecard.yml` was exercised on the feature branch rather than `main`. This is a workflow-trigger/CI-infrastructure behavior, not application source code, and the task rules forbid editing workflow files. Per those rules I stopped without modifying `.github/workflows/scorecard.yml`.

Sources:
- [Troubleshooting apko Builds — Chainguard Academy](https://edu.chainguard.dev/open-source/build-tools/apko/troubleshooting/)
- [Reducing vulnerabilities in Backstage with Chainguard's Wolfi](https://www.chainguard.dev/unchained/reducing-vulnerabilities-in-backstage-with-chainguards-wolfi)

@hyperpolymath
hyperpolymath merged commit 6e589a4 into main Sep 8, 2026
35 of 37 checks passed
@hyperpolymath
hyperpolymath deleted the fix/restore-reachable-standards-pin branch September 8, 2026 18:53
hyperpolymath pushed a commit that referenced this pull request Sep 8, 2026
CI failure fixes was requested by @hyperpolymath.

*
#55 (comment)

The following files were modified:

* `Containerfile.alpine-fallback`

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant