Call the shared hygiene check beside this board's own gate (#178) - #179
Open
iderex wants to merge 1 commit into
Open
Call the shared hygiene check beside this board's own gate (#178)#179iderex wants to merge 1 commit into
iderex wants to merge 1 commit into
Conversation
iderex
force-pushed
the
issue-178-shared-hygiene
branch
3 times, most recently
from
August 23, 2026 01:57
78f8da8 to
cc02192
Compare
One workflow file, which calls iderex/wache/.github/workflows/pr-hygiene.yml with the subject rule off. .github/pr-hygiene/hygiene.sh is untouched and keeps every rule it has, including the two the shared check has no equivalent for: the scope comparison against the Scope: line a named issue declares, and the qualifier aware reading that leaves another repository's issue number alone. This does not merge as it stands and the file says why. The called workflow declares pr-hygiene-<pull request number> as its concurrency group and this board's own gate declares the same string, so the run created second cancels the other. The local gate is the one that dies, one second after creation, with no steps and no verdict. A group declared here does not help, at workflow level or on the calling job: the called workflow claims the group independently of the caller. Three attempts are on the pull request. The reference is pinned by commit hash with the version beside it, because a moving reference would let the called repository change what executes here without anybody reviewing it. Closes #178 Signed-off-by: Nils Lehnen <30603423+iderex@users.noreply.github.com>
iderex
force-pushed
the
issue-178-shared-hygiene
branch
from
August 23, 2026 01:57
cc02192 to
41e930d
Compare
This was referenced Aug 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The issue this belongs to
Closes #178
What changed
One file is added,
.github/workflows/shared-hygiene.yml. It callsiderex/wache/.github/workflows/pr-hygiene.yml, which holds the half of thehygiene rules every board in this fleet has in common, with
subject_names_issue: false. Nothing else in the tree is touched:.github/pr-hygiene/hygiene.shand.github/workflows/pr-hygiene.ymlkeepevery rule they have, and the shared call runs beside them rather than in place
of them.
Why this is not mergeable as it stands
This pull request stays open and red on purpose. The board's own gate,
Deterministic PR-hygiene checks, is cancelled one second after it is createdevery time, with no steps and no verdict, and the cause is this file.
The called workflow declares its concurrency group as
pr-hygiene-<pull request number>. This board's own.github/workflows/pr-hygiene.ymldeclares the same string. Both setcancel-in-progress, so whichever run is created second cancels the other, andthe loser is the local gate.
Three placements were tried and all three lost the local gate:
no group of my own, the file as the roll out prescribes it. Run 32611192849,
cancelled, created 01:46:53, cancelled 01:46:54.a group of my own at workflow level,
shared-hygiene-<number>. Run32611334638,
cancelled, created 01:50:27, cancelled 01:50:28.the same group on the calling job rather than on the workflow. Run
32611542281,
cancelled, created 01:55:30.$ gh api repos/Flowfin/core/actions/runs/32611334638/jobs --jq '.jobs[] | {name,conclusion,started_at,completed_at,steps:[.steps[]?]}'
{"completed_at":"2026-08-23T01:50:28Z","conclusion":"cancelled",
"name":"Deterministic PR-hygiene checks","started_at":"2026-08-23T01:50:27Z","steps":[]}
Attempt 2 is the one that settles it. If the caller's own block decided the
run's group, the shared call would have sat in
shared-hygiene-<number>andnothing would have been left in
pr-hygiene-<number>to cancel the local gate.The local gate was cancelled anyway, so the called workflow claims that group
independently of the caller, and no caller side declaration can move it.
The fix belongs in
iderex/wache, where the group has to be namespaced with thecalling workflow or the calling repository. It cannot be made from this file,
and I am not editing this board's gate to work around a name chosen on another
board. Until that lands, this board can have the shared check or its own
verdict, and its own verdict is worth more.
One thing this turned up on the way. The same collision happened on
iderex/bremsweg#143, which carries the same group name, and that pull requestwas merged with the cancelled
Deterministic PR hygienestill red on it. Itshould be looked at again.
What failure it prevents
A failure that has already happened rather than one that could. The count is in
iderex/operations#1556: nineteen boards carried nineteen implementations of the
same three or four rules, in four languages, no two alike, so a two line change
to a rule they share cost nineteen edits and failed in nineteen different ways.
A recent change across the fleet took six attempts, because each board refused
it for a different reason. Every board that calls the shared half instead of
copying it is one board that stops contributing a new way to fail.
It prevents nothing this board's own gate already prevents. That gate still
runs, still reads the body, and still compares the changed paths against the
scope the named issue declares.
Evidence
The change is one added file and no other line:
The pin is the commit the tag
v1.0.0points at, dereferenced rather thantrusted:
The file parses to what its comment claims it says:
That the subject rule has to be off here was measured, not assumed. Not one
authored subject on this board is in the square brackets the fleet rule wants,
and the twelve most recent carry no reference in the subject at all, because
this board puts it in the body, which is what its own gate reads:
What a guard here refuses, and the proof it bites
The guard this change adds to the board is the shared check itself, and what it
refuses is listed above: an empty body, a closing keyword buried in a paragraph,
a placeholder title, and, where the rule is on, a commit subject that names no
issue. Here the subject rule is off, so this call refuses the first three and
says in its own log that it read no commit subject.
I did not have to construct a violation to watch it bite, because the check
constructs its own on every run: nine fixtures, one line that passes and one
line that bites per rule, judged before the change is judged, and a failed
fixture makes the run refuse to judge at all. I read the logs rather than the
summaries. The deliberately bad pull request on the check's own board,
iderex/wache#2, run 32605656340:The same rules pass a good pull request,
iderex/wache#1, run 32605508804,which ended in success.
No guard on this board is added, edited or deleted by this change, so there is
nothing here whose deletion could be shown to redden a suite.
What this does not cover
A green
Shared hygienehere is not evidence that the shared rules are right,only that they run across a repository boundary and that this board passes them.
It is no evidence at all about the subject rule, because that rule is off on
this call and no commit subject is read. The log line says so in as many words,
and a reader should take the green tick as covering three rules rather than
four.
It measures nothing about
.github/pr-hygiene/hygiene.sh. The two runindependently and neither covers the other's gaps. The scope comparison, the
qualifier aware reference reading, and this board's stricter sense of an empty
body exist only in the local gate and are not touched, retested or replaced
here.
It is also not evidence that any local rule is now redundant. Nothing was
removed, and nothing should be until the shared check is shown, rule by rule, to
cover it.
None of the above is evidence that the shared check and the local gate can run
together on this board. They demonstrably cannot at this pin, and the green
Shared hygienetick on this pull request was bought by cancelling the localgate, which is worse than not having it.
Nothing here was run on Windows or on any runner other than
ubuntu-latest, andnothing here reads the called workflow's behaviour on a fork pull request.
Who has read it
Nobody other than me. This is the third board of a fleet wide roll out and
follows
iderex/bremsweg#143andiderex/hoersaal#174, both merged, so theshape has been through the checks on those boards rather than through a person.