From fd94d3b2b6d050d2b7abcfc253f02aec658a287c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Gro=C3=9F?= Date: Thu, 29 Oct 2026 15:32:44 +0100 Subject: [PATCH] fix: PR hygiene runs every event's check to the end, with no concurrency group The group cancelled the runs of a pull request that was pushed and then labelled, given its milestone and its body within seconds; a run cancelled while its job went leaves a cancelled check run, and a cancelled run of the required "Labels and issue link" check left the pull request BLOCKED beside a later success. Measured on two draft pull requests with five events each: a group with cancel-in-progress: false still cancelled three of four runs, since a newer pending run replaces the older pending one; without a group all five ran. Earlier runs had failed on a payload without labels and the pull request was CLEAN once CI passed, also when the first run was held back to finish after the one that succeeded: the newest run decides the required check, not the last to finish. The header comment records both. Closes #144. Defect-Class: TOOL Found-By: US Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/pr-hygiene.yml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pr-hygiene.yml b/.github/workflows/pr-hygiene.yml index 421ec67..53caa3d 100644 --- a/.github/workflows/pr-hygiene.yml +++ b/.github/workflows/pr-hygiene.yml @@ -10,6 +10,19 @@ # fork runs with a read-only token and never sees a secret, and builds the tool from its own checkout, # which can only weaken the check on that pull request's own run, where a reviewer reads the diff. # +# No concurrency group: every event's run completes (#144). The check takes seconds and reads only its +# payload, so cancelling a superseded run saves nothing, and a run cancelled while its job was going leaves +# a cancelled check run, which blocks a required check (#141, #142). Measured on 2026-10-29 on two draft +# pull requests whose labels, milestone and body were set within seconds of opening them, five events each: +# - a group with cancel-in-progress: false still cancels: a newer pending run replaces the older pending +# one, and three of four runs were cancelled. Nothing was blocked, since a run cancelled before its job +# started leaves no check run, but the runs the check is meant to have are missing; +# - no group: all five ran, none was cancelled. Earlier runs failed (their payload had no labels yet) and +# the pull request was CLEAN once CI passed: the newest run decides the required check, not the last to +# finish. With the first run held back 75 s to finish after the one that succeeded, it was CLEAN too. +# A run reads the payload of its own event, so a pull request that fails here is fixed by an event after the +# fix, or by re-running the newest run. +# # Actions are pinned to commit SHAs, as in dotnet.yml. name: PR hygiene @@ -22,10 +35,6 @@ on: permissions: contents: read -concurrency: - group: pr-hygiene-${{ github.event.pull_request.number }} - cancel-in-progress: true - env: DOTNET_NOLOGO: true DOTNET_CLI_TELEMETRY_OPTOUT: true