ci(stable-next): fix what the first nights found (Chromium keychain, soak, perf bun, suite watchdog)
The cmux NEXT Stable pipeline (#27898) is live: main's tick dispatched a publish run on nightly-next each night from 2026-10-31. Every run failed, so no stable build has shipped. This fixes the four defects the runs exposed in the pipeline itself.
What changes
- UI tests on the signed app: the fresh test home has no login keychain. Chromium's first Safe Storage read put up a "Keychain Not Found" system dialog and held its pages, so the Chromium step failed on macOS 26 and 27 (
shot-04-chromium.png, run 41419773317). WebKit loaded behind the dialog. A real install has a keychain.- The journey now launches the app with
CMUX_MOCK_KEYCHAIN=1.CEFSwitcheshonours it in release builds, and it also turns the password import off, so the throwaway home stores nothing real. fresh_home_launch_smoke.pygains anEXTRA_ENVhook. It is empty for the nightly launch smoke, which is therefore unchanged.
- The journey now launches the app with
- UI tests, terminal step: the step compared shown-tab counts. New Tab from Home opens a new workspace with one tab, so the count stays 1. The step now needs the tab the action made to be the selected tab in a shown pane. The echo step right after it was already passing in that same terminal.
- Soak: it required the build to still be on the cmux NEXT feed. That feed keeps 2 builds, so newer nightlies dropped the picked one before the gates ended (
refused: build 4141347814401 is not on the cmux NEXT feed). It now checkspulled.jsonand the canary verdict only, throughstable_next.py soak. - perf-budgets: the perf build makes the web bundles and needs bun 1.4.4 (
error: the cmux-next web bundles need bun 1.4.4). Addedsetup-bun, ascmux-next-perf-budgets.ymlhas. - Swift suites: CmuxNextAppTests runs for about 15 minutes on a GUI mini. The lane's 900 s per-suite watchdog cut it off every night (
stalled/timeout 908s). The per-suite limit is now 2400 s, and the job limit 240 min.
Not in this PR: the other suite failures on the nightly commits (ClassicUpgradeSimulationTests, WindowCleanupCoverageTests, PaletteRootMenuTests, CEFRendererPathsTests, …). These are tests failing on the shipped code, not pipeline defects, and stable correctly refuses those builds.
Observed / Not run
- Ran:
python3 tests/test_stable_next.pypasses 21 tests, including the new soak tests. A build off the feed passes; a pulled or failed build is refused.tests/test_fresh_home_launch_smoke.py(13) passes.- An env check confirmed that the nightly smoke's
fresh_envhas noCMUX_MOCK_KEYCHAIN, while the journey's does. - These also pass: actionlint,
test_ci_runs_on_fallback,test_ci_macos_xcode_selection,test_ci_fork_runner_routing,test_ci_upload_artifact_retention,test_supplychain_security,test_ci_owned_pool_rescue.
- Dry run on this head (
stable-next-dry-run): the link is in a comment below once it runs. - Not run: a real publish, which happens only on
nightly-next.
Performance
No perf numbers: CI pipeline only, no app code.
Changelog
none
🤖 Generated with Claude Code
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.
Summary by cubic
Fixes the five pipeline defects that made every nightly cmux NEXT stable publish run fail, so stable builds can ship again.
- Launches the UI test app with
CMUX_MOCK_KEYCHAIN=1so Chromium doesn't block on a missing-keychain dialog in the fresh test home; the nightly launch smoke is unchanged. - The terminal step now requires the tab created by New Tab to be selected in a shown pane, instead of comparing shown-tab counts (New Tab from Home opens a new workspace with one tab).
- The soak gate no longer requires the build to still be on the cmux NEXT feed, which keeps only 2 builds; it checks
pulled.jsonand the canary verdict only, and fails closed on an unreadablepulled.json. - The soak check runs again right before the feed write, so a rollback during the gates still stops the publish.
- Installs bun 1.4.4 via
setup-bunfor the perf budgets job, which builds the web bundles. - Raises the per-suite Swift watchdog from 900 s to 2400 s and the job timeout from 150 to 240 min.
Not covered
- The remaining nightly suite failures (ClassicUpgradeSimulationTests, WindowCleanupCoverageTests, and others) are tests failing on the shipped code, not pipeline defects.