4.6 KiB
Releasing
How Reasonix ships, who can ship what, and the canary-before-stable flow.
Branch model: trunk + tags
main-v2is the single development line (the v2 / 1.x trunk). Every PR merges here.- Production is a tag, not a branch. A release is a tagged snapshot of
main-v2:v1.4.0(CLI),npm-v1.4.0(npm),desktop-v1.4.0(desktop). v1is the archived 1.0/legacy line — maintenance only.- Hotfix an already-released version by branching from its tag, fixing, and tagging again.
There is no separate "production" or "develop" branch by design — the canary channel provides the pre-release buffer instead of a long-lived branch.
Channels
| Surface | Stable | Pre-release buffer |
|---|---|---|
| npm | latest (current 1.x stable) |
next (rc), canary (npm i reasonix@canary) |
| Desktop | R2 latest/ pointer + release gateway |
R2 canary/ pointer + release gateway proxy (never on the GitHub releases page) |
A canary build is isolated: it never moves latest / next / desktop latest/.
Testers opt in explicitly. (Desktop builds carry -X main.channel=canary; npm versions
ending in -canary.N publish under the canary dist-tag.)
Who can release what
| Action | Who | Mechanism |
|---|---|---|
| Cut a canary | any maintainer (write access) | workflow_dispatch, runs free (open canary environment) |
Ship next / stable |
esengine only | stable publish jobs gate on the release environment — esengine must approve before anything goes public |
So a maintainer can dispatch a canary anytime, but a stable release — even one a
maintainer starts by pushing a tag — pauses in the Actions UI until esengine approves
the release environment deployment.
Repo settings backing this: Environments →
releasehas esengine as a required reviewer;canaryhas none. (Optional hardening: a tag ruleset restrictingv*/npm-v*/desktop-v*creation to esengine, so maintainers can't even start a stable release.)
The release loop
- Develop — PRs land on
main-v2(branch auto-deletes on merge). - Cut a canary before the intended release (e.g. heading for
1.4.0):- Desktop: Actions → Release desktop →
channel: canary,base_version: 1.4.0 - CLI: Actions → Release npm →
base_version: 1.4.0 - Publishes
1.4.0-canary.Nto the desktop R2canary/pointer (no GitHub release) and npm@canary.
- Desktop: Actions → Release desktop →
- Test — testers install
reasonix@canary(CLI) or grab the desktop canary build from its R2 link, and report bugs. - Fix on
main-v2via PRs; re-cut the canary as needed (canary.Nbumps). - Ship stable when the canary is clean — push the three tags:
Each stable run waits for esengine to approve the
git tag v1.4.0 && git push origin v1.4.0 # CLI binaries + Homebrew git tag npm-v1.4.0 && git push origin npm-v1.4.0 # npm -> latest git tag desktop-v1.4.0 && git push origin desktop-v1.4.0 # desktop -> R2 latest/releaseenvironment before publishing. A stablenpm-v*publish moves thelatestdist-tag automatically (build.mjs) and release-npm.yml verifies it landed. Do not skip the npm tag: the stable CLI release (release.yml) fails when the matchingnpm-v*tag was never pushed — that guard exists because 1.0.0–1.17.5 shipped without stable npm tags andnpm update -gsilently downgraded users to 0.53.2 (#5822). A pushed tag whose publish is still awaiting approval only warns; release-npm.yml's verify step owns asserting the dist-tag lands. - Next cycle — the canary rolls on toward
1.5.0.
Notes
- Canary version numbers use the workflow
run_number, so the desktop and CLI canary numbers differ (e.g.canary.11vscanary.2). Only monotonicity per channel matters. - A stable
-rctag (e.g.npm-v1.4.0-rc.1) still ships undernext, notcanary. - Desktop in-app updates use R2 first, then the
crash.reasonix.iodesktop release gateway. The gateway resolves thedesktop-v*release line directly and never uses GitHub's repository-wide/releases/latest, because plainv*tags are the CLI release line. Stable CLI releases also carry a compatibilitylatest.jsonasset so older desktop builds that still use GitHublatestdo not 404. - Canary uses R2 plus the same gateway proxy for the
canary/pointer; it never appears on the GitHub releases page. - Windows and Linux apply downloaded, minisign-verified artifacts in place. macOS applies in-app only for Developer ID signed and notarized builds; ad-hoc/local builds fall back to the download page.