Summary
compute_ci_status (scripts/lib/ci-status.sh) classifies any check that is not SUCCESS/SKIPPED/NEUTRAL/pending as failing — which sweeps in CANCELLED checks. dev-lead's own orchestration jobs (dev-lead / dispatch, dev-lead / ci-relay) are routinely cancelled by dev-lead's concurrency (superseded runs), leaving CANCELLED check-runs on the PR. The gate then reads the PR as ci-failing and pr-review skips it — even though nothing actually failed. FORCE_REVIEW=true does not bypass this (the CI gate precedes the force path).
Root cause
scripts/lib/ci-status.sh:
def is_success:
.conclusion == "SUCCESS" or .conclusion == "SKIPPED" or .conclusion == "NEUTRAL" or .state == "SUCCESS";
...
elif ([$ext[] | select(is_success)] | length) == ($ext | length) then "passing"
else "failing" # <-- CANCELLED, TIMED_OUT, etc. all land here
A CANCELLED check is neither pending nor success → falls through to failing.
Evidence (2026-06-12)
Of the PRs skipped as ci-failing in batch run 27376131558, only one has a real failure:
| PR |
real FAILUREs |
CANCELLED |
reality |
| #570 |
3 |
0 |
genuinely failing ✓ correct skip |
| #549 |
0 |
2 |
only cancelled dev-lead checks — false block |
| #521 |
0 |
2 |
false block |
| #528 |
0 |
4 |
false block |
| #483 |
0 |
6 |
false block |
The cancelled checks are dev-lead orchestration jobs:
dev-lead / dispatch COMPLETED CANCELLED
dev-lead / ci-relay COMPLETED CANCELLED
This is currently blocking PR #606 (the fix for #574) — its only non-green checks are two CANCELLED dev-lead jobs, so the force-review run logged:
{"pr":".../pull/606","decision":"skip","reason":"ci-failing"}
Impact
A large share of the "PRs pending review" backlog is not genuinely failing CI — it's this false-positive. dev-lead's concurrency cancellations are a normal, frequent occurrence, so many PRs carry CANCELLED orchestration checks and are silently un-reviewable. Force-review can't rescue them.
Proposed fix (pick one or combine)
- Treat
CANCELLED as non-blocking in is_success (or as pending) — a cancelled check is not a failed check. Simplest, broad fix.
- Extend
is_own_check to also exclude dev-lead's orchestration jobs (dev-lead / dispatch, dev-lead / ci-relay, ^Dev-Lead) the same way it excludes the pr-review cascade's own checks — these aren't real CI signal for merge-readiness.
- Distinguish "cancelled because superseded" (ignore) from "cancelled because the suite was aborted" (treat as pending/failing) if finer granularity is wanted.
Option 1 + 2 together is safest: ignore dev-lead's own orchestration checks, and don't treat a bare CANCELLED as a hard failure.
Related
Filed from an investigation into "pr-review agent not working — many PRs pending review."
Summary
compute_ci_status(scripts/lib/ci-status.sh) classifies any check that is notSUCCESS/SKIPPED/NEUTRAL/pending as failing — which sweeps inCANCELLEDchecks. dev-lead's own orchestration jobs (dev-lead / dispatch,dev-lead / ci-relay) are routinely cancelled by dev-lead's concurrency (superseded runs), leavingCANCELLEDcheck-runs on the PR. The gate then reads the PR asci-failingand pr-review skips it — even though nothing actually failed.FORCE_REVIEW=truedoes not bypass this (the CI gate precedes the force path).Root cause
scripts/lib/ci-status.sh:A
CANCELLEDcheck is neither pending nor success → falls through tofailing.Evidence (2026-06-12)
Of the PRs skipped as
ci-failingin batch run 27376131558, only one has a real failure:The cancelled checks are dev-lead orchestration jobs:
This is currently blocking PR #606 (the fix for #574) — its only non-green checks are two
CANCELLEDdev-lead jobs, so the force-review run logged:Impact
A large share of the "PRs pending review" backlog is not genuinely failing CI — it's this false-positive. dev-lead's concurrency cancellations are a normal, frequent occurrence, so many PRs carry
CANCELLEDorchestration checks and are silently un-reviewable. Force-review can't rescue them.Proposed fix (pick one or combine)
CANCELLEDas non-blocking inis_success(or as pending) — a cancelled check is not a failed check. Simplest, broad fix.is_own_checkto also exclude dev-lead's orchestration jobs (dev-lead / dispatch,dev-lead / ci-relay,^Dev-Lead) the same way it excludes the pr-review cascade's own checks — these aren't real CI signal for merge-readiness.Option 1 + 2 together is safest: ignore dev-lead's own orchestration checks, and don't treat a bare
CANCELLEDas a hard failure.Related
pushedDate) — all surfaced in the same "pr-review not working" investigation.Filed from an investigation into "pr-review agent not working — many PRs pending review."