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.)