- the every-2-hours cron spent a full packaged-app build 12x/day just to tick;
remove it and rely on the existing path-gated push trigger plus dispatch
- release-readiness now accrues its consecutive-clean streak from push/dispatch
runs rather than the clock; fire workflow_dispatch a few times before a
release if the streak is short
- split the single windows e2e job into parallel jobs: gate (pure-node
selftests, no build), verify (build + verify-all), playwright (build +
renderer suite). verify and playwright run concurrently so wall-clock is
max(verify, playwright), not their sum
- build the UNPACKED app on the gate path (electron-builder --dir via a new
-DirOnly switch in build-app-win.ps1), skipping the ~2min NSIS LZMA
compression. verify-all drives win-unpacked\OpenSwarm.exe; afterPack +
locale paks still run in the pack phase, and verify-update-feed skips
cleanly when no installer feed is present
- cache the heavy build inputs (bundled Python env, uv, MCP bundles) + npm
across runs, keyed on their source manifests; the build script already skips
any input already on disk, so warm builds are fast
- move the destructive installer cycle to its own job gated off routine pushes
(runs on PR-to-main / dispatch; release-windows.yml covers v* tags)
- apply the same caching to dogfood (shares cache keys, so the two warm each other)
- the customInstall macro runs `OpenSwarm.exe --prewarm` via nsExec::Exec,
which is synchronous with no upper time bound. On a clean box the silent
install launches the freshly-extracted, not-yet-signed binaries, provoking a
cold Windows Defender scan that stalls for minutes - this hung the CI
installer-verification step (no output for ~3m, then cancelled)
- both CI verification and production auto-updates run the installer with /S,
so this same stall could hang a real user's auto-update
- gate the prewarm behind ${If} ${Silent} ... ${Else}: interactive first-time
installs (where the cold-start win lands) still prewarm; silent installs skip
it and finish promptly
- verify-installer: keep the blocking spawnSync (it must wait for the registry
uninstall entry the gate checks) but add a 300s timeout so any future
synchronous stall fails the gate in minutes instead of hanging the job
- modes test: replace expect.fail() (not a Playwright API, threw TypeError)
with annotate+skip when a clean profile has no edit-or-create entry point
- theme x toggle matrix: clicking Dark/Light updates the settings draft, so
Save before asserting localStorage flips; conditional Save handles the
already-that-mode case
- both were hidden until the dashboard-precondition fix unblocked the serial
chain past them; full suite passes locally now
- skip the bare /Users/runner and /home/runner homes and the literal
"runner" username: they collide with third-party embedded paths and the
english word "runner" everywhere, burying real leaks in noise
- the precise /Users/runner/work + D:\a\openswarm work-dir patterns still
catch a genuine leak from those accounts
- e2e + dogfood matrices are now windows-latest only: GitHub's scarce mac
runners left the macos legs perpetually queued/starved and they surfaced
mac-only failures untriageable from the Windows dev box, so the whole
matrix read red
- remove the now-dead macOS build steps; re-add macos-14/macos-13 (matrix
edit + workflow_dispatch) when a Mac maintainer can own them
- gate the expensive build on artifact-affecting paths only (electron,
frontend, backend, e2e, build+ci scripts) plus PRs to main + dispatch;
cheap hermetic gates still run on every push
- verify-release-readiness defaults to --require win32 so the removed darwin
leg does not block every v* tag forever