Skip to content

repo-standard.yml @ #54 fails caller startup: scorecard/sbom actions not in the org Actions allowlist #55

Description

@bdelanghe

repo-standard.yml at 60745f9bf5160811fdc3529d211ae8cffd6619ca (the #54 spell-gate/scorecard/sbom revision) causes a startup_failure — zero jobs, run never created — for any repo that calls it, regardless of inputs.

Evidence (from bounded-systems/conformance)

  • A caller pinned to the previous revision d43c3280588ef05f4ead43426db1091d4cb8f520 runs fine with any inputs (this is what guest-room / verbspec / claude-box use today).
  • A caller pinned to 60745f9b gets startup_failure on every variant tried: security-only (nothing else), with/without spell: true, with/without scorecard: false, with/without actions: read at the caller's top level, on a fresh push and on a manual re-run (so not propagation lag).
  • The reusable workflow's YAML at 60745f9b parses cleanly; all inputs (security/scorecard/sbom/spell/test/descriptor/…) are present.

Likely cause

The only delta between the two pins is that 60745f9b adds two new third-party actions the old revision didn't reference:

  • ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a (the scorecard job)
  • anchore/sbom-action@e22c389904149dbc22b58101806040fa8d37a610 (the sbom job)

GitHub Actions statically validates every uses: across all jobs of a called reusable workflow at run-creation time — before evaluating any job's if: condition. So if the org Actions policy is "Allow select actions" and those two aren't on the allowlist, the entire run fails to start even when scorecard/sbom are false and their jobs would never run.

(I could not read the org/repo Actions-permissions API directly to 100%-confirm the allowlist contents — it's blocked in my environment — so this is an inference from the evidence above. But nothing else fits: valid YAML, works on the old pin, fails on the new pin with identical inputs, only-delta is two new actions.)

Why it wasn't caught in #54

.github has no workflow that calls repo-standard.yml as a self-test, so #54's own CI (org-defaults, required-baseline, …) went green without ever exercising the new revision through a real caller. The first real invocation (a conformance PR) is what surfaced it.

Suggested fixes (any one)

  1. Allowlist ossf/scorecard-action and anchore/sbom-action in the org Actions policy (Settings → Actions → General → Allow select actions). This is probably the intended state anyway, since feat(repo-standard): add opt-in spell-gate (cspell dictionary allowlist) #54 wants scorecard on by default.
  2. Have repo-standard.yml not reference actions the org doesn't permit (e.g. gate the whole job set differently), though (1) is cleaner given scorecard is meant to be a default-on floor.
  3. Add a self-test caller in .github (a workflow that uses: its own repo-standard.yml with the defaults) so a future revision that can't start is caught before repos bump their pins.

Downstream impact

bounded-systems/conformance#19 (adopt the reusable spell job) is blocked on this: spell only exists from 60745f9b, and that pin can't start. conformance is staying on its standalone spell-gate.yml until this clears. Other repos are unaffected only because they haven't bumped their pin yet — any bump to 60745f9b will hit the same wall.

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions