release-artifact-checklisted
Install: claude install-skill DomenicMoran/verified-done
# Read the artefact, not the source tree
Deleting a file from the source tree does not remove it from the build output.
Gradle keeps a generated resources directory; asset pipelines keep caches;
bundlers keep prior chunks. An asset you removed weeks ago can still ship.
The same applies to version numbers. They frequently live in more than one
place, and the one you edited may not be the one that ends up in the artefact.
## Before every upload
1. **List what is actually inside.**
```bash
# Android
unzip -l app-release.aab | head -50
unzip -l app-release.apk | grep -i "res/drawable" | head -30
```
```bash
# iOS
unzip -l App.ipa | head -50
```
2. **Read the version out of the artefact**, not out of your editor.
```bash
# Android: needs build-tools on PATH
aapt2 dump badging app-release.apk | head -3
```
```bash
# iOS
unzip -p App.ipa "Payload/*.app/Info.plist" \
| plutil -extract CFBundleShortVersionString raw -
```
3. **Grep for anything you believe you removed.** If it is still in the
artefact, the source tree is not the whole story.
4. **Check the platform metadata your store validates.** Missing keys fail at
upload time, minutes after a long build, with an opaque code. A framework
dependency shipping an `xcframework` without `MinimumOSVersion` is a common
source of `ITMS-90530` and `ITMS-90360`.
## Version numbers hide in more than one file
Check every location before assuming the bump took:
-