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
fix(gate): an ignored check must not hold the PR via mergeable_state either
gate.ignoredCheckRuns (#9813) excluded the check from LoopOver's own CI
aggregate, but mergeable_state is GITHUB's computation and stays "unstable"
while the check exists at all -- and derivePrDisposition holds unconditionally
on unstable. So the ignore was half-effective: the check no longer failed the
gate, and the PR was held anyway. Observed live on #9816
immediately after the config flip, reason "mergeable_state is unstable --
non-required check(s) not passing: Contributor trust".
Dismiss an unstable state ONLY when the ignore list fully explains it: at least
one ignored run concluded non-passing, our aggregate found no non-required
failure, and ciState is not failed. Any other unstable cause still holds, and
the flag never rescues a PR held for a different reason.
Also make the un-itemized unstable message actionable. It used to say only "a
non-required check or status is not passing" -- no check name, no next step.
GitHub never says why, and the aggregate can legitimately fail to itemize it (a
commit status rather than a check-run, an unreadable app page, a run that
appeared after CI was read). Name that ambiguity and point at the Checks tab.
? `mergeable_state is unstable — non-required check(s) not passing: ${names.join("; ")}`
802
-
: "mergeable_state is unstable — a non-required check or status is not passing";
807
+
// #9810 follow-up: the un-itemized case used to say only "a non-required check or status is not passing",
808
+
// which tells a maintainer nothing they can act on -- not which check, not where to look. GitHub computes
809
+
// mergeable_state itself and never says why, and our aggregate can legitimately fail to itemize it (a
810
+
// COMMIT STATUS rather than a check-run, a check from an app whose page we couldn't read, or a run that
811
+
// appeared after the aggregate was taken). Name that ambiguity and point at the one place the answer
812
+
// always exists, instead of restating the state.
813
+
: "mergeable_state is unstable — GitHub reports a non-required check or status as not passing, but this pass could not itemize which one (it may be a commit status rather than a check-run, or it appeared after CI was read). See the PR's own Checks tab for the current list";
return`Held for manual review: the gate and required CI are green, but GitHub reports this pull request's mergeable state as \`unstable\` because a non-required check or status${culprit} is not passing, so LoopOver will not auto-merge. A maintainer can resolve the failing check or review and merge manually. This is an automated maintenance action.`;
819
+
constwhereToLook=
820
+
names.length>0
821
+
? ""
822
+
: " This pass could not identify which check (it may be a commit status rather than a check-run, or it appeared after CI was read) — the PR's own Checks tab has the current list.";
823
+
return`Held for manual review: the gate and required CI are green, but GitHub reports this pull request's mergeable state as \`unstable\` because a non-required check or status${culprit} is not passing, so LoopOver will not auto-merge.${whereToLook} A maintainer can resolve the failing check or review and merge manually. This is an automated maintenance action.`;
809
824
}
810
825
811
826
/**
@@ -1102,6 +1117,11 @@ export function planAgentMaintenanceActions(input: AgentActionPlanInput): Planne
0 commit comments