Skip to content

CI infrastructure jammed: jobs stuck in queued (runner never assigned) + 3 workflows fast-fail without logs — blocks all PRs #77

Closed

Description

@hyperpolymath

Summary

The echidna GitHub Actions CI matrix is jammed: on every branch (including main), the great majority of workflow runs sit in queued indefinitely and never get assigned a runner, while three lightweight workflows fail before producing any log. Net effect: no PR can satisfy branch protection / go green honestly, and merges are only possible via --admin override. This stranded PR #71 (E-series Lean proofs, since admin-merged as 8b357bf) and will strand every future echidna PR identically.

Evidence (snapshot 2026-05-18 ~06:46Z)

  • Last 100 runs: 70 queued / 30 completed. The only completed runs are the 3 fast-failing workflows below — i.e. essentially nothing else ever finishes.
  • Queued runs have been accumulating across days/branches (refactor/echidna-l3-wave3-sharedbase-l1-guix, main, PR branches).
  • Inspecting a stuck job: status: queued, startedAt is set, runner: null — jobs are accepted and time-stamped but never get a runner assigned. Classic runner-availability / Actions-infra failure, not a code defect.
  • The push from the PR fix(lean4): discharge E-series proofs on Lean 4.13.0 (Refs #53) #71 merge to main (06:37Z) immediately re-queued the full matrix (CodeQL, Governance, Hypatia Security Scan, Live Provers, Rust CI, OSSF Scorecard, BoJ Server Build Trigger, Container Build Verification, …) — all queued.

The 3 fast-failing workflows (fail before logging)

cargo-audit.yml, dogfood-gate.yml, secret-scanner.yml — complete as failure within seconds on every push; gh run view --log-failed returns log not found (they fail at the runner-assignment / job-startup boundary, before any step emits output).

Likely root causes to investigate (in order)

  1. Self-hosted runner offline / org runner-group misconfig — runner: null on jobs that should pick up a hosted or self-hosted runner points here first. Check repo/org runner registration and runner-group access for hyperpolymath/echidna.
  2. Concurrency / Actions minutes or spending cap at the org/billing level throttling job dispatch.
  3. The 3 fast-fail workflows may pin a runs-on: label that no longer resolves (e.g. a retired self-hosted label), failing instantly while hosted-runner jobs just queue.

Impact

  • Blocks all echidna PRs from green CI; forces --admin merges (audit-trail / branch-protection erosion).
  • Masks real signal: a genuinely broken PR is indistinguishable from the jam.
  • Recurs every push — not a one-off.

Acceptance

  • Workflow runs on main and PR branches reach a real success/failure conclusion (no perpetual queued).
  • cargo-audit / dogfood-gate / secret-scanner either pass or fail with logs.
  • A normal PR can merge on green CI without --admin.

Filed as forensic follow-up to #53 / PR #71. The E-series proofs themselves are fine and merged; this issue is purely the CI/runner infrastructure.

Activity

  1. hyperpolymath commented on May 18, 2026

    @hyperpolymath
    OwnerAuthor

    CI jam — diagnosis split into two distinct causes

    Cause A — 3 workflows instant-failing (CODE DEFECT — fixed in #78)

    cargo-audit.yml, secret-scanner.yml, dogfood-gate.yml were rejected by GitHub's workflow validator at parse time on every push (run name==path, jobs:[], 0 s duration, no logs — the "invalid workflow file" signature, not runner starvation). Root causes: illegal job-level hashFiles() in two files; a dedented inline-Python heredoc breaking the run: | block scalar in the third. Surgical fix in PR #78. No org-admin action required for this part.

    Cause B — ~70/100 runs stuck queued, runner: null (NOT a code defect, NOT fixable in a PR)

    Evidence gathered:

    • gh api repos/hyperpolymath/echidna/actions/runners → {"total_count":0,"runners":[]} (no self-hosted runners — correct, all runs-on: are ubuntu-latest).
    • gh api orgs/hyperpolymath/actions/runners and .../runner-groups → HTTP 404 Not Found. hyperpolymath is "type":"User", not an org — so there is no org runner-group misconfig to fix.
    • gh api repos/hyperpolymath/echidna/actions/permissions → {"enabled":true,"allowed_actions":"all","sha_pinning_required":true} (Actions enabled, not disabled).
    • gh api users/hyperpolymath/settings/billing/actions → HTTP 404 ("needs user scope"; the legacy per-user billing endpoint is also deprecated — cannot confirm/deny a spending cap via API with the current token).

    Diagnosis: every push/PR to main fans out into ~20+ workflows simultaneously (mirror.yml has 7 jobs, plus instant-sync.yml, scorecard.yml, scorecard-enforcer.yml, live-provers.yml, container-ci.yml, rust-ci.yml ×6 jobs, etc.). On a personal GitHub account, GitHub-hosted concurrency is tightly capped, so runs sit queued with runner: null (never assigned) until slots free up — they are not failing, just starved.

    Exact remediation required (org-admin / repo-admin, no code PR):

    1. Confirm the Actions spending limit / included-minutes state at https://github.com/settings/billing — if the included free minutes for private-repo Actions are exhausted, raise the spending limit or wait for the monthly reset. (Could not verify via API — user scope + non-deprecated endpoint needed; check the billing UI directly.)
    2. Reduce per-push fan-out (this DOES need a follow-up PR, tracked separately from fix(ci): repair 3 invalid workflows rejected at parse time (Refs #77) #78): add concurrency: groups with cancel-in-progress: true to the high-volume workflows, and narrow over-broad triggers (mirror.yml, instant-sync.yml, scorecard* firing on every push are the main amplifiers). Recommend a dedicated issue/PR for the trigger-pruning + concurrency-group sweep.

    Note: gh token already carries workflow scope — no gh auth refresh was needed to push the workflow fixes in #78.

  2. hyperpolymath commented on May 18, 2026

    @hyperpolymath
    OwnerAuthor

    Status update — code-side mitigations landed; root driver remains billing-gated

    Both code-defect fixes are now on main. The CI matrix is still jammed because the binding constraint is account-level and not fixable in-repo — see "Residual" below.

    Fixed (merged)

    Cause A — 3 workflows fast-failed at parse time — PR #78 (squash-merged 1182089, admin override; green CI unattainable while jammed).

    • cargo-audit.yml / secret-scanner.yml: removed the illegal job-level hashFiles if:; detection now runs in a step and gates later steps via if: steps.detect.outputs.present == 'true'.
    • dogfood-gate.yml: the eclexiaiser-validator Python heredoc. The original PR fix(ci): repair 3 invalid workflows rejected at parse time (Refs #77) #78 used a sed 's/^<16 spaces>//' dedent that was itself broken — GitHub strips the run: block-scalar's 10-space common indent before the script reaches the shell, so the heredoc body arrived at 6 leading spaces while the sed still looked for 16, leaving Python with bad indentation (and echidna does ship an eclexiaiser.toml, so this path is always hit). Corrected in fix(ci): repair 3 invalid workflows rejected at parse time (Refs #77) #78 before merge: the sed dedent was removed entirely and the Python body placed at the block-scalar base indent so YAML's own dedent delivers it column-aligned. Validation logic unchanged; verified byte-precisely by simulating the YAML block-scalar dedent.

    Cause B — self-inflicted fan-out amplification — PR #79 (squash-merged e718fd3, admin override, same justification).

    • Added concurrency: { group: ${{ github.workflow }}-${{ github.ref }} } to all 20 workflows that lacked one (hypatia-scan.yml already had the canonical block). cancel-in-progress: true for push/PR CI gates; cancel-in-progress: false for mirror/sync/publish/scorecard so an in-flight mirror, publish or security scan is never aborted.
    • Tightened two over-broad triggers (no gate disabled, all still fire): governance.yml pull_request: was unscoped → branches: [main, master]; container-ci.yml push: was any-branch (path-filtered only) → branches: [main, master].

    Observed effect so far

    Not yet visibly improved. The post-#79 push to main (e718fd3) still fans out the full matrix, all queued with no runner assigned. Expected: the new concurrency: blocks only de-duplicate superseded re-pushes to the same ref — they cannot drain a queue that the account-level cap is throttling. The benefit becomes visible on the next push that supersedes an in-flight run (stale duplicates auto-cancel instead of stacking), and fully only once the cap below is lifted.

    Residual — USER ACTION REQUIRED (org-admin / billing, not in-repo)

    The root Cause-B driver is unchanged: GitHub-hosted Actions concurrency / spending-limit saturation on the personal account — jobs are accepted and time-stamped but never assigned a runner (runner: null), the classic symptom of a hit Actions spending cap / concurrency ceiling.

    Please check manually: https://github.com/settings/billing → Actions — verify the spending limit is not exhausted (raise it / enable spend, or wait for the monthly reset), and review any org/account Actions concurrency ceiling. This is the binding constraint; until it is cleared, runs will continue to queue regardless of in-repo changes.

    Leaving this issue open — it closes when a normal PR can merge on genuinely green CI without --admin, which depends on the billing/concurrency item above.

  3. hyperpolymath commented on May 30, 2026

    @hyperpolymath
    OwnerAuthor

    Closing as stale — CI infra is no longer jammed

    Verified 2026-05-30: Workflow runs on main are now reaching real success/failure conclusions; the May-18 perpetual-queued symptom is gone. Sample of the last governance run on main (run 26633535347):

    Status Job
    ✅ success governance / Code quality + docs
    ✅ success governance / Security policy checks
    ❌ failure governance / Trusted-base reduction policy
    ❌ failure governance / Language / package anti-pattern policy
    ✅ success governance / Workflow security linter
    ✅ success governance / Validate Hypatia baseline
    ✅ success governance / Guix primary / Nix fallback policy
    ✅ success governance / Well-Known (RFC 9116 + RSR)

    These are real outcomes, not perpetual queued. The two failures are now tracked under #92 (governance baseline content failures) and are being addressed in:

    Closing #77 as the infrastructure-level jam is resolved. The 3 fast-failing workflows (cargo-audit.yml, dogfood-gate.yml, secret-scanner.yml) called out in the original report were replaced by wrappers in #113/#114/#115 and are now reporting normally (Secret Scanner: success, Dogfood Gate: success on the latest run).

  4. hyperpolymath commented on May 30, 2026

    @hyperpolymath
    OwnerAuthor

    Stale — CI infra is no longer jammed. See triage above.

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

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions