mobile-release
Skill115 starsChanged 2 months agoMITView on GitHub
Ship an iOS or Android build to testers and stores without reusing a build number or shipping an OTA bundle that crashes on launch. Covers version and build-number policy, code signing done by the project's own tooling, TestFlight / Play internal / Firebase uploads, Maestro on the uploaded build, phased rollout and halt, OTA runtime compatibility, and the store hand-off. Use for any mobile release step ("собери сборку для тестировщиков", "выложи во внутренний трек", "подними номер сборки", "обнови по воздуху", "отправь в стор"). Loaded by release-manager.
5 other projects use a version of this.
Adopted by
Most recently taken up by
- wrsilva/reis-mobiletheir own version, first seen Nov 8, 2026
- SWEStash/swe-workflow-skillstheir own version, first seen Nov 8, 2026
- Kushpawan/kmp-mobile-skillstheir own version, first seen Nov 1, 2026
- nimadorostkar/Claude-Skills-collectiontheir own version, first seen Oct 13, 2026
- RSSNext/Folotheir own version, first seen Oct 8, 2026
Other versions5 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 5
- RSSNext/Folo★ 39ksame name
- nimadorostkar/Claude-Skills-collection★ 37same name
- Kushpawan/kmp-mobile-skills★ 15same name
- wrsilva/reis-mobile★ 8same name
- SWEStash/swe-workflow-skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository39 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- aesthetic-instrumentSkill
- anti-patternsSkill
- anydesignSkill
- archetype-review-baseSkill
- artifact-retentionSkill
- brainstormingSkill
- build-speedSkill
- codex-hostSkill
- committed-aestheticSkill
- cost-modelSkill
- crystallizeSkill
- decision-evalSkill
- deploy-landedSkill
- discoverySkill
- done-blockedSkill
- great_ctoSkill
- lifecycle-messagingSkill
- migration-ready-schemaSkill
- observability-baselineSkill
- opportunity-solution-treeSkill
- outcome-roadmapSkill
- pm-planningSkill
- pre-mortemSkill
- product-economicsSkill
- prose-styleSkill
- quant-validationSkill
- reference-lockSkill
- secrets-rotationSkill
- signing-preflightSkill
- skeptical-triageSkill
- stack-baselineSkill
- test-strategySkill
- ui-ux-pro-maxSkill
- vertical-onboardingSkill
- verticalsSkill
- web-releaseSkill
- well-architectedSkill
The file
We split this skill into the rules it gives an agent
6 rules. 0 are common, 1 is distinctive, and 5 are very specific to this project.
0
Common
Most of the 5 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 30
Read the highest build number the store already has before bumping, not the one in the repo: fastlane latest_testflight_build_number / …
- Very specific: line 35
Commit the bump with the release (chore(release): <version> (<build>)), then build
- Distinctive: line 36
that: commit. A build from an uncommitted bump cannot be traced back.
- Very specific: line 68
Use the project's pinned tool versions (Gemfile.lock → bundle exec fastlane, npx eas-cli@<pinned>), not a global install.
- Very specific: line 79
Before each upload mobile-store-reviewer re-checks policy (permission strings, privacy manifest, IAP).
- Very specific: line 99
Default store-submit: hand-off (PROJECT.md): the agent prepares, the operator presses "Submit for review" / "Start rollout".
“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
mobile-release — the binary testers get is the commit CI checked, signed by tooling, numbered once
A mobile release has three mistakes that cannot be taken back: a build number the store has already seen, a key that left its store, and an update pushed to phones that cannot run it. Everything below exists to make those three impossible, not unlikely.
1. Version and build number
| Field | iOS | Android | Rule |
| Marketing version | CFBundleShortVersionString / MARKETING_VERSION | versionName | from the release (semver), the same on both platforms |
| Build number | CFBundleVersion / CURRENT_PROJECT_VERSION | versionCode | strictly increasing, never reused, set by script |
- Read the highest build number the store already has before bumping, not the one in the
repo:
fastlanelatest_testflight_build_number/google_play_track_version_codes, oreas build:version:get. The repo can be behind a build someone uploaded by hand. - New build number = max(store, repo) + 1. A Play
versionCodethat was uploaded once is burned even if that build was deleted; Play rejects it forever. - Commit the bump with the release (
chore(release): <version> (<build>)), then build that commit. A build from an uncommitted bump cannot be traced back. - Expo with
appVersionSource: remote: EAS owns the counter; do not also edit native files.
2. Signing — through tooling, never by hand
The agent never opens, prints, copies, moves, base64-encodes or uploads a signing key,
keystore, .p8, .p12, .jks, provisioning private key or their passwords. A key that
appears in any output is compromised: stop and follow secrets-rotation.
| Platform | Where the key lives | What the agent runs |
| iOS | fastlane match repo, Xcode automatic signing, EAS credentials | fastlane match <type> --readonly, xcodebuild -allowProvisioningUpdates, eas build |
| Android | Play App Signing (upload key), EAS-managed signing, the CI secret store | ./gradlew bundleRelease with signing config read from env/keystore properties the operator set up |
Allowed metadata checks: security find-identity -v -p codesigning (lists identities, not
keys), keytool -list -v -keystore … only if the operator types the password; apksigner
verify --print-certs on the built artifact. If signing fails, report the tool's error and
stop — do not create, rotate or export credentials; that is the operator's step.
--readonly on match always: a non-readonly run can revoke and recreate certificates for
the whole team.
3. Build
- Build from a clean tree at the commit CI checked (
git status --porcelainempty). The build packs the directory, not HEAD. - iOS:
xcodebuild archive+-exportArchivewith anExportOptions.plistfrom the repo, or the project's fastlane lane, oreas build --platform ios --profile production. - Android:
./gradlew bundleRelease(AAB for Play),assembleReleaseonly for Firebase / direct APK; oreas build --platform android. - Record: artifact path, size, SHA-256, build number, commit.
bundletool dump manifest/PlistBuddyon the artifact proves the number inside equals the number you set. - Use the project's pinned tool versions (
Gemfile.lock→bundle exec fastlane,npx eas-cli@<pinned>), not a global install.
4. Distribute to internal testers (no gate)
| Channel | Command shape | Done when |
| TestFlight internal group | fastlane pilot upload / xcrun altool --upload-app / eas submit -p ios | build shows Processed in App Store Connect, not just "uploaded" |
| Play internal track | fastlane supply --track internal / eas submit -p android | release on internal with this versionCode, status completed |
| Firebase App Distribution | firebase appdistribution:distribute <apk/aab> --groups <internal> | release id returned |
Before each upload mobile-store-reviewer re-checks policy (permission strings, privacy
manifest, IAP). Its BLOCK stops the upload.
5. E2E on the uploaded build
Maestro runs against the build testers got — installed from the TestFlight / Play internal / Firebase artifact on a simulator or device — not a fresh local rebuild. Rebuilding per run costs time and proves a different binary.
- Flows live in the project (
e2e/flows/,.maestro/); run withmaestro test <dir>. - On failure read the per-step screenshots before re-running.
- iOS simulator cannot install a TestFlight build; use the exported
.appfrom the same archive (same build number, same commit) and say so in the report.
6. Beyond internal testers — after gate:release only
External TestFlight groups, Play closed/open/production tracks, App Store submission and any increase of a staged rollout reach real users and are slow or impossible to reverse.
- Prepare: exact command, track, rollout %, release notes per locale, build number.
- Default
store-submit: hand-off(PROJECT.md): the agent prepares, the operator presses "Submit for review" / "Start rollout". Withstore-submit: gatethe agent runs the prepared command aftergate:releaseis approved — never on its own approval. - Phased rollout: start at the project's first stage (Play 1-5 %, iOS 7-day phased). Increase only after crash-free users and the top crash list for this build are read.
- Halt is always allowed without a new gate (
supply --rollouthalt / pause phased release): it restores the approved state. Report it at once.
7. OTA updates (EAS Update, Expo)
An OTA bundle runs on native code that already sits on phones. If the native side changed, the bundle crashes on launch for every user who gets it.
- Refuse an OTA when any native dependency, config plugin, permission or SDK version changed
since the build that owns the target
runtimeVersion:npx expo-updates fingerprint:generate(or@expo/fingerprint) must equal the fingerprint of that build. Mismatch → native build. - Internal channel (
preview,internal): allowed without a gate. - Production channel:
gate:release, plus the fingerprint proof, plus a rollback named (eas update:republishof the previous group, oreas update:rollback). - CodePush is retired; do not propose it.
Report
MOBILE-RELEASE <app> <version> (<build>) @ <commit>
bump : PASS — store max 41 → 42, committed in <sha>
signing : PASS — match readonly / Play App Signing; no key material read
artifact : PASS — app-release.aab sha256 <…>, versionCode 42 inside
upload : PASS — Play internal, completed
e2e : PASS — maestro 12/12 flows on the internal-track build
beyond : HAND-OFF — production 5 % prepared, waiting for gate:releaseA line you could not check is NOT CHECKED with the reason, never omitted.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

