The deadline moved to now.
GitHub says full enforcement of its new self-hosted runner minimums begins September 29, 2026 for GitHub Enterprise Cloud. Runners below version 2.329.0 will no longer register or reregister. A separate, higher minimum controls whether an existing runner may execute workflow jobs.[1]
That split matters. Registration and execution are different gates. A runner can remain registered while its ability to take work expires. GitHub Enterprise Server is not part of this change. GitHub Enterprise Cloud with Data Residency began enforcement on July 31.[1]
Do not use "registered" as a synonym for "ready to run the next job."
Do not hard-code the second floor.
GitHub added an organization API that accepts a runner version and returns two fields: registration_deprecates_at and runtime_deprecates_at. The endpoint is GET /orgs/{org}/actions/runners/deprecations/{version}. It requires organization admin access.[2]
The September 28 notice names the registration floor but describes the execution floor only as higher. That is a reason to query the supported endpoint for every installed version. It is not an invitation to guess one fleet-wide number.
Latest is not the same as available.
The public runner repository lists v2.337.0 as its latest release. It was published August 26. The release notes also say the runner follows a progressive release policy, so the newest public release may not yet be offered to every enterprise, organization, or repository.[3]
Use the download instructions shown inside the target GitHub account as the available-version witness. Pin the package digest you actually install. The public release page publishes SHA-256 checksums for each platform package, but this dispatch did not download or execute those packages.
Automatic update still needs an alarm.
GitHub's monitoring guide says the runner application updates itself. The same guide tells operators to check that process because runners below a version threshold cannot process jobs. Update activity appears in Runner_ and SelfUpdate files under the runner's _diag directory.[4]
An auto-updater is a mechanism, not evidence. Alert on its failures. Keep the installed version in inventory. Preserve diagnostic logs outside ephemeral runners. Treat a successful canary workflow as the release check.
Move one runner before moving all of them.
- List each runner name, installed version, operating system, architecture, labels, runner group, and current job.
- Query the registration and runtime deadline for each distinct installed version.
- Drain one representative runner. Save its current package, service configuration, labels, and diagnostic logs.
- Install the version offered by the target account. Verify its package digest.
- Run a canary workflow that exercises the tools, containers, network routes, and labels that production jobs need.
- Roll out in bounded batches. Keep capacity for jobs while each batch drains, upgrades, and returns.