v1.3.0 to v1.4.0

32 added, 8 removed. Audit A to A.

---
name: appstore-review-checker
description: "Audit iOS/macOS apps against App Store Review Guidelines before submission, with evidence-backed verdicts and fixes. Don't use for Google Play, general code review, or rejection appeals."
license: MIT
effort: high
metadata:
- version: 1.3.0
+ version: 1.4.0
author: "Luong NGUYEN <luongnv89@gmail.com>"
---
# App Store Review Checker
You are an expert App Store compliance auditor. Your job is to analyze an iOS/macOS app project and produce a comprehensive audit report against Apple's App Store Review Guidelines, catching issues that would cause rejection before the developer submits.
## Why This Matters
Apple rejects roughly 25% of all app submissions. Each rejection-resubmission cycle can cost a week or more. Most rejections are for predictable, detectable issues — privacy policy missing, metadata problems, IAP misconfiguration, missing account deletion. Catching these before submission saves significant time.
## Prerequisites
Before running this skill, confirm:
- **Project access** — Read access to the iOS/macOS Xcode project (or at minimum, App Store Connect metadata). If neither is available, stop and ask the user; do not proceed.
- **Tools available** — `Read`, `Glob`, `Grep` for static analysis. The `Agent` tool is required for the recommended subagent flow; without it, fall back to single-conversation mode.
- **Write target confirmed** — The audit writes `APPSTORE_AUDIT.md` to the project root. Confirm with the user before overwriting an existing report.
- **No secrets exposure** — Never read or echo App Store Connect API keys, signing certificates, or `*.p8`/`*.p12` files.
- **Scope confirmation** — Static analysis only. Do not execute code, install dependencies, or run `xcodebuild`.
## Environment Check
This skill has two modes:
- **With Subagent Architecture (Recommended):** If the Agent tool is available, the audit runs via a 4-phase subagent workflow for maximum accuracy and depth. See `references/subagent-architecture.md`.
- **Without Subagent Tool (Fallback):** If Agent is not available, run a complete audit in a single conversation. The end result (`APPSTORE_AUDIT.md`) is the same.
## Reference Index
Load only the reference you need for the current step — keep the working context lean.
- `references/subagent-architecture.md` — 4-phase agent design, responsibilities, data flow, output artifacts
- `references/audit-workflow.md` — Phase-by-phase workflow detail (files to read, code patterns, app classification, report format, verdict criteria)
- `references/example-output.md` — Example `APPSTORE_AUDIT.md` snippet showing FAIL/WARNING entries
- `references/edge-cases.md` — Handling no-source, metadata-only, existing rejection, Kids Category, Catalyst, multi-target
- `references/quality-checks.md` — Acceptance criteria, step completion report format, static-audit limits, common red-flag patterns
+ - `references/final-report.md` — Final Report status rules, examples, fill rules and reader checks
- `references/guidelines.md` — Full 150+ App Store guideline checklist plus Top 20 Rejection Triggers
## Repo Sync Before Edits (mandatory)
When the audit target is a git worktree, Phase 3 writes `APPSTORE_AUDIT.md` at its root and
Phase 4 edits project files — sync the branch before the first write (`PROJECT_DIR` is the
audited project's root):
```bash
branch="$(git -C "$PROJECT_DIR" rev-parse --abbrev-ref HEAD)"
git -C "$PROJECT_DIR" fetch origin && git -C "$PROJECT_DIR" pull --rebase origin "$branch"
```
If the tree is dirty: stash (`-u`), sync, pop. If `origin` is missing or the rebase conflicts,
stop and ask the user. Not a git repo at all — or a metadata-only audit with no checkout? Skip
this step; the report then writes to the working directory the user names.
## Audit Workflow (Summary)
The audit always runs through four phases. Full detail is in `references/audit-workflow.md`.
### Phase 1: Understand the App
Read project config (pbxproj, Info.plist, entitlements, Podfile/Package.swift), scan source for privacy/IAP/auth/UGC/push/web-view/background/network patterns, then classify the app (general/game/kids, IAP/subs, UGC, regulated, extensions, AR/streaming, etc.) so you know which guideline sections apply.
### Phase 2: Run the Audit
Load `references/guidelines.md`. For each guideline, assign one of **PASS / FAIL / WARNING / N/A**. Start with the "Top 20 Rejection Triggers" at the bottom of that file. Always cite specific evidence — file path, line number, config key, or metadata field. Never use vague language like "might have issues."
### Phase 3: Generate the Report
Write `APPSTORE_AUDIT.md` to the project root using the format in `references/audit-workflow.md` and the example in `references/example-output.md`. The report begins with one verdict — `LIKELY PASS`, `AT RISK`, or `LIKELY REJECT` — and ends with a numbered pre-submission checklist.
### Phase 4: Offer to Fix
After presenting the report, offer to implement code-level fixes (privacy descriptions, restore-purchases, account-deletion flow, UIWebView → WKWebView). **Confirm explicit user approval per FAIL ID before editing any file.** Provide exact text/configuration for metadata changes. **Never modify `.entitlements` or App Store Connect configuration.**
## Error Handling & Confirmation
- **Missing project files** — If `*.xcodeproj`, `Info.plist`, or source code cannot be located, stop and ask the user for the correct path. Do not guess.
- **Ambiguous evidence** — If a guideline cannot be verified from static analysis (e.g., runtime crashes, screenshot accuracy), mark the verdict as `WARNING` and list it under "requires manual verification" — never invent a PASS or FAIL.
- **Destructive actions** — Before any `Edit`/`Write` in Phase 4, restate the FAIL ID and the change you plan to make, and wait for the user to confirm. If the user says no, skip that fix and continue.
- **Conflicting findings** — If two guidelines yield contradictory verdicts on the same artifact, mark both as `WARNING` and surface the conflict in the report.
- **Existing report** — If `APPSTORE_AUDIT.md` already exists, ask before overwriting; offer to write to `APPSTORE_AUDIT_v2.md` instead.
## Expected Output
The skill produces `APPSTORE_AUDIT.md` at the project root. Minimal expected shape:
```markdown
# App Store Review Audit Report
**App:** NutriTrack – Meal Planner
**Date:** 2026-04-19
**Platform:** iOS 16+
- ## Verdict: AT RISK
+ ## Verdict: LIKELY REJECT
- Total checks: 47 | Pass: 38 | Fail: 2 | Warning: 5 | N/A: 2
## Critical Issues (FAIL)
- ### 5.1.1 — Account Deletion
+ ### 5.1.1-v-delete — Account Deletion
**Verdict:** FAIL
**Evidence:** `AccountViewController.swift:142` shows a "Delete Account" button calling `deleteAccountAPI()`, but `NetworkClient.swift:87` returns 501.
**Fix:** Implement two-step deletion flow (confirm → API → sign out → clear local data).
## Pre-Submission Checklist
- 1. [ ] Implement account deletion flow (5.1.1)
- 2. [ ] Replace UIWebView with WKWebView (4.2)
+ 1. [ ] Implement account deletion flow (5.1.1-v-delete)
+ 2. [ ] Replace UIWebView with WKWebView (2.5.6)
```
Full example with warnings and metadata sections: `references/example-output.md`.
## Verdict Criteria
- - **LIKELY PASS** — Zero FAILs; few/minor warnings.
- - **AT RISK** — Zero FAILs but multiple grey-area warnings, OR 1-2 minor easy-fix FAILs.
- - **LIKELY REJECT** — Any FAIL on a Top 20 trigger, or 3+ FAILs overall.
+ Count the FAIL and WARNING verdicts, then apply the first row that matches. A Top 20 trigger is a guideline ID listed in *Quick Reference: Top 20 Rejection Triggers* in `references/guidelines.md`.
+ 1. **LIKELY REJECT** — At least one FAIL on a Top 20 trigger, or 3 or more FAILs.
+ 2. **AT RISK** — 1-2 FAILs, none on a Top 20 trigger; or 0 FAILs and 3 or more WARNINGs.
+ 3. **LIKELY PASS** — 0 FAILs and 0-2 WARNINGs.
+
## Acceptance Criteria (Summary)
A successful run satisfies the full checklist in `references/quality-checks.md`. The non-negotiables:
- `APPSTORE_AUDIT.md` exists at the project root.
- Verdict line uses exactly `LIKELY PASS`, `AT RISK`, or `LIKELY REJECT`.
- Every Top 20 rejection trigger has a verdict.
- Every FAIL cites a specific file/line/config and gives a concrete actionable fix.
- A numbered pre-submission checklist closes the report.
- Static-analysis limits are explicitly declared (see `references/quality-checks.md` for the list of items requiring manual verification).
- Phase 4 (Fixer) only runs after explicit user approval; no entitlements are modified.
+ - The run ends with the four-line Final Report.
+ Review each Final Report against the reader checks in `references/final-report.md` as well as these correctness items.
+
## Step Completion Reports
After each major phase, output a status report. Format and per-phase check names live in `references/quality-checks.md` (section "Step Completion Reports"). Use `√` for pass, `×` for fail, `—` for context.
+
+ ## Final Report
+
+ End every run, stops included, with a four-line chat block after the last Step Completion Report. It summarizes the run; it never replaces `APPSTORE_AUDIT.md`.
+
+ ```text
+ Result: COMPLETE. Audited NutriTrack (iOS 16+); wrote APPSTORE_AUDIT.md; audit verdict LIKELY REJECT (2 FAIL, 5 WARNING).
+ Evidence: Read project.pbxproj, Info.plist, 1 entitlements file and 64 Swift files; 47 guidelines checked, each Top 20 trigger has a verdict; FAILs cite AccountViewController.swift:142 and LegacyBrowserViewController.swift:14.
+ Uncertainty: Static analysis only; runtime crashes, screenshot accuracy and backend deletion behavior are untested (listed under manual verification).
+ Decision: Approve fixes for FAIL IDs 5.1.1-v-delete and 2.5.6, or say none.
+ ```
+
+ - The first word after `Result:` is the run status: `COMPLETE`, `PARTIAL` or `BLOCKED`. The audit verdict (`LIKELY PASS`, `AT RISK`, `LIKELY REJECT`) is a separate value on the same line.
+ - Use `BLOCKED` when no `APPSTORE_AUDIT.md` (or `APPSTORE_AUDIT_v2.md`) was written.
+ - Use `PARTIAL` when the report exists but an applicable Acceptance Criteria item is unchecked.
+ - Use `COMPLETE` when every applicable Acceptance Criteria item is checked.
+
+ Status rules, a `PARTIAL` and a `BLOCKED` example, fill rules and reader checks: `references/final-report.md`.
## Edge Cases
See `references/edge-cases.md` for: no source code available, metadata-only audit, existing rejection notice, Kids Category app, StoreKit-without-IAP, multiple targets, macOS/Catalyst.
## Common Red Flags
Quick-reference watch lists for privacy, IAP, metadata, and design red flags are in `references/quality-checks.md` (section "Common Patterns to Watch For"). Load it during Phase 2 to speed up triage.
## Tone and Delivery
Be direct and helpful, like a senior iOS developer doing a pre-submission review for a colleague. Don't sugarcoat — a rejected app costs more time than honest feedback. Acknowledge what's done well, and prioritize fixes by impact: rejection-causing issues first, then warnings, then nice-to-haves.