Skip to content

ci: Actions check runs stuck in queued across PRs — no runner pickup since ~05:00Z 2026-10-28 #1599

Closed

Description

@dezren39

Problem

As of 2026-10-28T05:50Z, GitHub Actions check runs for developing-today/code PRs are stuck in queued and not being picked up by any runner. Zero check runs have failed — they simply never start. This blocks every fleet merge that requires green CI.

Evidence (queue worker lane C shift, 2026-10-28 04:54–05:52Z)

Queue tasks 1622, 1489, 1349, 1311, 1616 and 1642 were each parked awaiting CI during this shift purely because of this stall; each issue carries an agent note with the per-PR counts.

Acceptance

  • Identify why runs stopped being picked up (runner availability / workflow concurrency / GitHub-side incident) and record the cause here.
  • The queued matrices on the PRs above drain and complete (pass or fail on their merits).
  • If the cause is repo-side (e.g. concurrency groups cancelling/starving runs), a fix lands; if GitHub-side, note the incident reference and close when runs drain.

Acceptance criteria

  • The cause of the 2026-10-28 ~05:00Z runner-pickup stall is identified and recorded on this issue (runner availability, workflow concurrency, or GitHub-side incident, with the evidence that distinguishes them).
  • The queued check matrices on the PRs named in the body drain and complete, passing or failing on their merits.
  • If the cause is repo-side, a fix lands; if GitHub-side, the incident reference is recorded here before closure.

Activity

  1. added
    kind/ciCI/CD pipelines, workflows, and build automation
    priority/highImportant and time-sensitive
    on Oct 28, 2026
  2. developing-today commented on Oct 28, 2026

    @developing-today
    Contributor
  3. added
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    effort/sSmall: expected under 2 hours of work
    source/humanFiled directly by a human
    area/ciCI/CD pipelines, workflows, and build automation (area)
    on Oct 28, 2026
  4. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Intake review

    Related: fleet CI stall context appears in the park notes of tasks 1622, 1489, 1349, 1311, 1616, 1642 and on PRs #1563, #1543, #1588, #1576, #1596, #1575. Epic #539 is the wider CI program.
    Notes — looks partially solved, NOT closed: merges resumed after filing (PR #1563 merged ~07:14Z and PR #1545 merged in the same window per the fleet sweep log), so at least part of the queued backlog drained; but no cause has been recorded on this issue, and its own acceptance requires the cause before closure. It therefore stays open for the cause write-up.
    Risks: a silent recurrence would re-park most of the code queue (16 parked tasks at this run's snapshot, most awaiting CI).
    Suggested approach: pull the runner/workflow-run timeline for 04:45–07:15Z, record whether pickup resumed on its own or after a change, then close with that cause.


    🤖 Agent note · filed

    • Agent: fleet monitor
    • Session / ID: repo-fleet-monitor run 2026-10-28 02:19 CDT
    • Found via: monitor reconciliation
    • Task: Intake enrichment (protocol §5): acceptance-criteria section appended, labels normalized, this review posted.
    • Expectation: effort as labelled; done when the acceptance criteria above are met.
  5. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    Operator diagnosis update (2026-10-28 ~13:15 CDT), from live sampling:

    State: code ≥50 runs queued / 1 in progress; opencode 32 / 1; openchamber 45 / 2; nix clear. Jobs DO complete — this is throughput collapse, not a hard stop. PR #735's test run is the type specimen: jobs created 17:42Z started at 17:55Z, 18:07Z, 18:08Z (out of order), and build (linux) still had no runner after 30 min while later jobs on the same run finished.

    Not GitHub-declared: githubstatus.com shows no Actions incident today (only a Copilot model incident 14:12–15:28 UTC). The status page does show Actions degradations on Oct 22, 23, and 26, so GitHub-side capacity has been tight all week — but today's stall is not an acknowledged incident.

    Self-inflicted volume is the controllable half: a 50-run sample of code's queue: nix ci 12, id 11, Auto Assign 10, mcpx conformance 5, mcpx 4, id bench 3, Jules 3. 14 queued runs target main itself (post-merge fan-out from today's merge wave). Queue branches carry 4–5 queued runs each — superseded pushes are NOT cancelling stale runs: 19/20 workflow files mention concurrency, but cancel-in-progress is essentially absent (auto-assign sets it false explicitly). Every stale run holds a queue slot ahead of live work.

    Conclusion: the binding constraint is GitHub-hosted runner assignment for the account, saturated by our own run fan-out (many workflows per event × big matrices × four repos), against a GitHub-side ceiling that has been degraded repeatedly this week. Levers, in order of payoff: (1) concurrency groups with cancel-in-progress: true on PR-triggered workflows in all four repos; (2) move heavy non-gating workflows (id bench, conformance, nix ci where not gating) off per-push triggers to merge-to-main or scheduled; (3) trim per-merge main fan-out.

  6. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Fleet CI redesign — coordinator summary (2026-10-29)

    Landed and merged:

    Remaining gaps (recorded, not hidden):

    1. CODE expanded-directive slice NOT landed: ci-policy.md lacks the "Merge requirement" line / basic-tier naming, and auto-assign.yml is still event-based (it has the safe per-target Phase 1 concurrency; no repo-sweeper.yml in code). Cause: a coordination miss in this run — two parallel workers landed on openchamber and de-duplicated; no worker remained on code's follow-up. Needs one small follow-up PR.
    2. Jules leg gated OFF in opencode + openchamber watchers: JULES_API_KEY secret is not set in those repos. Filing leg is live; the leg auto-enables once the secret + an issue-labeled Jules job exist.
    3. Branch protection untouched everywhere (not authorized): merge requirement is by naming + policy doc. Hard enforcement = set required checks to the basic-named checks per repo.
    4. Release-gate (publish workflows refusing a red-main SHA) not implemented in any repo.
    5. Phase 3 validated by dry-run / live Breakage-ID computation everywhere — main was deliberately NOT broken as a test.
    6. Watch: openchamber sweeper's first scheduled ticks were not yet observed at last check (new-workflow cron lag + runner backlog); confirm once queues drain.

    Phase issues stay open: #1780/#1781 substantially landed (code naming/consolidation remainder above), #1782 pending the Jules-secret gap and the release-gate item.

  7. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    CI redesign close-out for code — the expanded-directive slice, branch protection, and the merge-queue pilot are in.

    Naming + merge requirement + sweeper (PR #2148, merged 2026-10-29, merge commit 24901e7b)

    • .github/ci-policy.md now states it verbatim: "Merge requirement: the basic-validation (PR) tier only. The full suite runs on main and is NOT a merge gate." PR-tier jobs display with basic: prefixes and main/nightly-only jobs with full (main tier): across all check workflows (17 jobs renamed; workflow names unchanged — main-broken.yml/jules.yml reference them; the flake-check aggregator keeps its historical name because it is the required status context, the same exception opencode made).
    • Event-based issue management consolidated: auto-assign.yml deleted; new .github/workflows/repo-sweeper.yml (schedule */15 * * * * + dispatch, single live run, cancel-in-progress safe for scheduled events) folds in the auto-assign duty as a deterministic pass over all open issues/PRs. Kept event-based, with reasons recorded in the PR and policy: jules.yml (a human applies the jules label and waits on Jules synchronously; its workflow_run leg is the CI: Jules workflow_run subscribes to every workflow completion — 44 of the last 100 repo runs are skipped no-ops, and they share the concurrency group that can drop a real ci-failure-fix run #304 ci-failure-fix chain) and main-broken.yml (the Phase 3 workflow_run watcher, not issue management). Everything else was already validation, schedules, or releases.
    • Sweeper status: dispatch smoke test completed/success; the first scheduled ticks have not fired yet (~2.5h after landing) and need observation rather than assumption — the workflow is registered active.

    Formatting is not a gate (same PR): formatting never blocks a merge. The treefmt PR job was removed (its non-format stowaway, the proxy-port check, survives as a standalone basic job); new .github/workflows/auto-format.yml runs treefmt on push to main (plus a nightly backstop) and commits any fix directly to main as github-actions[bot] — style(treefmt): auto-format on main — loop-safe via GITHUB_TOKEN semantics plus a head-commit guard. Rationale: formatting is mechanical; blocking merges or queue slots on it costs cycles, and the fix commit lands within seconds — well before the main-tier full check would file a breakage for it. Its first run on the #2148 merge push completed/success (tree was clean, so no commit).

    Branch protection on main (now enforced): required status checks, strict=false, contexts = exactly one: basic: proxy port fallbacks. It is the only basic-tier context that reports on every PR — verified empirically from real check-runs across PRs #2003/#2067/#2089/#2098/#2148; every other basic job is paths-gated, and a missing required context would block all merges. enforce_admins=false, no force pushes, no deletions, no review requirements. The repo's pre-existing settings were preserved (push restricted to the codeowners team; branch creation blocked); one deliberate addition: the github-actions app is allow-listed alongside codeowners so the auto-format bot's direct pushes to main are not blocked by the push restriction (one-call revert if unwanted).

    Merge-queue pilot on main (live)

  8. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Still stalled at 12:58Z 2026-10-29 — fresh evidence from a queue worker sweep

    Measured from the laptop while working the repo-health queue (three PR-finalisation tasks all parked on this):

    • Repo-wide: across the last 30 workflow runs, 0 are in_progress and none completed recently while queue jobs accumulated.
    • Merge queue: 8 entries AWAITING_CHECKS on main (oldest enqueued 12:33Z). Every merge_group nix ci run is queued without starting: pr-2220 (15m), pr-2293 (16m), pr-2252 (7m), pr-2303 (5m), pr-2297 (4m).
    • PR-branch runs: id(world): wire manifest apply — module install + schedules over the wire (#807) #1820's basic: nix flake check run (40868118355) was queued from 11:47Z, its jobs only began 12:24Z, and at 12:46Z 23/28 were still queued (4 completed). docs(openclaw): comms-path design — Slack primary, direct API phase 2 (#2023) #2303's lightweight proxy port fallbacks job did run (6s, pass), so short jobs occasionally start — the starvation is in the heavy nix flake check / nix ci matrix.
    • Consequence: nothing on main can merge right now; PRs that are review-clean and green on their PR-branch runs sit at queue positions 1-8 indefinitely. The queue worker lanes are parking PR-finalisation tasks with 20-30 min retry rather than burning leases on the wait.

    Repro: gh run list --limit 30 --json status --jq '[.[]|select(.status==in_progress)]|length' → 0, and gh api graphql -f query='{repository(owner:"developing-today",name:"code"){mergeQueue(branch:"main"){entries(first:10){nodes{position state enqueuedAt pullRequest{number}}}}}}'.

    — repo-worker-code (openchamber scheduled lane), queue tasks 2661 / 3381 / 2986

  9. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Addendum from another lane working the same queue (tasks 3349 / 3351 / 3363, PRs #2246 / #2252 / #2282) — one behaviour not in the evidence above: the merge queue silently evicts entries while the merge_group runs stay queued.

    Observed on the three PRs this lane finalised:

    PR added removed outcome
    #2246 12:21:00Z, 12:33:03Z 12:31:59Z, 12:55:24Z open, evicted twice
    #2252 11:51:56Z, 12:44:51Z 12:19:32Z, 12:57:56Z open, evicted twice
    #2282 12:58:27Z — in queue

    Each eviction happens 10–25 min after the enqueue with no comment and no removed_from_merge_queue reason, i.e. the merge-group timeout, not a conflict or a failed check — all three are CLEAN/MERGEABLE with basic: proxy port fallbacks green on the head. gh run list --event merge_group confirms the cause: every merge_group … nix ci run since ~12:35Z is queued (one in_progress from 12:37Z), so the queue check never reports and GitHub drops the entry.

    Operational consequence for lanes: an entry in the queue does not persist, so "enqueued, then parked on CI" decays to "open, not queued" within ~20 min. Re-enqueue on resume (gh api graphql -f mutation … enqueuePullRequest) rather than assuming the queue holds it; a re-enqueue is what puts the PR back in line for the moment the heavy nix ci matrix drains.

    — repo-worker-code (openchamber scheduled lane)

  10. 9 remaining items

  11. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Ejection with an all-green merge group — 2026-10-29T20:20Z (openchamber scheduled lane, queue task 3003)

    New datapoint for the stall, and it removes the "checks not started" explanation for this entry:

    • PR feat(pm-aggregator): complexity-weighted progress slice 1 (#1108) #2373 (CLEAN, required check green on the branch) enqueued 20:20:49Z, queue entry state AWAITING_CHECKS position 3.
    • Merge-group commit f64d4a6f ran all its checks to completion: nix ci run 40948209989 SUCCESS, basic: proxy port fallbacks SUCCESS, CodeRabbit SUCCESS.
    • Ejected by github-merge-queue[bot] at 20:21:22Z — 33 s after enqueue, i.e. before those runs could have been the cause — with no explanatory PR comment. PR remains OPEN.
    • Merge-group nix ci runs keep succeeding either side of the ejection (8bd4ef1 20:22:13Z, c0cc9dc 20:21:54Z, both SUCCESS), so the queue is building and validating groups but not merging them.
    • PUT /pulls/2373/merge → 405 "Changes must be made through the merge queue"; ruleset 26115813 main: merge queue pilot has bypass_actors: [], merge_method: MERGE, grouping_strategy: HEADGREEN, check_response_timeout_minutes: 30. main still 5a34fa70 (10:57:51Z, ~9.4 h).
    • 40+ open PRs against main are CLEAN and unmerged; the last merge on main is the 10:57:51Z merge of ci: run nix ci on merge groups (merge-queue pilot step 1) #2233 (ci/merge-group-trigger), the change that made merge-group checks run.

    Read: the ejection is not a per-PR check failure and not a missing required check — something invalidates the entry within seconds while the group is still running. Candidate directions: the min_entries_to_merge_wait_minutes: 1 + max_entries_to_build: 100 settings against a 40-PR backlog, or a group commit that conflicts with the queue head. The concrete impact is that no queue worker can land anything; slice 1 of #1108 (#2373) is blocked on this and its task 3003 is now blocked rather than re-parked.

  12. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Merge-queue ejection — fresh evidence 2026-10-29T20:38–20:40Z (queue worker lane C, task 2983)

    PR #2228 was ejected for the 4th time today, this time on a fully-documented cycle:

    • PR state at enqueue: OPEN, CLEAN / MERGEABLE, head cf006fef, 0 unresolved review threads (all Codex + CodeRabbit findings dispositioned/resolved), branch checks green.
    • Enqueued 20:38:39Z at position 1, state AWAITING_CHECKS.
    • Ejected by github-merge-queue[bot] at 20:39:28Z — 49 seconds later.
    • Its merge-group nix ci run 40950905065 then completed SUCCESS at 20:39:48Z (both jobs success) — i.e. the group was valid and green, and the ejection preceded its completion, exactly matching the feat(pm-aggregator): complexity-weighted progress slice 1 (#1108) #2373 datapoint posted earlier today.
    • Earlier ejections of the same PR today: 19:42:06Z, 20:09:07Z, 20:13:13Z.
    • main is still 5a34fa707001f297fd963ea7b8a33d0eb8b7951c — no merge since 10:57:51Z, now ~9.7 hours.

    Task 2983 is being blocked (escalated-to-user) rather than re-parked, following the task-3003 precedent: re-parking only feeds another futile enqueue/eject cycle. The PR is merge-ready the moment the queue actually merges; the blocker is queue/admin-side (merge-queue ruleset behaviour and/or org Actions capacity — the checks a worker token cannot perform, per the earlier billing/admin notes on this issue).

  13. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Repo-wide queued window, 50+ min, zero non-skipped completions — 2026-10-30T01:42–02:40Z (openchamber scheduled lane, queue tasks 3111 + 3097)

    A fresh datapoint that is not the merge-queue variant already recorded here: this is no pickup at all, across every workflow in the repo.

    Consequence for the queue: every lane that reaches awaiting_ci parks, so PR-shaped tasks convert to parks rather than merges, and the 20-minute CI park is now the dominant exit. If the runner pool is out of quota or a workflow-level concurrency group is holding an old run, that is invisible from here — a look at the runner list with an admin token would settle it.

  14. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Required-check identification + continuation, 2026-10-30T03:20–03:25Z (openchamber scheduled lane, queue task 3111)

    Two facts that narrow the incident, from PR #2502:

    1. The only required status check on main is basic: proxy port fallbacks (gh api repos/developing-today/code/branches/main/protection: one context, strict: false, enforce_admins: false). On docs(mcpx): level-1 pages — overview, install, quick start, now-what (#1878) #2502 it has been queued since 02:23:37Z — so the PR is BLOCKED on exactly that one check, nothing else.
    2. The pre-existing basic: test red on pkgs/mcpx is not the merge blocker. TestEveryDocumentHasAChapter fails on clean main (a49def85) naming 11 unplaced docs (binary.md, cli.md, compare/*, examples.md, faq.md, interfaces.md, level-2-page-map.md, opencode-plugin-v2.md, plugins.md, scripts.md), and PR docs(mcpx): define the compendium structure and map every document to a chapter (#1867) #2482 merged at 01:12:58Z with that check FAILURE while the required check was SUCCESS. So "PRs merge with a red basic: test" is normal for docs work, and that red is not why anything is stuck.

    Outage continuation: a push to queue/3068-1858-opencode-v2-plugin at 03:20:26Z queued mcpx, mcpx conformance and nix ci within seconds; still no non-skipped workflow completion repo-wide at 03:25Z. Task 3111 parks again on this.

  15. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Fresh evidence 2026-10-30 ~08:10 UTC (queue worker, Lane A): the basic-tier checks are still not being picked up. PRs #2565 (queued since 07:16 UTC), #2620 (07:33), #2592, #2589 and #2616 all sit at basic: test / spec parity / proxy port fallbacks = queued/pending for 40–55+ minutes while their full-tier jobs skip normally. Five queue tasks are parked on this alone; merges are blocked fleet-wide for the mcpx PR queue.

  16. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Finding (queue worker Lane B, task 3199 resume, 2026-10-30 ~09:40Z): a class of "missing CI" is the deliberate main-only trigger change, not the runner stall

    Several fleet PRs are parked waiting for PR-head CI that will never be created:

    Distinguish from this issue's original stall: pull_request runs created before 08:23Z (e.g. PR #2565's and #2585's, queued since 07:16Z/08:13Z) are still genuinely queued with no runner pickup — that part is the stall tracked here. But any PR whose head was pushed after 08:23Z is not waiting on a runner at all.

    Implication for the fleet: queue-worker tasks parked with "merge when PR CI is green" (tasks 3104, 3192, 3199, 3243, 3245, 3256, 3258 and more) have a resume condition that cannot fire under the new CI model. Their resume path is now: Codex gate clean + targeted tests verified (laptop/CI-on-main model) → enqueue via the merge queue (gh pr merge enqueues; the queue validates the combined head's required check). The worker instruction §5/§6 still describes the old PR-CI gate — it needs a Drew-confirmed update before lanes start merging on the new path en masse.

  17. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed on Nov 2, 2026
  18. dezren39 commented on Nov 2, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triage verdict (no longer reproducible — closing with evidence)

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

Metadata

Metadata

Assignees

Labels

area/ciCI/CD pipelines, workflows, and build automation (area)effort/sSmall: expected under 2 hours of workkind/ciCI/CD pipelines, workflows, and build automationmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/highImportant and time-sensitivesource/humanFiled directly by a human

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions