What's happening
Required CI checks on the control runner profile (Detect validation scopes, Static gate, Validate workspace, Runtime summary) consistently end up Cancelled, or stuck Queued, which leaves PRs BLOCKED even after review approval. I've hit it on two approved PRs, #6076 and #6079, and it looks systemic rather than PR-specific.
Why it looks like the control / self-hosted pool, not workflow logic or our branches
Suggested direction (your call, since it's your infra)
Either restore/scale the self-hosted od-persistent-ci pool, or set OD_CI_RUNNER_MODE to a mode that routes control to GitHub-hosted runners (per resolve_contract, non-default modes already do this). I'm happy to help with a resilience change to runners.py, for example letting control fall back to GitHub-hosted when the self-hosted pool is down, if that'd be useful. Flagging first rather than sending unsolicited CI changes.
@lefarcen already raised the blocked-check state internally; opening this so it's publicly trackable and linkable from the affected PRs.
What's happening
Required CI checks on the
controlrunner profile (Detect validation scopes,Static gate,Validate workspace,Runtime summary) consistently end upCancelled, or stuckQueued, which leaves PRsBLOCKEDeven after review approval. I've hit it on two approved PRs, #6076 and #6079, and it looks systemic rather than PR-specific.Why it looks like the
control/ self-hosted pool, not workflow logic or our branchesAPPROVED+MERGEABLEbutBLOCKED, and the non-passing checks on both are exactly thecontrol-profile jobs.ci.yml'sconcurrencygroup is scoped per PR (ci-${{ ...pull_request.number... }}), so one PR's run shouldn't cancel another's. This isn't a cross-PR concurrency collision.mainand re-ran; thecontrolchecks still cancelled, so it isn't staleness or a conflict on our side..github/scripts/runners.py, thecontrolprofile in default mode maps to the self-hosted pool["self-hosted","Linux","X64","od-persistent-ci","od-ci-hot-poc"]. TheQueued → Cancelledsignature fits that pool being unavailable or overloaded.Suggested direction (your call, since it's your infra)
Either restore/scale the self-hosted
od-persistent-cipool, or setOD_CI_RUNNER_MODEto a mode that routescontrolto GitHub-hosted runners (perresolve_contract, non-default modes already do this). I'm happy to help with a resilience change torunners.py, for example lettingcontrolfall back to GitHub-hosted when the self-hosted pool is down, if that'd be useful. Flagging first rather than sending unsolicited CI changes.@lefarcen already raised the blocked-check state internally; opening this so it's publicly trackable and linkable from the affected PRs.