This repository uses branch-based version maintenance so active development can continue while shipped versions still receive hotfixes.
stablealways represents the next planned release line.- Every shipped version gets its own maintenance branch named
releases/x.y.z. - Release branches only receive fixes that are safe for that shipped version.
- Breaking changes, refactors, and new feature work stay on
stableunless they are intentionally backported. - Each public release is identified by a git tag.
- NuGet publishing automation only runs from
releases/x.y.zbranches, not fromstable.
stable is the forward-looking integration branch.
- Use it for the next feature release or major/minor line.
- Example: while
releases/2.9.9is maintained for hotfixes,stablecan hold the work for3.0.0. - Fixes that apply to both the next release and the current shipped version should usually land on
stableand then be cherry-picked to the matching release branch when safe.
Each release branch preserves the source for one shipped version.
- Create the branch immediately after publishing
x.y.z. - For an active maintenance line, work from the newest shipped patch branch in that line.
- Only put hotfixes, packaging fixes, and other low-risk corrections on that branch.
- Do not merge unrelated
stablework into a release branch. - If a fix starts on a release branch, cherry-pick it back to
stableif the issue also exists there.
Use standard semantic version tags.
- Initial release:
v2.9.9 - First follow-up hotfix release for that line:
v2.9.10 - Second follow-up hotfix release for that line:
v2.9.11
Patch numbers are ordinary integers, not single digits. That means 2.9.10 is the next patch after 2.9.9, not 3.0.0.
- Finish the planned work on
stable. - Publish the release as tag
vX.Y.Z. - Branch from that exact release commit to
releases/X.Y.Z. - Verify the branch name matches the
releases/x.y.zconvention exactly so GitHub automation can detect it. - Continue forward development on
stabletoward the next version.
- Create a short-lived branch from
releases/X.Y.Z, such ashotfix/X.Y.Z/fix-name. - Apply only the fixes intended for that shipped line.
- Open a PR back into
releases/X.Y.Zand merge it after validation. - Bump the version on that release branch to the next patch version by incrementing the patch number normally, such as
2.9.10after2.9.9. - Tag the updated release branch as that new patch version, such as
v2.9.10. - Create
releases/X.Y.(Z+1)from that exact tagged commit so the newly shipped version has its own maintenance branch. - Cherry-pick the merged fix back to
stableif it still applies there, or open a matching PR if adaptation is needed.
Using PRs for hotfixes keeps review history attached to the release line and improves GitHub auto-generated release notes by linking each fix to its PR and author.
- Prefer a dedicated hotfix branch and PR for each maintenance fix.
- Keep hotfix PRs narrowly scoped so release notes stay easy to read.
- Merge hotfix PRs into
releases/x.y.zbefore tagging the next patch release. - Backport the merged change to
stablewith a cherry-pick when possible. - If
stablehas diverged too far for a clean cherry-pick, use a separate PR intostablethat references the release-branch PR.
The NuGet package publish workflow is intentionally tied to release branches.
- Automatic publish only runs for pushes to
releases/**. - Automatic publish only runs when
S1API/S1API.csprojchanges and the<Version>value changes. workflow_dispatchcan be used to rerun the publish workflow manually, but it should be run from the relevantreleases/x.y.zbranch.- A version bump on
stabledoes not publish to NuGet. That is expected. - If a release branch does not exist yet, create
releases/x.y.zfrom the tagged release commit before expecting NuGet automation to run.
Before expecting a NuGet package to publish:
- Confirm the shipped line has a matching
releases/x.y.zbranch. - Confirm the version change is being merged into that release branch, not only into
stable. - Confirm the branch name uses
releases/, notrelease/. - Confirm the publish workflow secrets are configured in GitHub.
- Prefer cherry-picking specific commits instead of merging branches.
- Backport only fixes that are relevant and low risk for the release line.
- Preserve the original commit message when possible so history stays easy to trace.
- If a cherry-pick needs adaptation because
stablehas diverged, keep the behavior equivalent and mention the branch-specific adjustment in the commit body or PR notes.
The current repository state follows this model:
releases/2.9.9holds the shipped2.9.9code line until the next patch in that line ships.- If a hotfix release is published from that line, tag it as
v2.9.10and then createreleases/2.9.10from that exact release commit. stableis already moving toward3.0.0.- Fixes that still matter to both lines can be cherry-picked between the two branches as needed.
At the time this policy was written:
stableandreleases/2.9.9diverge fromv2.9.9.stablecontains forward-looking3.0.0work that should not be merged wholesale into the2.9.9maintenance branch.releases/2.9.9contains hotfix-oriented commits suitable for selective cherry-picking.
This keeps maintenance releases isolated while allowing ongoing development to move ahead without blocking urgent fixes.