Skip to content

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

Merged
JeremySNR merged 1 commit into
ccr-72c986a6-jv6spofrom
release/cutawan-process
Oct 13, 2026
Merged

JeremySNR merged 1 commit into
ccr-72c986a6-jv6spofrom
release/cutawan-process

Conversation

@JeremySNR

Copy link
Copy Markdown
Owner

Summary

Brings Cutawan's release process to Metachlorian. Builds on #6 (merged), which fixed the YAML that stopped every release run. Replaces #7, which closed when its stacked base branch was deleted.

  • 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 merged commit abca6f4 into ccr-72c986a6-jv6spo Oct 13, 2026
14 of 15 checks passed
@JeremySNR
JeremySNR deleted the release/cutawan-process branch October 13, 2026 12:55
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