Skip to content

PRs tab renders "CI passed" when zero required jobs ran #990

Description

@arul28

Summary

The PRs tab's CI rollup reports "CI passed · 3 jobs" for a PR where no test job executed at all. It aggregates whatever check-suites happen to exist and reports their conclusions, with no notion of which checks are required or whether the workflow ran. Absence reads as success.

Observed on PR #988 (ade/pr-merged-lane-mapping).

Proof

ADE rendered:

✓ CI passed          3 jobs  open
  PR #988

gh pr checks 988 — the complete list:

CodeRabbit               pass   0   "Review rate limited"
Vercel                   pass   0   "Canceled by Ignored Build Step"
Vercel Preview Comments  pass   0

CodeRabbit was rate-limited — a review that never happened, reporting pass. Vercel was cancelled by an ignored-build step — a skipped build, reporting pass. The third is a comment bot. Nothing verified anything.

Missing: every required job in .github/workflows/ci.ymlinstall, test-desktop shards 1–8, test-ade-cli, and the ci-pass gate.

$ gh api repos/arul28/ADE/actions/runs?branch=ade/pr-merged-lane-mapping
{"total_count": 0}

Check-suites on head d56fbb420 — GitHub Actions registered no suite at all:

railway-app     queued
cursor          queued
graphite-app    queued
vercel          completed / success
mintlify        queued
greptile-apps   queued

Why it matters

This is the failure mode a CI indicator exists to prevent. A user (or an autonomous /ship loop) reading that card would merge believing the suite was green. It is strictly worse than showing nothing, because it actively asserts a fact that is false.

It also mirrors a bug class we just fixed elsewhere in this tab: rendering a confident signal derived from missing data (merged PRs showing unmapped because their row was deleted). Same disease, different surface.

Diagnosis

The rollup almost certainly derives from the checks/check-suites list returned for the head SHA, reducing conclusions to pass/fail/pending. Two independent defects:

  1. No required-check awareness. GitHub exposes the required-check list via branch protection / rulesets. The rollup should compare observed checks against required ones and report missing required checks as not-passing — never as passed.
  2. Skipped/neutral/cancelled conclusions are being counted as success. A check with conclusion skipped, neutral, cancelled, or a success carrying a rate-limit/ignored-build output is not evidence of a passing build. At minimum these should not contribute to a green rollup.

A third, softer point: with zero Actions suites present, the honest render is "CI has not run", not "CI passed". Presence of unrelated third-party app suites (Vercel, Railway, Graphite, Mintlify, Cursor, Greptile) should not satisfy a CI indicator.

Suggested starting points

  • apps/desktop/src/main/services/prs/prService.tsgetChecks / computeStatus / the PrStatus.checksStatus derivation
  • apps/desktop/src/shared/prPipelineState.ts — the canonical status/conclusion → pipeline-state mapping and worst-state ranking (this is where skipped/cancelled/neutral handling belongs, and it is already documented as the single place all surfaces must agree on)
  • apps/desktop/src/renderer/components/prs/shared/prCheckList.tsx and the PRs card rollup

Acceptance

  • A PR whose required Actions checks have not run renders as not passed (e.g. "CI has not run" / pending), never "CI passed".
  • skipped / cancelled / neutral conclusions do not produce a green rollup on their own.
  • Regression test for both, ideally at the prPipelineState layer so every surface inherits it.

Notes

Separately and unresolved: GitHub Actions created no check suite for this branch across three trigger attempts (opened, reopened, synchronize), while six other apps did. Actions is enabled, globally operational, and ran successfully on another ade/* branch 30 minutes earlier. That is a distinct problem from this ticket, which is purely about ADE reporting green regardless.

Proof artifact attached in the ADE proof drawer: pr988-false-green-ci-card.txt.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions