With the upcoming potential migration to cirrus runners (#32989) we need a way to periodically check for a silent merge conflict. Cirrus CI currently does this every week.
This is part of a proposal that will look for a label on a PR as a trigger to run the lint and get_previous_releases test. This label could be added manually or better, Drahtbot could periodically add (and remove) this label.
An example of this running on a test org: https://github.com/testing-cirrus-runners/bitcoin/actions/runs/16780213204/job/47516540034
Updated 4th March 2026
In this design there is a new GHA job merged into the main repo that adds check runs to each PR on whether they have a silent merge conflict or not.
The idea is that we have a job that pretty much runs 24/7 triggered every 6 hours or so and set to run for 5.5 hours, it could be set to run on a GHA runner rather than a Cirrus runner. Obviously running on a Cirrus runner (or even multiple runners) would dramatically speed up how many PRs can be checked for silent merge conflicts.
The job uses the Github checks API to add a passing or failing test run to each PR directly. The silent merge check job itself should always pass, it writes pass or fail checks to the PRs.
It will look through all open PRs and discard anything that has a git merge failure or a failing test with the thinking that there is no point checking something that can’t be merged anyway. Then it will select PRs that have not had a silent merge check and one by one pull the merge branch of the PR and the full CI job “Previous releases” on that branch.
When all PRs have been checked it will then re-check a PR that was checked the longest time ago.
Things that can be tweaked:
Could run on multiple runners simultaneously rather than just one How long the job is allowed to run for (currently 5.5 hours, GHA runners have a limit of 6) How frequently the job is triggered What type of runner to run the job on The ordering of how to select the next PR to check. What things trigger the job to skip a PR (currently failing tests and merge conflicts) Some back of the envelope maths with the “Previous Releases” job taking 10/15 minutes with a primed cache on a Cirrus runner and 300 open mergeable PRs (probably overestimate) the job would be checking each PR roughly every 4 days.