Build number is present and incremented for each release
Why it matters
Both Apple and Google reject any binary whose build identifier is missing, non-integer, or less-than-or-equal to a previously shipped build for the same version string — the upload fails with ITMS-90062 on iOS or a duplicate-versionCode error on Play Console, blocking the release outright. Without a monotonically incrementing build number, TestFlight cannot route the correct artifact to internal testers, Play Console staged rollouts lose their ordering, and crash reports merge across builds so regressions become untraceable. This is an operational tripwire that delays launches by hours every time it fires.
Severity rationale
Low at the code level because fixes are mechanical, but each missed increment costs a full submission round-trip.
Remediation
Declare ios.buildNumber as a string and android.versionCode as an integer in app.json, then automate monotonic increments in CI so human error never ships a duplicate. Store the last-shipped build in a lockfile or release-notes table and fail the build if the new value does not exceed it.
// app.json
{
"expo": {
"version": "1.0.3",
"ios": { "buildNumber": "42" },
"android": { "versionCode": 42 }
}
}
DetectionPro
The detection method for this pattern is part of AuditBuffet Pro.
The full method (what to look for, pass and fail conditions, and how results get reported) ships inside the App Store Readiness Audit. The pattern definition, severity rationale, and remediation remain openly licensed under CC-BY-4.0.
Taxons
History
- 2026-04-18·v1.0.0·Initial import from mobile-store-readiness·automated