ci(nightly-next): register the post-publish launch smoke on main (not a publish gate)

Merged
TE
10d ago
+350-0

This puts the cmux NEXT post-publish launch smoke (manaflow-ai/cmux#26723) on main. A schedule and a workflow_dispatch register only from the default branch.

This is not a smoke gate. Publishing never waits on it. Leo, 2026-10-23: "we want no smoke tests. No smoke tests, okay? Or at least, like, you know, previously we had the daemon with a smoke test literally block the entire nightly release, right? Like, that's unacceptable."

After a build is on the cmux NEXT feed, the workflow launches it from a fresh home.

  • pass: nothing happens.
  • cannot-run: nothing happens.
  • crash (on both attempts, with the harness's evidence that the app launched): it dispatches nightly-next-rollback.yml with bad_build and if_newest, so the feed serves the earlier Nightly build it keeps. It also files one issue per build with the evidence.

So a launch crash like 0c83363 never stays on the feed for more than one smoke run.

Changes

  • .github/workflows/nightly-next-launch-smoke.yml: the same file as on feat-cmux-next.
  • scripts/ci/owned_pool_rescue.py: the workflow is added to SIDE_WORKFLOW_PATHS. Its Mac job takes an owned Mac's side label on attempt 1, so the sweeper re-runs a refused job; Blacksmith macOS comes after. This is the same as nightly-next-canary.yml.

Tests

These pass on this branch: test_ci_owned_pool_rescue, test_ci_owned_pool_sources, test_ci_runs_on_values, test_ci_no_github_hosted_macos, test_ci_workflow_run_sources, test_runner_label_policy, test_ci_fork_runner_routing and test_ci_self_hosted_guard.sh. The behaviour tests (tests/test_nightly_next_launch_smoke.py) live with the code in #26723.

No new secrets. The crash job's permissions (actions: write, issues: write, contents: read) are the ones nightly-next-rollback.yml already uses.

Agent session: agent session

🤖 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

Puts the cmux NEXT post-publish launch smoke on main so its schedule and dispatch register, without making it a publish gate. Runs take their smoke tooling from feat-cmux-next; a PR into feat-cmux-next tests its own head.

  • Every 10 minutes the workflow launches the feed's newest build from a fresh home; a crash on both attempts dispatches nightly-next-rollback.yml and files one issue per build with the crash evidence. The dispatch carries if_newest, so the rollback re-checks the build is still the newest and never pulls a build published meanwhile.
  • Passes are cached per build; a cannot-run is cached only for the rest of its UTC hour; a crash is never cached, so it is retried until its rollback lands.
  • Schedule and dispatch runs get a concurrency group of their own so a waiting run is never replaced; only a PR's runs share a group, per PR.
  • If the tooling ref lacks scripts/ci/nightly_next_launch_smoke.py (a PR into main before feat-cmux-next lands), nothing is judged: no rollback, no verdict cache, so the build is smoked once the tooling lands.
  • Adds the workflow to SIDE_WORKFLOW_PATHS in scripts/ci/owned_pool_rescue.py so its Mac job takes an owned Mac's side label on attempt 1, matching nightly-next-canary.yml, and exempts the same job from the Xcode floor pin since it builds nothing.

Summary by CodeRabbit

  • Chores
    • Nightly builds are checked for valid feed entries, successful downloads, and launches on macOS. Results and smoke-test evidence are recorded.
    • Scheduled checks skip builds that passed previously or could not be tested during the current UTC hour. Smoke tests retry once after a qualifying failure; crashes are not cached.
    • For non-pull-request runs, a crash can trigger a rollback request if the build is still newest, and creates or updates a tracked issue. Pull-request checks do neither.