Mobile Store-Readiness Audit + Pre-Submission Plan
Degree of freedom: HIGH — inventory A–E, score rejection risk, emit a plan.
Stay plan-only. No manifest, Data Safety, or listing edits until approved.
This skill vs neighbors
| Skill |
Owns |
| plan-mobile-readiness (this) |
Store submission mechanics |
plan-aso |
Listing keywords / conversion |
plan-privacy-compliance |
Privacy labels vs real collection |
Role: Senior mobile release engineer + store-compliance specialist.
Task: Inventory build/config/listing against checklist A–E, map gaps to store
guidelines, phase remediations, emit plan-mobile-readiness.md. Audit & plan only —
no manifest, Data Safety, or listing edits until approved.
Catch the rejections before the reviewer does. Change nothing until approved.
How to reason (every plan item)
- Propose — privacy manifest, usage string, demo account, build, or listing fix
- Risk — first-pass rejection or Guideline 2.5.2 thin-app block
- Keep-working — platforms/items that already match store rules
- Phase — Privacy → Functionality → Payments+build → Listing (do not execute)
Worked example
Propose: add PrivacyInfo.xcprivacy for required-reason APIs; align Play Data Safety with the AdMob SDK.
Risk: first-pass rejection — missing privacy manifest + Data Safety ↔ permission mismatch.
Keep-working: iOS usage-description strings already present for camera/photos.
Phase: Phase 1 — Privacy (blocking).
Store: iOS 5.1.2 / Play Data Safety; demo account still required in Phase 2 if login-gated.
About 25% of App Store submissions are rejected on first pass — mechanical,
pre-detectable causes: missing privacy manifests, Data Safety ↔ permission mismatches,
no demo account, placeholder buttons, crashes on older devices, stale target API.
Apple blocks prompt-to-app builders under Guideline 2.5.2 — the thin web-view
rejection vibe-coded apps trip constantly.
When this fires
Trigger phrases: "is my app store-ready", "will Google Play reject this",
"pre-submission check", "privacy manifest", "data safety form", "app store
rejection", "about to submit my app".
Do not fire for: runtime perf (mobile-rn-performance), screen polish
(mobile-rn-screen), or general UI (enhance-capacitor-ui). This owns submission
compliance and rejection-risk.
The audit [HIGH freedom]
A · Privacy (#1 modern rejection class)
- iOS privacy manifest —
PrivacyInfo.xcprivacy, required-reason APIs, SDK manifests.
- Usage-description strings — every sensitive API has
NS*UsageDescription.
- App Tracking Transparency — before ad/tracking SDK calls.
- Android Data Safety — matches actual permissions and SDK collection.
- Third-party SDK disclosure — analytics/ad SDKs in Data Safety.
- Privacy policy URL — live, public, matches collection.
B · Functionality & completeness (2.5.2 / thin-app)
- Placeholder / TODO UI — cross-hand to
plan-stub-checker.
- Too thin / web-view-only — Guideline 2.5.2 risk; flag honestly.
- Demo account — login-gated apps need working creds in review notes.
- Every advertised feature works.
C · Payments
- IAP via store billing — digital goods through StoreKit/Play Billing, not external links.
- IAP products approved and tested with sandbox accounts.
D · Technical / build
- Target API level — meets current store minimum.
- Build format & signing —
.aab, release-signed, 64-bit, no debuggable.
- Crash on older devices — emulator-only testing isn't enough.
- Android closed-testing gate — 12 testers / 14 days before production.
E · Listing & metadata
- Screenshots/icon match build; metadata limits; content rating/CSAE.
Procedure [HIGH freedom — plan only]
- Inventory Capacitor/RN config, manifests, permissions, listing, IAP.
- Run A–E, map to guidelines. Blocking vs Risk.
- Score & order by likelihood × launch-delay cost.
- Phase — privacy + functionality first.
- Emit
plan-mobile-readiness.md. End the turn.
Guardrails
- Plan only. No manifest, Data Safety, or listing edits.
- Declaration must match reality — both ways.
- Be honest about thin-app / 2.5.2 risk.
- Never advise external payment for digital goods.
- Verify current target-API thresholds at submit time.
- Real devices, not emulators only.
Self-critique before the burndown [LOW freedom — do not skip]
- evidenced-not-assumed — manifests, permissions, and listing fields you actually read
- plan-only — no PrivacyInfo, Data Safety, or metadata edits
- severity/phase justified — privacy + 2.5.2 before listing polish
- right-owner — keywords/screenshots →
plan-aso; collection-vs-claimed → plan-privacy-compliance; receipt/restore → audit-monetization-iap; placeholders → plan-stub-checker
- no-false-safety — do not hide Guideline 2.5.2 thin-app risk; declaration must match reality both ways
Report template — plan-mobile-readiness.md
# Mobile Store-Readiness Audit — <app>
_Audit-only. Pre-submission. Nothing changes until each phase is approved._
## Scope
- Platform: iOS ☐ Android ☐ | Framework: Capacitor ☐ RN ☐
## Verdict
| Area | Blocking | Risk | Worst item |
|------|----------|------|-----------|
| Privacy | n | n | Data Safety mismatch |
| Functionality | n | n | 2.5.2 thin-app |
## Findings
| # | Item | Store | Guideline | Blocking? | Direction |
|---|------|-------|-----------|-----------|-----------|
## Phased burndown
- **Phase 1 — Privacy** → `mobile-capacitor-platform`
- **Phase 2 — Functionality & 2.5.2** → `plan-stub-checker` / `enhance-capacitor-ui`
- **Phase 3 — Payments & build** → `mobile-capacitor-platform`
- **Phase 4 — Listing & testing gate** → metadata, Android closed-test
## Execution handoff
Real older devices + IAP dry-run before submit.
Chains with
- Launch gates loop — mobile submission; pair with
plan-aeo-readiness for web.
plan-privacy-compliance — collection-vs-claimed + store privacy labels.
plan-aso — listing keywords/screenshots after the app is submittable.
audit-monetization-iap — receipt validation / restore (not just "uses official billing").
plan-stub-checker — placeholders are rejections on mobile.
- Execution:
mobile-capacitor-platform, enhance-capacitor-ui,
mobile-emulator-test (then real device).
- Verify: real-device crash test + IAP dry-run; Android closed-test gate satisfied.
Plan with a strong model; execute with composer-2.5-execution.mdc.
1---2name: plan-mobile-readiness3description: Plan-only App Store/Google Play submission audit for Capacitor/React Native: manifests, permissions, privacy forms, signing/config, listing prerequisites. Use when "ready for App Store?", "will Google Play reject this?", or "pre-submission check". Native security → plan-capacitor-hardening.4license: MIT5---67# Mobile Store-Readiness Audit + Pre-Submission Plan89**Degree of freedom: HIGH** — inventory A–E, score rejection risk, emit a plan.10Stay **plan-only**. No manifest, Data Safety, or listing edits until approved.1112## This skill vs neighbors1314| Skill | Owns |15|---|---|16| **plan-mobile-readiness** (this) | Store submission mechanics |17| `plan-aso` | Listing keywords / conversion |18| `plan-privacy-compliance` | Privacy labels vs real collection |192021**Role:** Senior mobile release engineer + store-compliance specialist.2223**Task:** Inventory build/config/listing against checklist A–E, map gaps to store24guidelines, phase remediations, emit `plan-mobile-readiness.md`. **Audit & plan only —25no manifest, Data Safety, or listing edits until approved.**2627**Catch the rejections before the reviewer does. Change nothing until approved.**2829## How to reason (every plan item)30311. **Propose** — privacy manifest, usage string, demo account, build, or listing fix322. **Risk** — first-pass rejection or Guideline 2.5.2 thin-app block333. **Keep-working** — platforms/items that already match store rules344. **Phase** — Privacy → Functionality → Payments+build → Listing (do not execute)3536## Worked example3738> **Propose:** add `PrivacyInfo.xcprivacy` for required-reason APIs; align Play Data Safety with the AdMob SDK.39> **Risk:** first-pass rejection — missing privacy manifest + Data Safety ↔ permission mismatch.40> **Keep-working:** iOS usage-description strings already present for camera/photos.41> **Phase:** Phase 1 — Privacy (blocking).42> **Store:** iOS 5.1.2 / Play Data Safety; demo account still required in Phase 2 if login-gated.4344About **25% of App Store submissions are rejected on first pass** — mechanical,45pre-detectable causes: missing privacy manifests, Data Safety ↔ permission mismatches,46no demo account, placeholder buttons, crashes on older devices, stale target API.47**Apple blocks prompt-to-app builders under Guideline 2.5.2** — the thin web-view48rejection vibe-coded apps trip constantly.4950---5152## When this fires5354Trigger phrases: *"is my app store-ready"*, *"will Google Play reject this"*,55*"pre-submission check"*, *"privacy manifest"*, *"data safety form"*, *"app store56rejection"*, *"about to submit my app"*.5758Do **not** fire for: runtime perf (`mobile-rn-performance`), screen polish59(`mobile-rn-screen`), or general UI (`enhance-capacitor-ui`). This owns *submission60compliance and rejection-risk*.6162---6364## The audit [HIGH freedom]6566### A · Privacy (#1 modern rejection class)67- **iOS privacy manifest** — `PrivacyInfo.xcprivacy`, required-reason APIs, SDK manifests.68- **Usage-description strings** — every sensitive API has `NS*UsageDescription`.69- **App Tracking Transparency** — before ad/tracking SDK calls.70- **Android Data Safety** — matches actual permissions and SDK collection.71- **Third-party SDK disclosure** — analytics/ad SDKs in Data Safety.72- **Privacy policy URL** — live, public, matches collection.7374### B · Functionality & completeness (2.5.2 / thin-app)75- **Placeholder / TODO UI** — cross-hand to `plan-stub-checker`.76- **Too thin / web-view-only** — Guideline 2.5.2 risk; flag honestly.77- **Demo account** — login-gated apps need working creds in review notes.78- **Every advertised feature works.**7980### C · Payments81- **IAP via store billing** — digital goods through StoreKit/Play Billing, not external links.82- **IAP products approved** and tested with sandbox accounts.8384### D · Technical / build85- **Target API level** — meets current store minimum.86- **Build format & signing** — `.aab`, release-signed, 64-bit, no debuggable.87- **Crash on older devices** — emulator-only testing isn't enough.88- **Android closed-testing gate** — 12 testers / 14 days before production.8990### E · Listing & metadata91- **Screenshots/icon match build**; metadata limits; content rating/CSAE.9293---9495## Procedure [HIGH freedom — plan only]96971. **Inventory** Capacitor/RN config, manifests, permissions, listing, IAP.982. **Run A–E**, map to guidelines. **Blocking** vs **Risk**.993. **Score & order** by likelihood × launch-delay cost.1004. **Phase** — privacy + functionality first.1015. **Emit `plan-mobile-readiness.md`. End the turn.**102103---104105## Guardrails106107- **Plan only.** No manifest, Data Safety, or listing edits.108- **Declaration must match reality — both ways.**109- **Be honest about thin-app / 2.5.2 risk.**110- **Never advise external payment for digital goods.**111- **Verify current target-API thresholds at submit time.**112- **Real devices, not emulators only.**113114## Self-critique before the burndown [LOW freedom — do not skip]1151161. **evidenced-not-assumed** — manifests, permissions, and listing fields you actually read1172. **plan-only** — no PrivacyInfo, Data Safety, or metadata edits1183. **severity/phase justified** — privacy + 2.5.2 before listing polish1194. **right-owner** — keywords/screenshots → `plan-aso`; collection-vs-claimed → `plan-privacy-compliance`; receipt/restore → `audit-monetization-iap`; placeholders → `plan-stub-checker`1205. **no-false-safety** — do not hide Guideline 2.5.2 thin-app risk; declaration must match reality both ways121122---123124## Report template — `plan-mobile-readiness.md`125126```markdown127# Mobile Store-Readiness Audit — <app>128129_Audit-only. Pre-submission. Nothing changes until each phase is approved._130131## Scope132- Platform: iOS ☐ Android ☐ | Framework: Capacitor ☐ RN ☐133134## Verdict135| Area | Blocking | Risk | Worst item |136|------|----------|------|-----------|137| Privacy | n | n | Data Safety mismatch |138| Functionality | n | n | 2.5.2 thin-app |139140## Findings141| # | Item | Store | Guideline | Blocking? | Direction |142|---|------|-------|-----------|-----------|-----------|143144## Phased burndown145- **Phase 1 — Privacy** → `mobile-capacitor-platform`146- **Phase 2 — Functionality & 2.5.2** → `plan-stub-checker` / `enhance-capacitor-ui`147- **Phase 3 — Payments & build** → `mobile-capacitor-platform`148- **Phase 4 — Listing & testing gate** → metadata, Android closed-test149150## Execution handoff151Real older devices + IAP dry-run before submit.152```153154---155156## Chains with157158- **Launch gates loop** — mobile submission; pair with `plan-aeo-readiness` for web.159- **`plan-privacy-compliance`** — collection-vs-claimed + store privacy labels.160- **`plan-aso`** — listing keywords/screenshots after the app is submittable.161- **`audit-monetization-iap`** — receipt validation / restore (not just "uses official billing").162- **`plan-stub-checker`** — placeholders are rejections on mobile.163- **Execution:** `mobile-capacitor-platform`, `enhance-capacitor-ui`,164 `mobile-emulator-test` (then real device).165- **Verify:** real-device crash test + IAP dry-run; Android closed-test gate satisfied.166167> Plan with a strong model; execute with `composer-2.5-execution.mdc`.