- 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)
- 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
Workflow's new-branch fallback fell through to a full repo scan whenever
merge-base with main equaled HEAD (empty range). That re-flagged every
historical secret a prior PR had already cleared. Now: empty range means
nothing new to scan, log + exit clean. Genuine no-shared-history case
still falls through to full scan.