ci: run the main full suite continuously, one run at a time

Merged
TE
23d ago
+274-48

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 push to 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 gate waits 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; the push trigger; the workflow_run dispatch condition; the dispatch wait.
  • actionlint is clean.
  • run_python_test_lane.py --lane linux-guard and every .sh guard in ci-guards.yml pass. test_dev_fleet_warm_slot.py and two bundle tests first failed with git init errors while the shared /tmp was 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.