You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
CI infrastructure jammed: jobs stuck in queued (runner never assigned) + 3 workflows fast-fail without logs — blocks all PRs #77
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)
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.
Concurrency / Actions minutes or spending cap at the org/billing level throttling job dispatch.
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.
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-levelhashFiles() 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):
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.)
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.
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 hashFilesif:; 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.ymlpull_request: was unscoped → branches: [main, master]; container-ci.ymlpush: 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.
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).
Activity
hyperpolymath commentedon May 18, 2026
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.ymlwere rejected by GitHub's workflow validator at parse time on every push (runname==path,jobs:[], 0 s duration, no logs — the "invalid workflow file" signature, not runner starvation). Root causes: illegal job-levelhashFiles()in two files; a dedented inline-Python heredoc breaking therun: |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, allruns-on:areubuntu-latest).gh api orgs/hyperpolymath/actions/runnersand.../runner-groups→ HTTP 404 Not Found.hyperpolymathis"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 ("needsuserscope"; 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
mainfans out into ~20+ workflows simultaneously (mirror.ymlhas 7 jobs, plusinstant-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 sitqueuedwithrunner: null(never assigned) until slots free up — they are not failing, just starved.Exact remediation required (org-admin / repo-admin, no code PR):
userscope + non-deprecated endpoint needed; check the billing UI directly.)concurrency:groups withcancel-in-progress: trueto 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:
ghtoken already carriesworkflowscope — nogh auth refreshwas needed to push the workflow fixes in #78.fix(ci): make dogfood-gate Python heredoc survive YAML block-scalar d…
fix(ci): repair 3 invalid workflows rejected at parse time (Refs #77) (…
fix(ci): concurrency dedup + tighten over-broad triggers (Refs #77) (#79
hyperpolymath commentedon May 18, 2026
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-levelhashFilesif:; detection now runs in a step and gates later steps viaif: 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 ased 's/^<16 spaces>//'dedent that was itself broken — GitHub strips therun: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 aneclexiaiser.toml, so this path is always hit). Corrected in fix(ci): repair 3 invalid workflows rejected at parse time (Refs #77) #78 before merge: theseddedent 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).concurrency: { group: ${{ github.workflow }}-${{ github.ref }} }to all 20 workflows that lacked one (hypatia-scan.ymlalready had the canonical block).cancel-in-progress: truefor push/PR CI gates;cancel-in-progress: falsefor mirror/sync/publish/scorecard so an in-flight mirror, publish or security scan is never aborted.governance.ymlpull_request:was unscoped →branches: [main, master];container-ci.ymlpush: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, allqueuedwith no runner assigned. Expected: the newconcurrency: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.docs: CI-baseline triage record (human ADR + machine STATE) (#85)
hyperpolymath commentedon May 30, 2026
Closing as stale — CI infra is no longer jammed
Verified 2026-05-30: Workflow runs on
mainare now reaching realsuccess/failureconclusions; the May-18 perpetual-queuedsymptom is gone. Sample of the last governance run onmain(run 26633535347):These are real outcomes, not perpetual
queued. The two failures are now tracked under #92 (governance baseline content failures) and are being addressed in:chore(governance): clear 12 trusted-base false-positive escape hatches)chore(governance): populate empty deno.lock with minimal valid v4 lockfile)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: successon the latest run).hyperpolymath commentedon May 30, 2026
Stale — CI infra is no longer jammed. See triage above.