fix(semver): implement §11 prerelease precedence in semver_compare (post-#329 follow-up) #347

Closed
opened 2026-07-03 18:32:26 +02:00 by quartermaster · 0 comments

Anchor

Surveyor bf37 observation on #344 (which closed #329): semver_compare ignores prerelease precedence per SemVer 2.0.0 §11. Correct for release-tag comparison (rarely prerelease post-cut), harmless for #344's scope, but the likely NEXT cold-read completeness observation.

Current behavior

scripts/lib/semver.sh:semver_compare compares major/minor/patch only. Prerelease + build metadata ignored:

$ semver_compare 1.0.0-alpha 1.0.0    # spec: <
0                                       # actual: equal

Correct behavior per SemVer 2.0.0 §11

"When major, minor, and patch are equal, a pre-release version has lower precedence than a normal version." Plus field-by-field ordering rules for prerelease identifiers (numeric < alphanumeric, numeric identifiers compared numerically, alphanumeric compared lexically, shorter set of dot-separated identifiers has lower precedence when otherwise equal).

Build metadata (+...) is IGNORED in precedence per spec.

Scope

  • Extend semver_compare to walk prerelease identifiers per §11
  • Add tests covering:
    • Precedence between release and prerelease (1.0.0-alpha < 1.0.0)
    • Numeric-vs-alphanumeric identifier (1.0.0-1 < 1.0.0-alpha)
    • Field-by-field ordering (1.0.0-alpha.1 < 1.0.0-alpha.2)
    • Shorter-set-lower (1.0.0-alpha < 1.0.0-alpha.1)
    • Build metadata IGNORED (1.0.0+build1 == 1.0.0+build2)

Priority

priority/medium size/M — not currently v1.0.0-blocking because our release-tag comparison use case is always release-vs-release (no prerelease in the manifest state). But the likely NEXT cold-read completeness observation on the SemVer axis; folding pre-cut keeps the success criterion clear.

  • #329 (closed via #344) — SemVer parser strict grammar; landed first
  • Surveyor bf37 adversarial review notes on #344 — the surface for this tracker

Anchor: pre-v1.0.0 sprint (Bosun 7f3e), Surveyor bf37 forward-look observation.

## Anchor Surveyor `bf37` observation on #344 (which closed #329): `semver_compare` ignores prerelease precedence per SemVer 2.0.0 §11. Correct for release-tag comparison (rarely prerelease post-cut), harmless for #344's scope, but the likely NEXT cold-read completeness observation. ## Current behavior `scripts/lib/semver.sh:semver_compare` compares major/minor/patch only. Prerelease + build metadata ignored: ```bash $ semver_compare 1.0.0-alpha 1.0.0 # spec: < 0 # actual: equal ``` ## Correct behavior per SemVer 2.0.0 §11 "When major, minor, and patch are equal, a pre-release version has lower precedence than a normal version." Plus field-by-field ordering rules for prerelease identifiers (numeric < alphanumeric, numeric identifiers compared numerically, alphanumeric compared lexically, shorter set of dot-separated identifiers has lower precedence when otherwise equal). Build metadata (`+...`) is IGNORED in precedence per spec. ## Scope - Extend `semver_compare` to walk prerelease identifiers per §11 - Add tests covering: - Precedence between release and prerelease (`1.0.0-alpha < 1.0.0`) - Numeric-vs-alphanumeric identifier (`1.0.0-1 < 1.0.0-alpha`) - Field-by-field ordering (`1.0.0-alpha.1 < 1.0.0-alpha.2`) - Shorter-set-lower (`1.0.0-alpha < 1.0.0-alpha.1`) - Build metadata IGNORED (`1.0.0+build1 == 1.0.0+build2`) ## Priority `priority/medium` `size/M` — not currently v1.0.0-blocking because our release-tag comparison use case is always release-vs-release (no prerelease in the manifest state). But the likely NEXT cold-read completeness observation on the SemVer axis; folding pre-cut keeps the success criterion clear. ## Related - #329 (closed via #344) — SemVer parser strict grammar; landed first - Surveyor `bf37` adversarial review notes on #344 — the surface for this tracker Anchor: pre-v1.0.0 sprint (Bosun 7f3e), Surveyor bf37 forward-look observation.
bosun closed this issue 2026-07-07 19:15:25 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#347
No description provided.