GitLab hits case A too, and the fix in #32319 does not cover it as written.
toChecks in packages/source-control-gitlab/src/server/gitLabMergeRequestJson.ts reports a merge request as one check named Pipeline, with url set to head_pipeline.web_url. Retrying failed jobs (the "Retry" button or glab ci retry) runs them inside the same pipeline, so the pipeline id and web_url stay the same. With #32319, a retry that fails again between two watch reads still matches the told [name, url] pair, and the watch stays silent.
Observed on 0.1.9-nightly.20261110.4449, code read at upstream main c6ca605630:
- The pipeline failed and the watch woke the agent with "Checks failed".
- The agent retried three failed jobs at 00:36:31 UTC. Each one hit
runner_system_failureand finished by 00:36:43, so the pipeline went fromrunningback tofailedin about 12 seconds, between two sweeps. - The watch never woke again. The thread showed "Watching pull request" for more than 90 minutes with the result already in.
The MR's head_pipeline already carries a value that changes on each re-finish: finished_at (here 2026-11-10T00:39:53.753Z; updated_at also moves). Folding it into the run identity for the GitLab check, for example a url or run key of web_url#finished_at, or adding finished_at to RawPipelineSchema and keying failedRuns on it, would let #32319's comparison see a retried pipeline that failed again. Reporting per-job checks would also work, but it is a larger change.