Skip to content

feat(versioning): mint 3.<minor>.<run> — SemVer minter flip (stacked on #6208) - #6209

Merged
rbuergi merged 5 commits into
feat/platform-semverfrom
feat/platform-semver-minter
Oct 7, 2026
Merged

rbuergi merged 5 commits into
feat/platform-semverfrom
feat/platform-semver-minter

Conversation

@rbuergi

@rbuergi rbuergi commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

The minter flip for policy platform-semver-versioning. This is step 4 of the migration in Doc/Architecture/PlatformVersioning. It is stacked on #6208 (the readers), and its base is feat/platform-semver. Retarget it to main once #6208 has merged.

🚧 DRAFT: do not merge while the fleet drain and rolls are in flight, and not before ALL of these:

  1. feat(versioning): read the SemVer notation 3.<minor>.<run> as one lineage (readers first) #6208 is merged and running on every portal, control included. Without that reader, a portal ranks 3.1.N below every 3.0.0-ci.* and never rolls.
  2. The MeshWeaver.Plugins readers have landed and rolled to control: SelfUpdateRouting.BuildOrder, RollGates, ImageLine, InstanceComposition (3.* / 3-latest), ModuleInventoryContent, the freeze regexes, platform-requirement.py, mesh-floors.py, and the ci.yml floor-stamp gate.
  3. Every Systemorph/Memex mesh/Deployments/*.json updatePattern reads 3.*, and the overlays' SelfUpdate__DefaultPattern and seeds (3-latest) match. Otherwise every Continuous install freezes on its last 3.0.0-ci set. VersionSelectTest.TheOldFleetPattern_NeverSelectsTheNewNotation pins this.
  4. The maintainer has decided open decisions 1 and 2. Settled conservatively (see "Decisions taken" below); no longer a blocker.

Undraft when: items 1 to 3 are all true and no roll is in flight. These are ordering prerequisites, not open questions. Undrafting arms auto-merge, and merging before 2 and 3 freezes every Continuous install on its last 3.0.0-ci set.

Decisions taken (maintainer can override)

Recorded in Doc/Architecture/PlatformVersioning §6 (shared with #6208). Each one takes the conservative option.

  1. Stable keeps following deliberately cut releases. Run-numbered tags never enter Stable (feat(versioning): read the SemVer notation 3.<minor>.<run> as one lineage (readers first) #6208, VersionSelect).
  2. release.yml keeps promoting and renames nothing. Implemented here, as described below.
  3. The minor is bumped only by a merged PR that edits PlatformVersion, in practice the next-line PR release.yml opens after a release (3.1.0 → 3.2.0). This PR is that kind of edit (3.0.0 → 3.1.0).

What it changes

  • Directory.Build.props: PlatformVersion changes from 3.0.0 to 3.1.0.
    • The CI Version becomes <major>.<minor>.<GITHUB_RUN_NUMBER> (3.1.10050). The local version becomes <major>.<minor>.0-ci.0, which every reader treats as ordinal 0.
    • CD already reads the version with -getProperty:Version -p:CIRun=true, so image tags, MESHWEAVER_PLATFORM_VERSION and package versions follow without any workflow change.
    • feat(versioning): read the SemVer notation 3.<minor>.<run> as one lineage (readers first) #6208's platform-version.py makes arm phase D and control-first move 3-latest and 3.1-latest. 3.0.0-latest freezes on the last old-notation set.
  • AssemblyVersion is pinned to <major>.0.0.0, so it stays 3.0.0.0 and a minor bump never moves the runtime binding identity (policy platform-backwards-compatibility). FileVersion and InformationalVersion follow the line (3.1.0).
  • PlatformVersionSchemeGuard is rewritten for the SemVer shapes and evaluated through real MSBuild. It includes a binding-identity case and a control arm (a labelled line, and run number 0 under CI).
  • edge-images.yml needs no change: a version without a ci segment falls through to <v>-edge.<run>.

Verification (local, Release -warnaserror, 0 warnings / 0 errors)

  • dotnet msbuild -getProperty:Version gives 3.1.0-ci.0 locally, 3.1.10050 with -p:CIRun=true -p:GITHUB_RUN_NUMBER=10050, 3.1.0 with PublicRelease, and 3.1.0 with run number 0 (which the guard rejects). AssemblyVersion is 3.0.0.0, and the compiled AssemblyInfo was confirmed after the rebuild.
  • MeshWeaver.Documentation.Test: 48/48 passed (scheme guard, CompiledVersionAttributes, CdImageLeg, ModuleSyncDecision, topic map). The reader tests still pass on top of this change: Graph 83/83, Portal 240/240.

Verification of this update (merged origin/main and #6208's head; Release -warnaserror, 0 warnings / 0 errors)

  • Plugin.Packaging, Memex.Portal.Shared, Documentation, Graph.Test, Memex.Portal.Shared.Test and Documentation.Test: Graph 83/83, Portal 240/240, Documentation 123/123 (scheme guard, CompiledVersionAttributes, CdImageLeg, ModuleSyncDecision, bake-lane, armed-merge, publish-signal and topic/policy/link guards).
  • msbuild -getProperty: Version = 3.1.0-ci.0 locally and 3.1.10050 under CIRun + run 10050; AssemblyVersion = 3.0.0.0.
  • Self-tests green: test-release-promotes-both-notations.py, platform-version.py, arm-promoted-set.py, resolve-platform.py (218), test-gate-lane-forwards-the-callers-set.py. Workflow guards green: shell, timeouts, yaml keys, permission pairing, runners, PR secret preflight.

release.yml in the new notation (decision 2)

  • v3.0.0 keeps promoting the newest 3.0.0-ci.<run> set of its commit, unchanged.
  • From line 3.1, v<major>.<minor>.0 promotes the newest <major>.<minor>.<run> set of its commit, chosen by run number through platform-version.py. It adds the clean tag and renames nothing. A non-zero patch (v3.1.5) is refused, because on that line it is a CD run's version. A set from another line, an old-notation build, and the withdrawn slip 3.1.0-ci.7841 are all refused. (Main's release.yml would currently promote that slip under v3.1.0.)
  • In the new notation the release moves no -latest pointer in ACR or GHCR. CD's arm already moved 3-latest/3.<minor>-latest to the set or past it, so a release-side move could only go backwards. GHCR latest still follows releases. The old notation is unchanged.
  • New: .github/scripts/test-release-promotes-both-notations.py, wired into dotnet-test.yml. It cuts the real step text out of release.yml and runs it against stubbed registry listings: 6 era cases and 9 set cases. Negative control: against main's release.yml it fails (no era decision, the new-notation sets are refused, and the slip is accepted).

Not covered here

  • MeshWeaver.Plugins portal-ai-image.yml:300-313 mints its own -ci. version (step 5).

Pairs-with: none: no public type or member is removed.

🤖 Generated with Claude Code

… flip

Minter half of policy `platform-semver-versioning` (Doc/Architecture/PlatformVersioning, step 4).
Stacked on the readers change; must not merge before every portal runs those readers AND every
Hosting/Deployment record's updatePattern admits 3.* (Memex), else Continuous installs freeze.

- PlatformVersion 3.0.0 -> 3.1.0. CI Version = <major>.<minor>.<GITHUB_RUN_NUMBER> (3.1.10050);
  local Version = <major>.<minor>.0-ci.0 (ordinal 0). CD reads it via -getProperty:Version, so
  images, MESHWEAVER_PLATFORM_VERSION and packages follow; arm moves 3-latest / 3.1-latest.
- AssemblyVersion pinned to <major>.0.0.0 (stays 3.0.0.0): a minor bump never moves the
  runtime binding identity (policy platform-backwards-compatibility).
- PlatformVersionSchemeGuard rewritten for the SemVer shapes, through real MSBuild, with a
  control arm (labelled line, run number 0).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Test Results

0 tests  ±0   0 ✅ ±0   0s ⏱️ ±0s
0 suites ±0   0 💤 ±0 
0 files   ±0   0 ❌ ±0 

Results for commit 8706066. ± Comparison against base commit ed97c7a.

♻️ This comment has been updated with latest results.

rbuergi and others added 3 commits October 7, 2026 11:42
…s the newest <major>.<minor>.<run> set

Decision 2 of Doc/Architecture/PlatformVersioning §6 (policy platform-semver-versioning):
release.yml keeps promoting and renames nothing. v3.0.0 still promotes 3.0.0-ci.<run>; from
line 3.1 a release is v<major>.<minor>.0 and promotes the newest <major>.<minor>.<run> set of
its commit, read by platform-version.py. A non-zero patch on the new line, another line's set,
an old-notation build and the withdrawn slip 3.1.0-ci.7841 are refused. In the new notation
the release moves no -latest pointer (CD's arm already did; a release move could only go
backwards); GHCR latest still follows releases.

test-release-promotes-both-notations.py executes the real step text against stubbed registry
listings (6 era + 9 set cases), wired into dotnet-test.yml; it fails against main's release.yml.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@rbuergi
rbuergi marked this pull request as ready for review October 7, 2026 16:34
@meshweaver-cloud

Copy link
Copy Markdown
Contributor

Auto-merge was not armed. This pull request targets feat/platform-semver, not the default branch main — a non-default base has no branch protection and therefore no required contexts, so arming it would merge it immediately, before its own CI runs. Merge it by hand when you are ready, or retarget it at main to have it armed normally.

@systemorph-com

systemorph-com Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

The control plane does not arm auto-merge on this pull request: its base 'feat/platform-semver' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand.

PR babysitter — posted once per head; see ReviewFindingsAnswered.md → "The arm gate".

@systemorph-com

systemorph-com Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

The control plane does not arm auto-merge on this pull request: its base 'feat/platform-semver' is not the default branch 'main' — an unprotected base merges the moment it is armed (#1685), so merge it by hand.

PR babysitter — posted once per head; see ReviewFindingsAnswered.md → "The arm gate".

@rbuergi
rbuergi merged commit 7daecb6 into feat/platform-semver Oct 7, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant