You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Version number and tag semantics for the first stable release #980
Parent map: #973. Decide the first stable tag (v1.0.0 vs v0.2.0 vs other), whether the last betas before it are v1.0.0-beta.N, and how release-tag.sh / check-release-tag.sh / promote-release.sh map tags to the two channels (stable, beta). Confirm the daemon's upgrade resolver picks the highest stable, never a pre-release.
v0.1.2-beta.41 (ployz2, last)
│ cutover to getployz/ployz
▼
v0.2.0-beta.1 … N ──► v0.2.0 first stable — the stable promise starts
│ later 0.x releases keep the promise
▼
v1.0.0 once users have validated it; semver, may break
First stable tag is v0.2.0. 1.0 is reserved for after real-user validation.
Betas before it are v0.2.0-beta.N. The v0.1.2-beta line ends at .41.
Betas are cut in getployz/ployz after the cutover. The compiled release sources (ployzd installer, CLI bootstrap, install.sh) switch to getployz/ployz as part of the cutover, so no daemon covered by the promise ever points at ployz2. The cutover therefore happens before v0.2.0-beta.1.
Promise range: from 0.2.0 through every later 0.x release. Versioning follows semver: 1.0 may break (probably won't), and must say so if it does. Recorded in core/DESIGN.md → Stable promise.
Tag → channel mapping (release-tag.sh is unchanged): vX.Y.Z → stable, vX.Y.Z-beta.N → beta; every other suffix is rejected.
Pointers only move forward.promote-release.sh advances a pointer only when the published tag is higher by semver, so an older-line fix never moves stable backwards and stays reachable by exact pin. This is what makes stable "the highest stable": the resolver stays a single pointer read with no GitHub listing.
beta = max(latest beta, latest stable). A stable Publish also advances beta when it is higher.
Upgrading through a channel never downgrades.stable/beta keep the installed daemon when it is higher than the pointer; only an exact version moves a Machine backwards. (Today replacement_required replaces whenever the versions differ.)
Never a pre-release from stable: guaranteed by 5 and 6 (the pointer only ever receives stable tags). The resolver also rejects a pre-release read from stable, as a defensive check.
Crossing a breaking release through a channel: decided when 1.0 is known to break. At that point ployz.sh/stable can stay on the 0.x line for 0.x daemons and 1.0 can get a new pointer name. It is not needed before then.
Findings this corrected: the resolver reads the ployz.sh/<channel> pointer and does not pick the highest version, and the pointer was "last published". machine init/add install the CLI's own version (CARGO_PKG_VERSION), not a channel.
Activity
nick-potts commentedon Sep 24, 2026
Resolution
v0.2.0. 1.0 is reserved for after real-user validation.v0.2.0-beta.N. Thev0.1.2-betaline ends at.41.getployz/ployzafter the cutover. The compiled release sources (ployzdinstaller, CLI bootstrap,install.sh) switch togetployz/ployzas part of the cutover, so no daemon covered by the promise ever points atployz2. The cutover therefore happens beforev0.2.0-beta.1.core/DESIGN.md→ Stable promise.release-tag.shis unchanged):vX.Y.Z→stable,vX.Y.Z-beta.N→beta; every other suffix is rejected.promote-release.shadvances a pointer only when the published tag is higher by semver, so an older-line fix never movesstablebackwards and stays reachable by exact pin. This is what makesstable"the highest stable": the resolver stays a single pointer read with no GitHub listing.beta= max(latest beta, latest stable). A stable Publish also advancesbetawhen it is higher.stable/betakeep the installed daemon when it is higher than the pointer; only an exact version moves a Machine backwards. (Todayreplacement_requiredreplaces whenever the versions differ.)stable: guaranteed by 5 and 6 (the pointer only ever receives stable tags). The resolver also rejects a pre-release read fromstable, as a defensive check.ployz.sh/stablecan stay on the 0.x line for 0.x daemons and 1.0 can get a new pointer name. It is not needed before then.Findings this corrected: the resolver reads the
ployz.sh/<channel>pointer and does not pick the highest version, and the pointer was "last published".machine init/addinstall the CLI's own version (CARGO_PKG_VERSION), not a channel.Implementation belongs to Keep only stable and beta Release Channels (6–9) and Cut over to getployz/ployz (3).
check-release-tag.shalso drops its SDKpackage.jsoncheck under the cleanup spec.