ci(cmux-tui): pin pushes run their daemon tests on their own pool, never the side lane

Merged
TE
15d ago
+110-9

Summary

Cause 1 (a) of the 2026-10-21 CI backlog. The repo-variable check that goes with it is the companion PR into main, linked below.

Every merged PR pushes a cmux-tui-pin-<sha12> branch. Before this change, that push's cmux-next-daemon-tests job fell through to vars.CI_SIDE_LANE_RUNNER (glaeda-side-std-xcode-26.6), so pin daemon tests queued behind PR side lanes and filled them.

The job now gets a pin clause in its runs-on. It comes after the feat daemon and promote clauses and before the side-lane clause, and applies to a manaflow-ai cmux-tui-pin-* push on every attempt:

  1. vars.CI_PIN_DAEMON_POOL, unless it equals the side lane or promotion's daemon pool (CI_NEXT_DAEMON_POOL, else CI_NEXT_PROMOTE_POOL);
  2. otherwise vars.CI_LIGHT_LANE_RUNNER, when the owned pools are on and it is not the side lane;
  3. otherwise blacksmith-6vcpu-macos-15.

The fork gate and inputs.macos_runner still come first. Routing for feat-cmux-next and PRs is unchanged. CI_PIN_DAEMON_POOL joins the owned-pool variables (owned_pool_sources.py, and the regex in the nightly-off-Blacksmith test).

How it lands (claude-sr2's decision): CI_PIN_DAEMON_POOL stays unset, so pins take the light minis. Until lane-host's HQ label for promotion's daemon tests is online, that is the same pool as CI_NEXT_DAEMON_POOL, and the companion check warns about it. After that, CI_NEXT_DAEMON_POOL moves to the new label.

Not covered:

  • A pin push's build legs: their runner is the reusable workflow's macos_runner input, not runs-on.
  • A workflow_dispatch run on a pin ref: it routes as before.

Testing

The tests are in 945c458fc0cd and the fix is in a299616ef2b8. They were run on huge-blue.

Red at 945c458fc0cd: three failures in tests/test_ci_tui_routes_avoid_nightly_label.py and one in tests/test_tui_publish_workflow_security.py's runs-on string test.

Green at a299616ef2b8:

TestResult
tests/test_ci_tui_routes_avoid_nightly_label.py7 of 7
test_ci_fork_runner_routing20 OK
test_ci_side_lane_placement31 OK
test_cmux_tui_publisher_testing11 OK
test_ci_nightly_off_blacksmith9 OK
test_cmux_tui_pin_duplicate_skippass
test_cmux_tui_lane_daemon_testspass

What the new routes tests cover:

  • A pin push goes to the pin pool when it is set and to the light lane when it is unset, on attempts 1 to 3.
  • A guard over 1,152 variable combinations: no runs-on sends a pin push to the side label, and only the light fallback may equal the promotion pool.
  • The state this lands in.

actionlint is clean, and prepush-gate.py reports no new violations.

Observed / Not run

  • Observed: the red and green runs above.
  • Not run:
    • Most of test_tui_publish_workflow_security.py: its other 16 tests need the real cmux-tui/ sources, and they error the same way on red and green.
    • test_ci_owned_pool_sources: it needs both branch refs in a real clone. CI runs both.

Changelog

none

Agent session: cosmic-gray

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Stops cmux-tui-pin-* branch pushes (one per merged pull request) from queuing their daemon tests on the PR side-lane runner, which was filling the lane and causing CI backlogs.

The cmux-next-daemon-tests job now routes pin pushes to vars.CI_PIN_DAEMON_POOL on every attempt. If that pool equals the side lane or the promotion's daemon pool, it falls back to vars.CI_LIGHT_LANE_RUNNER and then to Blacksmith macOS 15. CI_PIN_DAEMON_POOL is registered as an owned pool variable; routing for feat-cmux-next and pull requests is unchanged.

CI_PIN_DAEMON_POOL initially stays unset, so pins take the light minis until promotion's daemon tests get their own label. Tests cover 1,152 variable combinations to guarantee pin pushes never land on the side label.