Skip to content

Harden the release pipeline and close review findings - #7

Merged
anibalribeiro merged 22 commits into
mainfrom
review-fixes
Sep 4, 2026
Merged

Harden the release pipeline and close review findings#7
anibalribeiro merged 22 commits into
mainfrom
review-fixes

Conversation

@anibalribeiro

Copy link
Copy Markdown
Owner

Summary

  • Release pipeline: malformed/empty appcasts fail the job; non-release versions cannot become latest; tests gate signing; drafts publish atomically with appcast last; signing identity and zip notarization are asserted; create-dmg installs before the key is imported; CI permissions, pinned blocking linters, and queue: max so a third tag cannot drop a pending release.
  • Product: arm64-only is documented and asserted; Speed raises the top scroll speed and hostile values no longer trap; button-up follows what the matching down did; scheduled Sparkle updates badge the menu bar (and re-show a hidden icon while pending); Restore Defaults is derived from the preference declarations.

Test plan

  • swift test (52 tests) and shellcheck -x -s sh scripts/*.sh / actionlint on the PR’s lint job
  • First CI run of the new Ubuntu lint job (digest-pinned curl install has never executed on ubuntu-latest locally)
  • After merge, watch the next tagged release: draft → zip/dmg → appcast → publish; APPLE_TEAM_ID must match the imported cert
  • Manual: middle-click / double middle-click pairing; toggle back/forward off mid-hold with trigger-on-release; hide menu bar icon then (when an update is pending) confirm the icon returns until dismissed
  • Homebrew tap still needs a one-time depends_on arch: :arm64 in Casks/winmice.rb (documented in docs/releasing.md)

Made with Cursor

Anibal Ribeiro and others added 22 commits September 4, 2026 13:33
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Fixes two defects found in review of 0c11c95:

- gh release upload uploads its arguments concurrently, so the prior
  single-call upload of zip+dmg+appcast guaranteed no ordering. On the
  clobber path, where the release is already live, this could publish
  a new appcast pointing at a zip that had not finished uploading yet,
  or lose all three assets outright on a failed --clobber upload. Split
  into two sequential gh release upload calls: zip+dmg, then appcast.

- gh release edit --draft=false only ran on the create path. A run that
  died between creating the draft and publishing it left the release
  stranded as a draft forever: gh release view resolves drafts, so the
  next re-run took the clobber path, uploaded fresh assets, and never
  published it. The draft flip now runs unconditionally on both paths,
  after the uploads, and re-asserts --prerelease when PRERELEASE=true
  rather than assuming gh release edit leaves the flag alone -- which
  also restores the flag on a hand-promoted release's own re-run.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The gentle-reminder path is verified by code inspection against Sparkle's
headers rather than by a live update.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@anibalribeiro
anibalribeiro merged commit d452dff into main Sep 4, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant