This document defines the XYML release model beginning with 1.0.0.
1.0.0is the first stable version under this model.- Historical development snapshots, tags, and changelogs keep the release model and version meaning they originally used. They are not renamed or reinterpreted.
- The unreleased
3.17.0stable test artifact has one deliberately narrow migration exception: it may recognize1.0.0stable as an update. This is not a general version epoch or compatibility adapter, and no other3.x -> 1.xtransition is implied. - Every version component is written in decimal. Hexadecimal, Base64, and other radices are not used.
The number of decimal components identifies the release channel.
| Channel | Format | Example | Audience |
|---|---|---|---|
| Stable | x.y.z |
1.0.0 |
General users |
| Beta | x.y.z.b |
1.0.0.1 |
Unselected volunteers |
| Alpha | x.y.z.b.a |
1.0.0.0.1 |
Selected testers |
| Dev | x.y.z.b.a.d |
1.0.0.0.0.1 |
Developers and early verification |
The first three components describe the scale of a stable change:
xchanges for a large architectural rewrite.x.ychanges for a feature release.x.y.zchanges for bug fixes and small adjustments.
The additional b, a, and d counters identify beta, alpha, and dev candidates based on that stable line. Each promotion chooses a new version for the target channel; a version is never promoted by merely truncating its trailing components.
Decimal comparison remains chronological when target counters are advanced correctly. A normal patch candidate can progress as follows:
1.0.0 < 1.0.0.0.0.1 < 1.0.0.0.1 < 1.0.0.1 < 1.0.1
stable dev alpha beta stable
For example, beta 3.17.0.1 normally lands in stable 3.17.1, not stable 3.17.0. If an emergency fix advances stable to 3.17.1 first, the candidate may first appear in stable 3.17.2. The stable version is selected when the beta is actually promoted, based on both its changes and the then-current stable version.
A patch that promotes Beta to main or publishes a Stable hotfix must update stableVersion in
config/project.properties to the selected stable version. The subsequent main -> beta -> alpha -> dev
synchronization must carry that stable baseline to every release branch.
| Branch | Channel | Role |
|---|---|---|
main |
Stable | Generally available releases and emergency fixes |
beta |
Beta | Public testing by unselected volunteers |
alpha |
Alpha | Testing by a selected group |
dev |
Dev | Default branch for feature and fix integration |
GitHub's default branch should be dev. Feature and fix branches start from dev and merge back into dev after their focused tests pass.
flowchart LR
F["Feature or fix branch"] --> D["dev"]
D -->|"--no-ff promotion"| A["alpha"]
A -->|"--no-ff promotion"| B["beta"]
B -->|"--no-ff promotion"| S["main / stable"]
H["hotfix/*"] -->|"--no-ff promotion"| S
S -. "forward sync" .-> B
B -. "forward sync" .-> A
A -. "forward sync" .-> D
Every merge toward a more stable channel must use git merge --no-ff, including hotfix/* -> main. This preserves the tested candidate boundary as an explicit merge commit. After a stable hotfix or promotion, synchronize main -> beta -> alpha -> dev one adjacent branch at a time. Do not rebase or force-push shared release branches.
The release-policy workflow validates adjacent branch flow before merge and audits the resulting promotion commit after merge. Repository rules must also allow merge commits for release PRs; a post-merge audit can detect, but cannot retroactively prevent, a squash or rebase merge.
Update frequency increases from Stable to Beta, Alpha, and Dev.
| Channel | Github Release | Official website | Feedback entry |
|---|---|---|---|
| Stable | Published | Published | Public |
| Beta | Not published | Published | Public |
| Alpha | Not published | Not published | Restricted testing program |
| Dev | Not published | Not published | Restricted testing program |
Only Stable artifacts are published through Github Release. The official website publishes Stable and Beta artifacts. Alpha and Dev artifacts are not distributed publicly, and reports for those channels are accepted only through the restricted testing program. The public bug form is reserved for current Stable and Beta releases.
The build accepts these release inputs:
RELEASE_CHANNEL: exactlystable,beta,alpha, ordev.RELEASE_VERSION: an explicit complete decimal version used for a promotion.BUILD_NUMBER: the final positive decimal component used for an ordinary CI build whenRELEASE_VERSIONis absent.STABLE_VERSION: an optional override ofstableVersioninconfig/project.properties.
Official builds reject missing or malformed release inputs. Local builds default to a six-component Dev snapshot such as 1.0.0.0.0.SNAPSHOT.
The Github Release publishing workflow runs only from main. It creates a Stable release and updates only the Stable
channel descriptor; it does not publish Beta, Alpha, or Dev releases. Official-website distribution follows the table
above.