Every job has a timeout, and superseded runs for the same branch are cancelled
A hung job holds a runner until the platform’s default timeout expires, which is six hours on GitHub. Queued runs for commits nobody will merge burn the same minutes.
Observable check
every job sets timeout-minutes (GitHub) or timeout (GitLab), and the configuration sets concurrency with cancel-in-progress: true for change-request runs (GitHub) or marks jobs interruptible: true with auto-cancel enabled (GitLab).