From c72e4a73aa907be29bc91fdb173b1dc8c3da2031 Mon Sep 17 00:00:00 2001 From: Bretton <36870434+BrettM86@users.noreply.github.com> Date: Sat, 25 Jul 2026 22:30:56 -0700 Subject: [PATCH] docs(release): record how the two stores' build numbers actually differ Play version codes are global to the app; App Store build numbers are scoped to the version string. The distinction decides whether a number can be reused, and the stores had already drifted (Play 1.0.5+7, App Store 1.0.6+8), so neither can be inferred from the other or from pubspec.yaml. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/deploy/SKILL.md | 21 +++++++++++++++++++-- RELEASING.md | 8 ++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/.claude/skills/deploy/SKILL.md b/.claude/skills/deploy/SKILL.md index cefb8ec..1e37dae 100644 --- a/.claude/skills/deploy/SKILL.md +++ b/.claude/skills/deploy/SKILL.md @@ -48,8 +48,25 @@ cd ios && fastlane latest_builds ``` Repeat the Play query for `internal` and `alpha` if anything might be parked -there. Take the **highest build number seen on any track of either store** and -go above it. +there. + +The two stores do not agree and never have — at the time of writing Play +production was on `1.0.5+7` while the App Store was live on `1.0.6+8`. Read +both; do not infer one from the other. + +The rules differ by platform: + +- **Play**: the version code is global to the app. It must exceed the highest + code on *any* track, full stop. +- **App Store**: `CFBundleVersion` uniqueness is scoped to the + `CFBundleShortVersionString` train. Build 8 under a new `1.1.0` does not + collide with build 8 under `1.0.6`. This is why `latest_builds` reports the + live *version string* and not just the number — the number alone cannot + decide the question. + +Taking the highest build number seen anywhere and going above it is always +safe. Reusing one is only safe on iOS, only under a new version string, and +never on Play. Known non-problems: diff --git a/RELEASING.md b/RELEASING.md index 528b98d..7d0538f 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -68,8 +68,16 @@ backstop, not as an invitation. ```sh cd android && fastlane run google_play_track_version_codes track:production cd android && fastlane run google_play_track_release_names track:production + cd ios && fastlane latest_builds ``` + Check both stores -- they drift apart. Play production was on `1.0.5+7` + while the App Store was live on `1.0.6+8`. Play version codes are global to + the app and must always increase; iOS scopes build numbers to the version + string, so a build number may recur under a new version name (which is why + `latest_builds` reports the live version string too). Going above the + highest number seen anywhere is always safe. + (A track with no releases fails with `undefined method 'flat_map' for nil` rather than returning empty -- that is a fastlane bug, not a permissions problem.) -- 2.51.2