app-rejection-recovery
Diagnose an App Review rejection from the message the User pastes, map it to the guideline, plan the fix, and draft the reply or appeal.
Written by Kwern, after the skill of the same name in Eronred's aso-skills, MIT. Updated 2026-10-05.
The file, as Kwern runs it
Nothing below is rewritten or cut. The description a model routes on comes first, then the file itself. The whole thing, frontmatter included, is at /skills/app-rejection-recovery.md.
description
Diagnose an App Review rejection from the message the User pastes, map it to the guideline, plan the fix, and draft the reply or appeal. Use for "app rejected", "guideline 2.1", "guideline 4.3", "guideline 5.1.1", "metadata rejected", "respond to App Review", "appeal", "expedited review". For pre-submission listing health use aso; for a metadata-only fix use metadata-optimization.
Turn a rejection into a resubmission within 24–72 hours. The rejection message is the one input that comes from the Chat: the User pastes it verbatim, guideline numbers included. Output is a rejection diagnosis: the guideline, root cause, fix plan and resubmission checklist, ending on the reply draft (or the appeal) the User pastes back into App Review's message thread in App Store Connect.
Gather
- The pasted rejection — guideline number(s), the device and OS App Review tested on, any screenshot or step they attached. When the paste lacks the guideline number, infer it from the wording using the guideline map and flag the inference.
read_context— what the app does, business model (subscription, one-time, free), login model, third-party integrations, the current version and what changed in it when the Foundation doc records releases.connector_asc_localizationswhen the ASC Connector exists — the latest version and the listing text of every Locale: the metadata fields a metadata rejection points at. Without it,app_store_listinggives the public description and current version, and the diagnosis says the private fields were unverified.- The listing the rejection names: when it is 2.3.x (metadata accuracy), the description from
app_store_listing; the screenshots fromconnector_asc_screenshots, looked at withview_image; when it is 3.1.x, the in-app purchases and subscriptions fromconnector_asc_in_app_purchases. fetch_urlon the privacy policy URL when the rejection is 5.1.x — reachable, app-specific, matches the data the app collects. Flagged untrusted.
Diagnose
Classify before writing anything. The guideline-to-bucket map and the per-guideline fix playbook are in references/guideline-map.md; read it for the guideline(s) in the paste. Record:
- Guideline and bucket — performance, metadata, business, design, spam, privacy, legal.
- Root cause — one paragraph in plain English, distinguishing what App Review saw from what the app does.
- Severity — low (metadata or a string), medium (a flow or a screen), high (4.3 spam, 3.1.1 payments, 4.2 minimum functionality: the product itself).
- Path — fix and resubmit, reply with reproduction information, or appeal. The decision table is in
references/reply-and-appeal.md; appeals go to the App Review Board and take five to ten business days, so a fix is the default whenever the guideline was applied correctly.
Draft
Templates for the reply, the appeal and the expedited-review request are in references/reply-and-appeal.md; read it when drafting. The reply acknowledges the guideline, lists the changes made, references the new build number, and carries demo credentials and test steps whenever a reviewer could need them. An expedited request is drafted only for a critical bug, a security fix or a dated event.
Output: rejection diagnosis
- Rejection — guideline(s), bucket, severity, path.
- Root cause — the paragraph.
- Fix plan — code changes, metadata changes (App Store Connect fields, each by name), configuration changes (Info.plist strings, entitlements, privacy labels), estimated effort. Metadata changes are Outputs the User applies.
- Resubmission checklist — tested on the device and OS App Review named, demo account verified, build number incremented, privacy labels match, reply posted, expedited request when justified.
- If rejected again — the next escalation step.
- Prevent — the pre-submission checks from the guideline map that this rejection makes relevant.
- Reply draft — the message for App Review, or the appeal when the path is appeal, ready for the User to paste back.
Done when every guideline in the paste has a bucket, a root cause and a fix, the reply references a build number and demo access, and the diagnosis names the data it lacked (review status, private metadata) when the ASC Connector was absent.
Related Skills
metadata-optimization— rewriting the description or screenshots text after a 2.3.x rejection.screenshot-optimization— screenshots that match the binary after 2.3.10.subscription-lifecycle— the subscription disclosures 3.1.2 requires.aso— listing health before the next submission.
What it discloses
The Skill reads these files only when it needs them, so the model spends nothing on them the rest of the time.
references/guideline-map.md
references/reply-and-appeal.md
Someone is asking for what you built today.
On Reddit, on X, in ChatGPT's answers. Kwern finds them every morning and drafts the reply in your voice; you decide what goes out.