release-and-store-shipping

Enforces Flutter release builds, signing, store declarations, and staged rollouts for Play and App Store.

Updated Aug 22, 2026
One-click install
npx skills add https://github.com/zakariaf/NearlyStop --skill release-and-store-shipping-zakariaf
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: release-and-store-shipping
Source: https://github.com/zakariaf/NearlyStop/tree/main/.claude/skills/release-and-store-shipping
Command: npx skills add https://github.com/zakariaf/NearlyStop --skill release-and-store-shipping-zakariaf

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill includes scripts (resource) and references (resource) components.

What problem does it solve? Shipping a Flutter app fails in ways CI never catches: reused build numbers, debug-signed artifacts, lost obfuscation symbols, permissions injected by transitive plugins, and store declarations that contradict the code. This Skill enforces the full path from a green CI run to a verified, staged store release. ## Core Features & Use Cases - Release hygiene gates: Runs check-release-hygiene.sh to catch tracked keystores, malformed version: x.y.z+N, debug signing configs, and debug affordances reachable in shipped code, plus check-ipa-slices.sh to reject IPAs containing simulator slices before upload. - Ordered release ritual: A 10-step sequence covering version bumping in pubspec.yaml, obfuscated builds with per-build symbol archives, real-hardware verification of the exact artifact, size and cold-start budgets, and staged rollout with a written halt criterion. - Store declaration reconciliation: Asserts the merged Android permission set and iOS NS*UsageDescription keys whole, keeps Play Data Safety, nutrition labels, and PrivacyInfo.xcprivacy provable in the repo, and reads store-side state (price, availability, IAPs, screenshots) back before submission. - Use Case: Before tagging release 1.4.0+42, run the hygiene script, build the appbundle and IPA with --obfuscate --split-debug-info, archive symbols off-machine, install the artifact over the previous release on a real device, then upload to the internal track and start a staged rollout. ## Quick Start Ask the assistant to run the release hygiene checks and walk through the ordered release ritual for the next Flutter build before uploading to Play or TestFlight.

Frequently Asked Questions about release-and-store-shipping

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I build a Flutter release for Google Play and the App Store?

Bump `version: x.y.z+N` in pubspec.yaml, then run `flutter build appbundle --release --obfuscate --split-debug-info=<dir>` and the equivalent `flutter build ipa` command. Archive the symbol directory off-machine before uploading, and verify the exact artifact on real hardware.

Why does Apple reject my Flutter IPA with error 90087 or 91169?

The IPA contains a simulator slice because the tree was last built for the simulator, often after a screenshot run. Thinning the binary cannot fix it; run `flutter clean`, rebuild the IPA, and verify slices with the check-ipa-slices.sh script before uploading.

Can I reuse a build number after a failed Play or App Store upload?

No. A published or even failed upload burns that versionCode or CFBundleVersion permanently, and stores reject reused or lower numbers. Always increment the `+N` build number in pubspec.yaml rather than retrying with the same one.

How do I audit Android permissions added by Flutter plugins?

Build the release bundle and inspect the merged manifest, not your source AndroidManifest.xml, since transitive plugins inject permissions. Strip unwanted ones with `tools:node="remove"` and diff the merged set against a committed expected-permission list in CI.

Why does StoreKit return zero products for my in-app purchase?

An inactive Paid Applications Agreement makes StoreKit return no products, presenting as a broken purchase button rather than a missing agreement. The account holder must activate the agreement in App Store Connect; no API can do it.

What happens if I lose the Dart obfuscation symbols for a release?

That release's crash stack traces become permanently unreadable, because symbols are unique to the exact build and regenerating them produces different output. Archive `symbols/<x.y.z>+<N>/` off-machine alongside the artifact before every upload.