ci: run the main full suite continuously, one run at a time
Why
ci-main-full-suite.yml dispatched the full suite on main every 3 hours. Main's full CI has been red since 2026-09-01, and every red run covered up to 3 hours of merges, so nothing pointed at a culprit. PRs are also moving to run only the tests their diff reaches (#14083 and a follow-up). A selection that misses a break has to be caught on main, quickly, and with a narrow commit range.
What
The suite now runs continuously, one run at a time:
- Triggers: a
pushto main dispatches CI on main's HEAD when no full-suite run is in flight. The completion of a full-suite run on main (workflow_run) dispatches the next one on the newest HEAD. The 3-hour schedule stays as a backstop. - Gate:
main_full_suite.py gatewaits while any full-suite run on main is queued or running, for any commit. The existing "this SHA already has a run" check is unchanged. - No double dispatch: the dispatch step holds its concurrency slot until the new run shows up in the runs list, so the next gate sees it in flight instead of dispatching a second one.
A red result now covers only the merges that landed during one run. Issue tracking (report) is unchanged.
Testing
tests/test_ci_main_full_suite.py: 17 pass. New cases: a run in flight for any commit holds the next dispatch, and only full-suite CI runs on main count; thepushtrigger; theworkflow_rundispatch condition; the dispatch wait.- actionlint is clean.
run_python_test_lane.py --lane linux-guardand every.shguard inci-guards.ymlpass.test_dev_fleet_warm_slot.pyand two bundle tests first failed withgit initerrors while the shared/tmpwas over quota, and passed on rerun.
🤖 Generated with Claude Code
Summary by cubic
Runs the main full suite continuously, one run at a time, instead of every 3 hours, so a red result covers only the merges that landed during one run. This is what makes diff-derived test selection on PRs safe: a regression a selection misses shows up on main within one run's worth of merges.
- A push to main dispatches a full-suite run when none is in flight, and each run's completion dispatches the next on the newest HEAD; the 3-hour schedule stays as a backstop.
- The gate holds while any full-suite run on main is queued or running, and holds when the completed run is already at HEAD, so a cancelled run on an idle main cannot re-dispatch; runs stuck for over 6 hours no longer hold, and a failed branch lookup after a completed run leaves the retry to the schedule.
- The dispatch step holds its concurrency slot until a run created after the dispatch is listed, failing the job after 90 seconds, so two gates never both dispatch.
Summary by CodeRabbit
- Chores
- The full test suite now runs when changes are pushed to the main branch, in addition to its existing scheduled and manual runs.
- Full-suite runs are handled one at a time. When a run finishes, the next run uses the latest version of the branch.