CI is queue-bound. Peak concurrency sits at exactly 20 jobs (5 on macOS), which matches GitHub Free's per-account cap. One PR push starts about 69 jobs, about 61 of them in unit-tests.yml. Every timeout in the last two weeks was a throughput problem, not a hang:
- the plain-unittest
protocols leg slowing 10–15× in the tail of test_mh_unit.py (purge_modules without a module-table restore);
apt-get update stalls on 2026-10-01;
- the old 30-minute cap.
A merge queue was probed and rejected for this user-owned repo (422 Invalid rule 'merge_queue').
Approved changes:
- A. Run the unittest leg with
--verbose, and add faulthandler.dump_traceback_later to it.
- B.
util/run_unittest_leg.py snapshots and restores sys.modules around each test.
- C. A step timeout of about 20 min on the unittest run step; apt capped at about 5 min, with one retry.
- D.
pytest-timeout for the pytest jobs.
- E. Fold the 36 engine jobs into about 6, with no loss of coverage.
- F. Create Release skips its full-suite gate when nothing is publishable.
- G. Docs-only PRs run only
tests/project, the changelog check and the Pages build. required-checks accepts skipped legs only in that case.
- H.
unittest-ordering runs on main pushes and on schedule only.
Kept on purpose: the full run on main pushes. Merges land trees that no PR run tested, so that run is the only test of what lands.
CI is queue-bound. Peak concurrency sits at exactly 20 jobs (5 on macOS), which matches GitHub Free's per-account cap. One PR push starts about 69 jobs, about 61 of them in
unit-tests.yml. Every timeout in the last two weeks was a throughput problem, not a hang:protocolsleg slowing 10–15× in the tail oftest_mh_unit.py(purge_moduleswithout a module-table restore);apt-get updatestalls on 2026-10-01;A merge queue was probed and rejected for this user-owned repo (
422 Invalid rule 'merge_queue').Approved changes:
--verbose, and addfaulthandler.dump_traceback_laterto it.util/run_unittest_leg.pysnapshots and restoressys.modulesaround each test.pytest-timeoutfor the pytest jobs.tests/project, the changelog check and the Pages build.required-checksaccepts skipped legs only in that case.unittest-orderingruns onmainpushes and on schedule only.Kept on purpose: the full run on
mainpushes. Merges land trees that no PR run tested, so that run is the only test of what lands.