Skip to content

Zero-job startup_failure on every cross-owner reusable caller: CI creates no jobs, so required 'scan / gitleaks' can never report #141

Closed

Description

@hyperpolymath

What is happening

Every workflow in this repository whose job calls a reusable workflow owned by another account ends its run before any job exists:

Workflow Call (pinned, exists) Latest run on main
Rust CI metadatastician/standards/.github/workflows/rust-ci-reusable.yml@8e48b1ca startup_failure, 0 jobs
Governance …/governance-reusable.yml@8e48b1ca startup_failure, 0 jobs
Secret Scanner …/secret-scanner-reusable.yml@8e48b1ca startup_failure, 0 jobs
Hypatia Security Scan …/hypatia-scan-reusable.yml@8e48b1ca startup_failure, 0 jobs
Mirror to Git Forges …/mirror-reusable.yml@8e48b1ca startup_failure, 0 jobs
OSSF Scorecard …/scorecard-reusable.yml@8e48b1ca startup_failure, 0 jobs
Standards pipeline …/ci-pipeline.yml@8e48b1ca failure, 0 jobs

Workflows that use only actions/* steps (Dogfood Gate, Code Quality, Estate Rules, Lock Sync Gate, OpenSSF Compliance, Static Analysis Gate, Runtime Policy, Workflow Security Linter, CodeQL) pass every time.

Consequence: zero jobs means zero check runs, so none of this appears in a PR check list. scan / gitleaks is a required status check on main, produced by Secret Scanner — so it can never report, and no pull request can be merged through the normal path. That is not a hostile check; it is a check that never starts.

When it started

  • Rust CI: last success 2026-10-22T00:34Z; first startup_failure after that.
  • Secret Scanner: on main, ran (conclusion failure, jobs existed) at 2026-10-25T19:41Z; from 2026-10-25T19:49Z onwards, startup_failure with 0 jobs.

2026-10-25 is also the date the estate repointed these callers from hyperpolymath/standards to metadatastician/standards (see the comment in .github/workflows/standards-pipeline.yml). The repository hyperpolymath/standards now redirects to metadatastician/standards — verified today:

$ gh api --include repos/hyperpolymath/standards
HTTP/2.0 200 OK
{"full_name":"metadatastician/standards","id":1116521501,"owner":{"login":"metadatastician","type":"Organization"}}

The caller (hyperpolymath/cicd-squabbler) is owned by a user; the callee is now owned by an organization. Cross-owner reusable-workflow calls are refused at startup unless the caller's Actions posture admits them.

Ruled out

  • The pinned files exist. All six reusables resolve at 8e48b1caade08a552646adeab66558ac43b4360d, sizes 1.5–25 kB.
  • The called repository moved, and the callers already use the canonical name. No repoint is outstanding (this is the inverse of Zero-job startup failures as first-class classes; chains resolves canonical upstream names #140's moved-coordinate class).
  • The lockfile is not the cause. Lock Sync Gate is green (actions.lock is in sync and transitively closed, including the creusot.yml entry added in Zero-job startup failures as first-class classes; chains resolves canonical upstream names #140).
  • Not a missing input/secret. No caller passes an undeclared input; the caller-declared secrets match what mirror-reusable.yml declares.
  • Not the same failure in other repos using the old name. hyperpolymath/docmatrix's rust-ci.yml, still calling hyperpolymath/standards/…, also produces a 0-job failure. So this is not "the new name is refused, the old one works" — it is every cross-owner reusable call.

What it most likely is (needs an admin token to confirm)

One of two Settings-level postures, both of which are checked against the written owner/repo:

  1. Actions → General → Access: "Allow owner actions and reusable workflows" rather than "Allow all", which refuses a callee in a different account (metadatastician) at startup; or
  2. allowed_actions=selected with a patterns_allowed list that has no pattern covering metadatastician/standards@*.

I cannot read either. Every permissions endpoint refuses this token:

$ gh api repos/hyperpolymath/cicd-squabbler/actions/permissions
{"message":"Resource not accessible by integration","status":"403"}
$ … /actions/permissions/access          → 403
$ … /actions/permissions/selected-actions → 403

administration: read is required, and the token here is a GitHub App installation token without it.

Fix (owner action, either is enough)

A. Admit the callee — Settings → Actions → General → Access: Allow all actions and reusable workflows; or keep selected and add the pattern metadatastician/standards@* to patterns_allowed. Keep sha_pinning_required=true; the callers are already full-SHA pinned, so nothing is weakened.

B. Or make caller and callee the same owner — move these workflows into a repository owned by the same account as the reusable, which is the posture before 2026-10-25.

Then confirm with:

gh run list --workflow rust-ci.yml --limit 3
# expect: success/failure with jobs > 0, never startup_failure with 0 jobs

Why this matters beyond CI hygiene

This is exactly the second class #140 makes first-class: a coordinate refused by the caller's allow-list, dying with zero jobs, creating no check run, therefore invisible in every PR check list — and here it is silently blocking every merge in this repository while the board reads green.

squabble zero-job is the command built to name this per run (repo, workflow, coordinate as written, canonical target, required allow-list pattern). It reports Unattributed with the probe failure quoted, rather than inventing a cause, when it cannot read the posture — which is precisely the evidence trail this issue needed and could not get.

Follow-up

Once the posture is readable, squabble zero-job . --limit 30 on this repository should name metadatastician/standards@* as the required pattern for each of these runs. Until then this issue is the record.

Activity

  1. added
    cicdCI/CD: workflows, actions, lockfiles, pins, runners, release gates
    enhancementNew capability or improvement to existing behaviour
    securitySecurity-related issue or vulnerability
    on Oct 28, 2026
  2. coderabbitai commented on Oct 28, 2026

    @coderabbitai
    Contributor
    🔗 Related PRs

    #140 - Zero-job startup failures as first-class classes; chains resolves canonical upstream names [open]


    📝 Issue Planner

    Check the box below or use the @coderabbitai plan command to generate an implementation plan and prompts that you can use with your favorite coding assistant.

    • Create Plan

    🧪 Issue enrichment is currently in open beta.

    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord!

  3. hyperpolymath commented on Oct 29, 2026

    @hyperpolymath
    OwnerAuthor

    2026-10-29 canary findings: PR #143 now starts real scan / gitleaks, scan / rust-secrets and scan / shell-secrets jobs; all three passed. The live selected-actions configuration was updated additively with metadatastician/standards/.github/workflows/@ and read-back verified, retaining SHA pinning. A separate governance / Allowlist Preflight failure remains: governance-reusable.yml is pinned at standards commit 8e48b1c, whose rhodium-standard-repositories/actions-allowlist/allowed-actions.json predates the metadatastician owner transfer and omits seven now-used workflow refs. The later standards commit 8d1a2aa has the required pattern, but repinning cannot yet be safely committed because gh actions-lock v0.2.0 regenerates the untouched repository lockfile with over 100 dependency lines removed and governance.yml changed to an empty dependency list, while claiming all 31 workflows valid. Reproduced on unmodified caller workflow too; not caused by the candidate pin. The unsafe lockfile regeneration was reverted, not pushed. Next: repair/verify gh actions-lock reusable-workflow dependency tracking, repin governance to a compatible post-transfer SHA, re-lock without loss of dependency attestations, then re-run and close this issue only on confirmed green.

  4. hyperpolymath commented on Oct 29, 2026

    @hyperpolymath
    OwnerAuthor

    Additional lockfile diagnosis (29 Oct): downloaded official github/gh-actions-lock v0.4.0 Linux binary into an isolated /tmp trial, verified its GitHub release SHA-256 digest f9da98f2a6e9e0ae77deadf9a2319a8a86bb002b541cc3203b247cc59fb04842 (installed v0.2.0 unchanged). On a clean main checkout v0.4.0 --no-fix --json reports 15 findings. Several existing full-SHA uses: metadatastician/standards/.github/workflows/*@8e48... are incorrectly described as stale because their lockfile metadatastician/standards@8e48... entry is not seen as referenced. This matches v0.2.0 regeneration turning the governance workflow dependency list empty. The newer version is therefore not a verified safe replacement; do not regenerate/commit a truncated actions.lock until the discrepancy is explained and an accurate readback audit passes. Separate CI faults now isolated: Rust formatting/Clippy PR #144, and missing Why3 opam packages repaired upstream in merged cicd-suite PR #61. Scanner Gitleaks/Rust/shell checks passed in PR #143.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    cicdCI/CD: workflows, actions, lockfiles, pins, runners, release gatesenhancementNew capability or improvement to existing behavioursecuritySecurity-related issue or vulnerability

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions