Skip to content

docs: re-model branching as experimental/main/release ladder (ADR-0004 amendment) - #320

Merged
ChrisonSimtian merged 1 commit into
mainfrom
docs/branch-model-experimental-lane
May 30, 2026
Merged

docs: re-model branching as experimental/main/release ladder (ADR-0004 amendment)#320
ChrisonSimtian merged 1 commit into
mainfrom
docs/branch-model-experimental-lane

Conversation

@ChrisonSimtian

Copy link
Copy Markdown
Collaborator

What

Amends ADR-0004 (one day old) to invert the channel polarity per @dennisdoomen's feedback on #302: instead of main being the unstable edge channel, a three-tier maturity ladder feeds the production line.

Lane Channel Publishes to
experimental …-alpha (fast/AI, breaking accumulates) GitHub Packages (test)
main …-preview (deliberate trunk, default branch) GitHub Packages (test)
release/YYYY …-rc → GA nuget.org (opt-in) + GH Packages + GH Releases
support/v10, support/YYYY legacy / retired lines nuget.org (opt-in)

GitHub Packages = test/preview; nuget.org = production. Breaking changes land on experimental only; non-breaking work is promoted forward-only experimental → main → release/YYYY. experimental and main share one version core (risky surface rides [Experimental]) so the ladder orders cleanly: -alpha < -preview < -rc < GA. Legacy/retired lines adopt gitflow support/* naming (release/v10support/v10).

Why

Dennis's principle-of-least-surprise point: main should be the stable-ish line newcomers/consumers expect, not the bleeding edge. ADR-0004 originally rejected a dedicated experimental branch (Alternative A) to avoid develop→main divergence; this amendment adopts it because that divergence is bounded in practice (most work is non-breaking and promotes promptly; [Experimental] carries risky surface as non-breaking; promotion is forward-only) — and keeps those divergence-minimising tools.

Scope — docs only

This PR lands the decision + documentation. The mechanics follow in a separate PR + maintainer steps: create experimental, rename release/v10support/v10, relabel main's channel -edge-preview (edge.ymlpreview.yml), add the experimental -alpha workflow, extend validate-ref + the generated CI branch triggers (build/Build.CI.GitHubActions.cs), set per-branch version.json. Until those land, main still publishes -edge (per the ADR rollout-status note). README's live Build-Status table is intentionally unchanged (it links real workflow files).

Files

ADR-0004 (amended in place), branching-and-release.md, release-and-versioning.md, AGENTS.md, CONTRIBUTING.md, README.md (channels blurbs), plus channel-discipline wording in experimental-apis.md / conventions.md / roadmap.md / adr/0001.

🤖 Generated with Claude Code

…4 amendment)

Amend ADR-0004 (one day old) to invert the channel polarity per @dennisdoomen's
#302 feedback: instead of `main` being the unstable edge channel, introduce a
three-tier maturity ladder feeding the production line —

  experimental  -> -alpha    (fast/AI lane, breaking accumulates)  GitHub Packages
  main          -> -preview   (deliberate trunk, default branch)    GitHub Packages
  release/YYYY  -> -rc -> GA   (production line)                     nuget.org (opt-in)
  support/*                    (legacy v10 + retired year lines)     nuget.org (opt-in)

GitHub Packages = test/preview channels; nuget.org = production. Breaking changes
land on `experimental` only; non-breaking work is promoted forward-only
experimental -> main -> release/YYYY. experimental and main share one version core
(breaking surface rides [Experimental]) so the alpha < preview < rc < GA ladder
orders cleanly. Legacy/retired lines adopt gitflow support/* naming
(release/v10 -> support/v10).

Docs only. The branch creation, edge.yml->preview.yml relabel, experimental
-alpha workflow, validate-ref/CI trigger changes, and per-branch version.json land
in a follow-up PR + maintainer steps; until then `main` still publishes -edge (see
the ADR rollout-status note). README's live Build-Status table is left unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisonSimtian ChrisonSimtian added the target/vCurrent Targets the current version label May 30, 2026
@ChrisonSimtian
ChrisonSimtian merged commit ed2b4bc into main May 30, 2026
1 check passed
@ChrisonSimtian
ChrisonSimtian deleted the docs/branch-model-experimental-lane branch May 30, 2026 01:56
ChrisonSimtian added a commit that referenced this pull request May 30, 2026
…hanics) (#321)

Wires up the three-tier ladder documented in #320:

- version.json: main is now 2026.1.0-preview.{height} (was -edge); firstUnstableTag
  preview; publicReleaseRefSpec gains support/\d{4} + support/v\d+ (drops the old
  release/v\d+ now that legacy renames to support/v10).
- edge.yml -> preview.yml: main's channel relabelled -edge -> -preview.
- experimental.yml (new): push to experimental -> -alpha prerelease to GitHub Packages.
- release.yml: validate-ref now matches production branches release/\d{4} +
  support/(v\d+|\d{4}); stale v11 comments refreshed.
- build/Build.cs + Build.CI.GitHubActions.cs: add ExperimentalBranch + SupportBranchPattern
  constants; ubuntu/windows/macos triggers now cover experimental + main + release/* +
  support/*. The three generated workflows regenerated accordingly.
- README Build-Status section + ADR-0004 rollout note updated to match.

On merge, main starts publishing -preview instead of -edge. experimental.yml stays
dormant until the experimental branch is created (a maintainer step, with the
release/v10 -> support/v10 rename + branch protection).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@dennisdoomen

dennisdoomen commented May 30, 2026

Copy link
Copy Markdown
Collaborator

Are you planning to follow GitFlow? If so, release/YYYY is a temporary branch for testing a new version, and then will land on main.

Also, shouldn't we regularly tag commits on main so they land on Nuget (with automatically generated release notes in GH)?

@ChrisonSimtian

Copy link
Copy Markdown
Collaborator Author

Are you planning to follow GitFlow? If so, release/YYYY is a temporary branch for testing a new version, and then will land on main.

Also, shouldn't we regularly tag commits on main so they land on Nuget (with automatically generated release notes in GH)?

yeah makes sense with calver
im playing around a bit with things right now, so stay tuned :-) Might also teach claude/ai how to use the gitflow cli. but I got a pretty fractured kings-birthday weekend, so cant really sit down and bash this out in one sitting at the moment, which is a bit frustrating ... Maybe next week :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

target/vCurrent Targets the current version

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants