Repository navigation
fix(release): make MARKETING_VERSION the only version, and gate it in both pipelines - #267
Merged
Merged
Conversation
… both pipelines PR #266 bumped only apps/macos/Config/Shared.xcconfig to 1.13.4, so the three Rust crates, the "=<version>" pins between them, and Cargo.lock all stayed at 1.13.3. CI on main fails closed with: CodeVetter CLI qualification failed: CLI version mismatch: expected "codevetter 1.13.4", received "codevetter 1.13.3" This is the third occurrence. 72b6b60 fixed the identical drift at 1.13.0 by hand-bumping and cutting forward as 1.13.1. That patched the instance, not the cause: the version still lived in four hand-edited places, so the next cut that touched one of them reintroduced it. Red CI is the lucky symptom. 72b6b60 explicitly recorded the dangerous one and left it open: core:qualify-cli, which compares the built CLI's --version against MARKETING_VERSION, runs only in ci.yml and never in the release qualification path. A drifted cut could therefore sign, notarize, staple, and publish an app whose bundled codevetter and codevetter-mcp companions reported the previous version, with every release gate green. scripts/sync-native-version.mjs makes MARKETING_VERSION the single source of truth and derives everything else: CURRENT_PROJECT_VERSION (major*10000 + minor*100 + patch, the encoding every release since 1.11.1 has used), the three crate versions, the sibling "=<version>" pins, and the Cargo.lock entries. It rewrites only what it owns -- the [package] version rather than every dependency's version key, and pins keyed on a path = "../codevetter-*" sibling so third-party exact pins like rmcp's "=2.2.0" are untouched. It fails closed on a crate missing from the lockfile instead of silently skipping it. pnpm version:check is wired into ci.yml, before lint, where it reports the bump that caused the problem in about a second instead of the CLI symptom three minutes in; and into native-production-qualification.yml before signing, which closes the gap above so drift costs seconds rather than a notarization round trip. 12 tests cover the encoding, the selective rewrites, drift detection, and idempotence. The crate bump in this commit is the script's own output, and is byte-identical to what 72b6b60 did by hand. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
sarthakagrawal927
force-pushed
the
fix/version-single-source
branch
from
September 6, 2026 12:53
717531f to
9a144d6
Compare
This was referenced Sep 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes the red CI on
mainand closes the recurring release-pipeline bug behind it. Follow-up to #253 / SAR-52.The immediate break
#266 bumped only
apps/macos/Config/Shared.xcconfigto 1.13.4. The three Rust crates, the=<version>pins between them, andCargo.lockstayed at 1.13.3, so CI onmainfails closed:Why a script instead of another hand-bump
This is the third occurrence.
72b6b60bfixed the identical drift at 1.13.0 by hand-bumping and cutting forward as 1.13.1 — it patched the instance, not the cause. The version lived in four hand-edited places, so the next cut that touched one of them brought it straight back.Red CI is the lucky symptom.
72b6b60brecorded the dangerous one in its own commit message and left it open:core:qualify-cliruns only inci.yml, never in the release qualification path. A drifted cut could sign, notarize, staple, and publish an app whose bundledcodevetterandcodevetter-mcpreported the previous version — with every release gate green.The change
scripts/sync-native-version.mjsmakesMARKETING_VERSIONthe single source of truth and derives the rest:CURRENT_PROJECT_VERSION—major*10000 + minor*100 + patch, the encoding every release since 1.11.1 has used[package]versions=<version>pinsCargo.lockentriesIt rewrites only what it owns: the
[package]version rather than every dependency'sversionkey, and pins keyed on apath = "../codevetter-*"sibling so third-party exact pins like rmcp's"=2.2.0"are untouched. A crate missing from the lockfile fails closed rather than being silently skipped.pnpm version:checkis wired into both pipelines:ci.yml, before lintnative-production-qualification.yml, before signingVerification
pnpm test:version-sync— 12 tests: encoding, selective rewrites, third-party pins left alone, lockfile fail-closed, drift detection, idempotencepnpm lint,pnpm knip:strict— cleanpnpm version:check— reports drift onorigin/main(exit 1), clean after sync (exit 0)The crate bump here is the script's own output, byte-identical to what
72b6b60bdid by hand.Note on the version
Deliberately stays at 1.13.4 rather than cutting forward. The
v1.13.4release is still a draft with zero assets, so the tag is not yet spent — unlike the 1.13.0 case, where the release was already public and 1.13.1 was the only way out.🤖 Generated with Claude Code