Skip to content

Release the way Cutawan does: changelog-gated, verified, all-or-nothing - #7

Closed
JeremySNR wants to merge 1 commit into
fix/release-pipelinefrom
release/cutawan-process
Closed

JeremySNR wants to merge 1 commit into
fix/release-pipelinefrom
release/cutawan-process

Conversation

@JeremySNR

Copy link
Copy Markdown
Owner

Summary

Brings Cutawan's release process to Metachlorian. Stacked on #6 (which fixes the YAML that stopped every release run); merge that first.

  • One version across core/, app/ and desktop/ (and their lockfiles), set by node scripts/version.mjs x.y.z, which also dates the [Unreleased] changelog section. CI fails if the files drift.
  • Release triggers: a Release vX.Y.Z commit on the default branch, a vX.Y.Z tag, or a manual run. The workflow refuses a version with no CHANGELOG.md notes or a tag that doesn't match.
  • All-or-nothing publish: installers build with --publish never on macOS (arm64), Windows and Linux, upload to a draft, and are verified against their latest*.yml update manifests (size + SHA-512 locally, SHA-256 digests on GitHub) before the release goes public as Latest with the changelog section as notes.
  • Docker image is pushed only after publishing, tagged <version>, v<version> and latest (previously tagged with the branch/tag ref).
  • PR gate: changes to the core, web app, desktop shell, Docker image or dependencies need a CHANGELOG.md line or the no release notes label (now created).
  • macOS builds are ad-hoc signed (desktop/scripts/adhoc-sign-mac.mjs) so downloads don't open as "damaged".
  • CONTRIBUTING.md documents release notes and releasing.

Testing

  • version.mjs: sets all six files, dates the changelog, rejects mismatches and malformed versions.
  • check-release-notes.mjs: passes with notes or the label, fails cleanly without notes.
  • Local electron-builder --arm64 --publish never: app ad-hoc signed (codesign --verify --deep --strict passes), latest-mac.yml produced.
  • verify-release.mjs: passes real mac artifacts plus stand-in win/linux manifests; catches a tampered file and a missing manifest.
  • actionlint clean on both workflows.

Not yet exercised: the Windows/Linux builds and the full publish run, which only run on GitHub.

Not ported: Cutawan's in-app updater / "What's new", its packaged-app smoke check, and winget.

🤖 Generated with Claude Code

- One version across core, web app, desktop and Docker image, set by
  scripts/version.mjs and checked in CI.
- Release from a "Release vX.Y.Z" commit on the default branch or a vX.Y.Z
  tag. The CHANGELOG section for the version is required and becomes the
  release notes.
- Installers build with --publish never, then publish to a draft that only
  goes public once every installer matches its update manifest locally and
  on GitHub. The Docker image is pushed after that, tagged with the version.
- PRs that change the app need CHANGELOG notes or a "no release notes" label.
- macOS builds are ad-hoc signed so downloads don't report "damaged".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JeremySNR
JeremySNR deleted the branch fix/release-pipeline October 13, 2026 12:12
@JeremySNR JeremySNR closed this Oct 13, 2026
@JeremySNR

Copy link
Copy Markdown
Owner Author

Superseded by the new PR against the default branch (this one closed when its base branch was deleted after #6 merged).

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