This audit enumerates every Apple App Store Review Guidelines subsection — 5 sections, 137 sub-IDs — against SHOT Clubhouse v1.1.25 (Capacitor 6 + React 18 + Vite), the build currently sitting on TestFlight against submission f7d9526a. Each subsection received a finding (with severity tier) or an explicit "not applicable" entry. No silent skips.
| Section | HIGH | BORDERLINE | SPECULATIVE | PASS | NA |
|---|---|---|---|---|---|
| §1 Safety | 3 | 6 | 7 | 0 | 9 |
| §2 Performance | 3 | 9 | 8 | 9 | 27 |
| §3 Business | 0 | 4 | 1 | 0 | 7 |
| §4 Design | 0 | 0 | 0 | 0 | 25 |
| §5 Legal | 1 | 5 | 0 | 19 | 9 |
The 7 HIGH findings collapse to three distinct root issues plus one policy-reminder. The three actionable risks below are recommended blockers for v1.1.26 resubmission.
showInNav: true.src/routes/lockerRoutes.ts:47-65, src/routes/protectedRoutes.ts:129-136) until the features ship, or remove the routes entirely from production builds.info@ (Privacy), support@ (Terms/Delete/Checkout), contact@ (Consent/Coach). Apple emails the wrong one and gets no reply → rejection per feedback_apple_review_bundle_one_resubmit.support@shotclubhouse.com matches Terms + ASC Support URL). Migrate the 9 file:line references via shared constant.src/pages/PrivacyPolicy.tsx §8 with category + jurisdiction. Add §6 retention text. ASC App Privacy schema must mirror.The 4th HIGH (1.3 Made for Kids must stay NO) is a non-action policy reminder — current declaration is correct and structurally must persist while PostHog/Sentry/RevenueCat remain in the binary. Codify in publishing skill checklist.
Per goal §3 (drop-in autonomous prompt), the audit ran in four passes, parallelised where independent.
src/, ios/App/App/Info.plist, capacitor.config.ts, package.json using Glob + Grep + ast-grep + Read. Every finding carries a file:line citation. JSON output per section in findings/section-N.json.src/AppRoutes.tsx, src/routes/protectedRoutes.ts, src/routes/publicRoutes.ts identified which findings are reachable by a logged-in coach reviewer.https://app.shotclubhouse.com (the same React bundle the iOS Capacitor app loads). Cold incognito context per URL, 7-second settle, no interaction. Captured cookies, network requests to tracker domains (posthog, sentry.io, clarity.ms etc), localStorage. Compared baseline vs ?att=denied handoff. Wall-time 3 minutes._consolidated.json. Final tier counts above reflect post-review state.Edge functions, marketing site (shotclubhouse.com + pulse.shotclubhouse.com), Android, and CI tooling were explicitly out of scope per goal §2.2. See §5 below.
src/features/pulse/components/comments/ReportCommentSheet.tsx:1-213 src/features/pulse/components/comments/BlockUserConfirmSheet.tsx:1-184 src/features/announcements/components/moderation/ReportSheet.tsx:1-150 src/features/pulse/hooks/useComments.ts:469-493 src/hooks/useBlockedUsers.ts:1-50 src/pages/PrivacyPolicy.tsx:215 +2 moredocs/apple-app-store-submission.md:115-125 src/foundation/auth/guards/MinorAccountGuard.tsx:22-23 src/foundation/auth/guards/MinorAccountGuard.tsx:81-100 src/components/consent/ConsentBanner.tsx:1 src/utils/attWebHandoff.ts:1 src/pages/PrivacyPolicy.tsx:215 src/pages/PrivacyPolicy.tsx:366 src/pages/TermsOfService.tsx:169 src/pages/DeleteAccount.tsx:154 src/pages/DeleteAccount.tsx:274 src/pages/consent/ConsentBlockedPage.tsx:207 +5 moresrc/features/pulse/hooks/useComments.ts:469-493 src/features/pulse/components/comments/ReportCommentSheet.tsx:9-14 src/features/announcements/components/moderation/ReportSheet.tsx:24-55 src/features/announcements/components/editor/FileUploader.tsx:8-19 src/features/announcements/services/uploadService.ts:1 src/features/announcements/components/editor/FileUploader.tsx:8-19 src/features/announcements/services/uploadService.ts src/hooks/useBlockedUsers.ts:12-23 src/features/announcements/components/moderation/ContentActionsMenu.tsx:1-80 src/features/alex/components/AlexHeader.tsx:119-124 src/features/alex/components/AlexChatPanel.tsx:684 src/features/alex/config/quickChips.ts:1-100 src/pages/Account.tsx:1-100 src/features/pulse/components/comments/CommentInput.tsx:1 src/features/announcements/components/comments/CommentSection.tsx:1 src/features/alex/components/AlexHeader.tsx:119-124 src/features/alex/config/quickChips.ts:118-244 src/features/assess/components/PlayerIntensitySelector.tsx:25-40 src/features/alex/config/quickChips.ts:130 src/features/pulse-v2/components/detail/PulseArticleBody.tsx:1-50 src/features/announcements/components/editor/AnnouncementEditor.tsx:1 src/features/alex/config/quickChips.ts:285 src/features/assess/components/PostEventDataForm.tsx:1 src/foundation/auth/guards/MinorAccountGuard.tsx:22-100 src/lib/supabase.ts:1 ios/App/App/Info.plist:27-50 .agents/MEMORY.md:RLS Performance src/utils/attWebHandoff.ts:1 src/pages/PrivacyPolicy.tsx:20-38 src/routes/lockerRoutes.ts:47-60 src/components/ComingSoonWithNav.tsx:16-18 src/components/ComingSoon.tsx:1-44 src/routes/protectedRoutes.ts:129-136 src/pages/Rewards/ComingSoon.tsx:41-94 src/components/StandardHeader.tsx:209 src/components/v2/AppHeaderV2.tsx:142 src/components/v2/nav-drawer.tsx:111 src/routes/lockerRoutes.ts:47-65 src/routes/protectedRoutes.ts:129-136 src/pages/Paywall/index.tsx:7,20,32,57,436,460-463 package.json:134 ios/App/App/Info.plist:8 capacitor.config.ts:5 package.json:4 src/features/alex/hooks/useAlexEnabled.ts:36-37 src/AppRoutes.tsx:147 src/vite-env.d.ts:44 package.json:134 ios/App/App.xcodeproj/project.pbxproj:404,425 ios/App/App/Info.plist:78-84 ios/App/App.xcodeproj/project.pbxproj:404,425 ios/App/App.xcodeproj/project.pbxproj:396,418 src/routes/components.ts:6-51 src/components/SignIn.tsx:473-475 src/pages/section/Coach/supporting/ClubManagement/components/ClubLocationFilter.tsx:117-118 ios/App/App/Info.plist:52-59 src/components/SignIn.tsx:471-475 package.json:103 src/utils/trackingPermission.ts:194-212 ios/App/App/Info.plist:60-63 ios/App/App/AppDelegate.swift:1-50 package.json:101-113 ios/App/App/Info.plist:27-50 ios/App/ No HIGH or BORDERLINE findings in this section. All subsections rated PASS or not applicable. See findings/section-4.json for the complete enumeration.
src/pages/PrivacyPolicy.tsx:245 src/services/RevenueCatService.ts:1 supabase/functions/email-queue-processor/index.ts:130 src/contexts/EnhancedShoppingCartContext.tsx:1 src/features/locker/pages/checkout/CheckoutLauncher.tsx:9 src/pages/PrivacyPolicy.tsx:195 src/pages/PrivacyPolicy.tsx:145 src/pages/PrivacyPolicy.tsx:220 src/utils/analyticsGate.ts:53 src/hooks/useAnalyticsGate.ts:72 src/utils/cookieManager.ts:129 src/foundation/auth/guards/MinorAccountGuard.tsx:41 src/features/alex/components/AlexLauncher.tsx:42 src/pages/PrivacyPolicy.tsx:182 package.json:1 src/pages/PrivacyPolicy.tsx:309 src/utils/cookieManager.ts:41 src/:1 src/utils/sentry.ts:75 .agents/MEMORY.md:1 PASS — the 5.1.1(iv) regression path is closed at the bundle layer. Cold-load of ?att=denied: 0 tracker requests, 0 tracker cookies, 0 PostHog/Sentry init. sessionStorage['shot-att-web-handoff-status'] = 'denied' persisted for same-tab navigations.
The marketing site uses a separate PostHog project key (phc_CTrArQPcH…) and has no ATT URL-param gate. Cookie ph_phc_CTrArQPcH…_posthog drops on .shotclubhouse.com parent-domain pre-consent. If the iOS app ever opens a marketing URL in external Safari, this leaks. Per publish skill memory, the only known iOS entry point was the Coach Guide tile (already hidden on iOS in v1.1.11 fix). Confirm no other marketing-site links survive in v1.1.25.
/redeem/start fires 5 Sentry envelope POSTs before redirecting to /login?returnTo=%2Fredeem (vs 2 on most pages) — suggests unhandled errors during the auth-gated redirect..shotclubhouse.com with no consent gate on web — likely fine for GDPR if disclosed in privacy policy, but worth confirming.Full per-URL JSON dumps + audit.js script live at findings/playwright/. Replayable.
Five rejections across three review cycles inform the HIGH-tier weighting in this audit.
| Submission | Version | Guideline | Apple's wording (short) | Fixed in | Audit re-verified at v1.1.25 |
|---|---|---|---|---|---|
c7133e77 | v1.1.8 | 2.3.2 | IAP promotional image showed price text | v1.1.10 (ASC metadata) | NA at code level; ASC discipline |
c7133e77 | v1.1.8 | 3.1.2(c) | Subscription page missing EULA + Privacy links | v1.1.10 (SubscriptionLegalDisclosure) | ✓ PASS — Section 3 finding 3.1.2(c) |
c7133e77 | v1.1.8 | 2.1(a) | Cart error on SHOT OG Cap variant | v1.1.10 (ShadowProductDetail / QuickAdd) | ✓ PASS — Section 2 finding |
c7133e77 | v1.1.8 | 5.1.1(v) | Registration required to browse Locker | v1.1.10 (public locker routes) | ✓ PASS — Section 5 finding |
f7d9526a | v1.1.10 | 5.1.1(iv) | Cookies dropped after ATT denied via external Safari handoff | v1.1.11 (URL-param gate); v1.1.21 (5 more handoffs covered) | ✓ PASS — Section 5 finding + Playwright runtime confirms |
| n/a | v1.1.12 | 2.2 | "Beta Feedback" framing on first-launch surface | v1.1.21 (rebrand, hide Experimental tab) | ✓ PASS — verified at commit ec734fea9 |
Pattern observation: Apple has surfaced one previously-unflagged guideline per submission cycle (2.3.2/3.1.2(c)/2.1(a)/5.1.1(v) → 5.1.1(iv) → unflagged so far). This audit's purpose is to enumerate the next-unknown-unknown before resubmission so the next cycle either ships or rejects on something already on the radar.
| Scope | Why excluded | Risk if affected |
|---|---|---|
Supabase edge functions (supabase/functions/**) | Server-side; Apple reviewer cannot inspect | Indirect — affects what loads on app launch (paywall offerings, moderation, Alex). Out of scope per goal §2.2. |
Marketing site (shotclubhouse.com, pulse.shotclubhouse.com) | Separate origin, separate bundle, separate PostHog project | Confirmed by Playwright probe to have NO ATT gate — if iOS app opens a marketing URL, 5.1.1(iv) leak. Coach Guide link to shotclubhouse.com/guides was hidden on iOS in v1.1.11; re-verify no other marketing links exist in v1.1.25. |
Android (android/**) | Goal scope = Apple only | None — Play Store has different review surface. |
CI / build tooling (scripts/**, .github/**, .agents/**) | Never reaches Apple reviewer | None directly. Reviewer sees the IPA, not the pipeline. |
77 subsections were rated NA. Each row below is a one-line justification so the audit trail is complete (no silent skips, per goal §2.1).
1.1.2 | SHOT is a youth sports coaching app; no violent content, no in-game enemies, no animal imagery. No surface engages this guideline. |
1.1.3 | No weapons / firearms / dangerous-object content. Grep across src/ shows zero substantive hits for 'firearm', 'weapon', 'gun' (only a Sidelines widget ID string '_J656cRuavCevbGUN' — false positive). |
1.1.5 | No religious content surface. SHOT scope is sports performance coaching. |
1.1.7 | No newsjacking / current-events monetisation surface. Pulse content pipeline is editorial sports news rewritten by Gemini (out-of-scope edge functions); no SHOT product surface exploits violent conflicts or epidemics. |
1.2.1 | SHOT has no creator-economy surface. Pulse articles are AI-rewritten editorial from external news sources, not creator-authored. Alex is a single first-party AI persona, not a creator marketplace. No tipping, no creator |
1.4.2 | No drug-dosage calculator. SHOT does not handle medications. |
1.4.3 | Zero substantive content references to tobacco, vape, alcohol, cannabis, or controlled substances. Verified via grep across src/. Youth-sports product scope. |
1.4.4 | No DUI, driving, or location-checkpoint surface. SHOT has no navigation or mapping feature beyond event location strings. |
1.7 | SHOT is not a crime-reporting app. No surface engages law-enforcement reporting. The in-app Report flows (ReportCommentSheet, announcements ReportSheet) target content moderation only, not criminal activity. |
2.1(c) | Apple's published 2.1 text has only (a) and (b) sub-bullets per source file lines 233-237. Listed here per audit checklist completeness; no separate (c) exists. |
2.1(d) | Same as 2.1(c) — no (d) sub-bullet in published guideline. |
2.1(e) | Same as 2.1(c) — no (e) sub-bullet in published guideline. |
2.1(f) | Same as 2.1(c) — no (f) sub-bullet in published guideline. |
2.2 | SHOT is shipped on the production App Store, not as TestFlight-only beta. TestFlight is used internally for pre-release validation per `.claude/skills/publish/`. 2.2 does not apply to production App Store submissions. |
2.3.3 | Screenshots are configured in App Store Connect, not in the code repo. Cannot be audited here. |
2.3.4 | App previews are ASC-side. No video assets in repo. |
2.3.5 | Category is set in ASC. Not auditable from code. (SHOT lists under Sports per ASC.) |
2.3.6 | Age rating questionnaire is filled in ASC. Per project memory `feedback_apple_age_rating_locate_semantics`, the questionnaire-side has been audited separately. The code itself does not gate on ASC age rating; COPPA flow |
2.3.7 | App name 'SHOT' (Info.plist:8) and bundle id `com.shotclubhouse.shot` (pbxproj:400) are stable. Keywords are ASC-side. No code-level concern. |
2.3.8 | Icon assets and screenshots are ASC-side. App icons in `ios/App/App/Assets.xcassets` are sport-themed and 4+-appropriate. No code surface affects this. |
2.3.9 | Screenshots and rights are ASC-side. Demo account `coach@shotclubhouse.com` (per CLAUDE.md) is a controlled SHOT account, not a real person's data — satisfies the 'fictional account information' requirement. |
2.3.11 | SHOT is in active live release, not pre-order. 2.3.11 does not apply. |
2.3.13 | SHOT does not use App Store in-app events as a marketing surface. No event metadata in ASC for the SHOT app. |
2.4.3 | SHOT is not an Apple TV app. tvOS target is not in the Xcode project. |
2.4.5 | SHOT is iOS-only. Not distributed via Mac App Store. |
2.5.3 | SHOT is a sport club management app. No malware, no destructive payloads, no abuse of Push Notifications (push handler enqueues local notifications + navigates — does not damage system). Static review of `src/foundation/ |
2.5.7 | Apple guidelines text line 333: 'Intentionally omitted.' |
2.5.8 | SHOT does not create a home-screen-replacement environment. It is a single-purpose sport club app. |
2.5.10 | Apple guidelines text line 339: 'Intentionally omitted.' |
2.5.11 | SHOT does not integrate SiriKit or Shortcuts. No Intents.framework, INExtension, or AppIntents in iOS code. No NSUserActivity types registered for shortcut donation. |
2.5.12 | SHOT does not use CallKit or include an SMS fraud extension. No CallDirectoryExtension, IdentityLookup, or MessagingExtension targets in the Xcode project. |
2.5.13 | SHOT does not use facial recognition for account authentication. Email/password + Supabase magic-link is the auth method. No Face ID / Touch ID / ARKit-based biometric login flow in code. |
2.5.15 | SHOT does not present a generic file picker. Uploads are scoped to photo library (Camera plugin) for profile pictures — Apple's standard PHPicker handles Files app integration automatically. No custom Document Picker UI. |
2.5.17 | SHOT does not integrate Matter / smart-home device pairing. Not a home automation app. |
2.5.18 | SHOT does not display third-party advertising. No GoogleMobileAds (`react-native-google-mobile-ads`), AppLovin, Unity Ads, or banner-ad SDKs in package.json. App is a subscription + in-app purchase business model, not ad |
3.1.3(a) | SHOT is a SAAS membership app for sports clubs, not a reader app for magazines/newspapers/books/audio/music/video. The 'Already a member of a club?' iOS card uses Reader-Rule visual shape conservatively but SHOT is not c |
3.1.3(c) | SHOT serves consumer users (athletes, parents, coaches) and household subscriptions, not enterprise/organizational license sales. Memberships are individual or family-shared (childLimit: 3 children per membership in src/ |
3.1.3(d) | SHOT does not facilitate paid real-time person-to-person services between users. No tutoring marketplace, no 1:1 coaching consultations charged through the app, no real-estate tours, no fitness training booking with paym |
3.1.3(f) | SHOT is not a free stand-alone companion to a paid web tool. SHOT has its own in-app purchase (RevenueCat IAP for memberships) so 3.1.3(f) explicitly does not apply — the rule is for free apps with NO purchasing inside t |
3.1.3(g) | SHOT is not an advertising management app for advertisers to purchase ad campaigns. Pulse V2 has 'Sponsored Drop' cards (DropCard.tsx) — but these DISPLAY ads/sponsored content to end-users, they do not let advertisers b |
3.1.4 | SHOT does not unlock functionality based on synced hardware. No telescope, sensor, fitness band, or other physical device integration that gates app features. The free 'Premium SHOT Cap' bundled with yearly subscription |
3.1.5 | Grep verified: no Bitcoin/Ethereum/wallet/mining/exchange/ICO references in source code. The only 'crypto' matches are crypto.subtle (Web Crypto API for hashing/random) and crypto-js (utility for hashing). The 'nft_metad |
4.1 | SHOT is an original multisport athlete-development product (custom UX: evaluations framework, Pulse content feed, Locker commerce via Shopify, Membership via Stripe, Alex chatbot). Bundle ID com.shotclubhouse.app, displa |
4.2 | SHOT well exceeds 'repackaged website' threshold. Substantive native-shell capability surfaces: push notifications (CapacitorPushService), camera/photo library (Info.plist:52-57), ATT identifier (Info.plist:58-59), Fireb |
4.2.1 | SHOT does not use ARKit. No @capacitor-community AR plugins, no ARKit-related Swift code, no NSCameraUsageDescription mentions AR. Camera usage is for profile pictures (Info.plist:52-53). |
4.2.3 | (i) App functions without requiring another app to be installed — Capacitor self-contained, login is email/password against Supabase. (ii) No initial-launch large downloads: bundle is fully baked into the IPA (vite build |
4.2.4 | Apple guideline 4.2.4 is intentionally omitted (apple-guidelines.txt:524). |
4.2.5 | Apple guideline 4.2.5 is intentionally omitted (apple-guidelines.txt:526). |
4.2.6 | SHOT is a fully custom build (Vite + React + Capacitor 6 + custom Supabase backend + bespoke evaluations framework). No template-generation service or white-label generator. Repo shows hand-authored components, custom de |
4.2.7 | SHOT is not a remote-desktop / screen-mirroring client. No VNC/RDP/streaming protocol code, no screen capture/share of a host device. Self-contained sports productivity app. |
4.3 | Single bundle ID com.shotclubhouse.app (capacitor.config.ts:5; ios/App/App/Info.plist:11). Not in a saturated low-quality category — substantive athlete-development product with multi-role surfaces (coach/parent/athlete/ |
4.4 | SHOT ships zero extensions. ios/App/App/Info.plist contains no NSExtension dict. No .appex bundles found under ios/App/. Single app target — no keyboard extension, no Safari extension, no Action/Share/Today/Widget extens |
4.4.1 | No keyboard extension target. No NSExtensionPointIdentifier=com.apple.keyboard-service in Info.plist. |
4.4.2 | No Safari app extension or web extension. No SafariServices target. |
4.4.3 | Apple guideline 4.4 enumerates 4.4.1 and 4.4.2 only; no 4.4.3 substantive content in current guidelines text (apple-guidelines.txt:556-570). |
4.5 | Parent category — see sub-rules. No misuse of apple.com / iTunes / App Store / developer-portal data observed. |
4.5.1 | SHOT does not scrape Apple sites or use iTunes Store RSS feeds. No fetches to apple.com / itunes.apple.com / appstoreconnect.apple.com from src/. |
4.5.2 | SHOT does not integrate MusicKit. No StoreKit MusicKit calls, no NSAppleMusicUsageDescription in Info.plist, no music playback features. |
4.5.3 | SHOT does not integrate Game Center (no GKLocalPlayer / GameKit code). Push Notifications are used for legitimate user-targeted in-app events (training reminders, evaluation results, announcements) via FCM, not for unsol |
4.5.4 | (a) Push is not required for the app to function — login flow works without push permission (UpdatedLoginV2.tsx has no push gate). (b) Push permission requested via standard iOS prompt at runtime through Capacitor PushNo |
4.5.5 | No Game Center integration. No display of Player IDs/aliases. |
4.5.6 | SHOT renders emoji via Unicode strings (system font, native rendering). No embedded Apple emoji bitmap font, no use of Apple emoji on web/Android variants in a way that ships Apple glyph assets. |
4.6 | Apple guidelines 4.6 in current text (apple-guidelines.txt:600) reads 'Intentionally omitted.' For completeness re: alternate icons: SHOT ships a single AppIcon.appiconset with one 1024x1024 image (no CFBundleAlternateIc |
4.7.4 | Alex is a single chatbot, not an index of multiple mini-apps. No catalogue surface. 4.7.4 requirement applies to apps offering many third-party mini-apps/games and does not bind a single first-party chatbot. |
4.8 | DEFINITIVE: SHOT does NOT use any third-party / social login service. The only authentication surface is email+password via supabase.auth.signInWithPassword (UpdatedLoginV2.tsx:64, SignIn.tsx:299, ParentConsentPage.tsx:1 |
4.9 | SHOT does NOT use Apple Pay (PassKit). Membership flow uses Stripe hosted checkout (src/features/membership/ + Stripe webhook handler in supabase/functions/). Locker commerce uses Shopify hosted checkout opened in in-app |
4.10 | SHOT does not paywall built-in iOS capabilities. Camera (Info.plist:52-53) is used freely for profile pictures with no charge. Push notifications (Info.plist:60-63) are not behind a paywall — they're feature-gated by use |
5.1.3 | Not applicable. SHOT is a sports/athlete development app — does not access HealthKit, Clinical Health Records, MovementDisorder APIs, or conduct health research. Privacy policy §1B mentions 'Health & Fitness Data: Height |
5.1.4(iii) | Audit is code-only; ASC metadata not in scope. Sweep src for terms: App name in Info.plist is 'SHOT' / 'SHOT Clubhouse' — no 'Kids' or 'Children' in app metadata fields visible to audit. The brand 'SHOT Clubhouse' does n |
5.3 | Not applicable. SHOT is youth sports development, no real-money gaming, no gambling, no lotteries. |
5.3.1 | Not applicable. No sweepstakes/contests surface. |
5.3.2 | Not applicable. |
5.3.3 | Not applicable. RevenueCat IAP gates membership subscription only. |
5.3.4 | Not applicable. |
5.4 | Not applicable. SHOT does not provide VPN services. No NEVPNManager usage. |
5.5 | Not applicable. SHOT does not offer MDM functionality. |
| Term | Meaning |
|---|---|
| ATT | App Tracking Transparency — Apple iOS framework requiring user consent before cross-app tracking. Subject of 5.1.1(iv) rejection. |
| COPPA | Children's Online Privacy Protection Act (US, 1998). Drives SHOT's blocked_underage / provisional_minor / parent_managed account-status model. |
| SIWA | Sign in with Apple. Apple Guideline 4.8 requires it if any third-party login is offered. SHOT compliant — uses only first-party email/password. |
| RevenueCat | Subscription-management SDK wrapping App Store IAP. Apple Receipt-validated server-side. Used for Monthly £5.99 / Yearly £59.99 memberships. |
| Capacitor | Ionic's hybrid framework wrapping a React SPA in a native iOS/Android shell. SHOT runs Capacitor 6. |
| RLS | Row-Level Security in PostgreSQL/Supabase. SHOT's data-isolation model — minor profiles, club membership scoping. |
| Tier HIGH | Either Apple has rejected on this exact guideline previously, OR the literal text maps to a v1.1.25 surface an iPad Air M3 reviewer can reach. |
| Tier BORDERLINE | Surface engages guideline but interpretation is gray. Depends on individual reviewer + region + device. |
| Tier SPECULATIVE | Letter applies, no current evidence Apple cares. Preventative tracking only. |